Skip to content

Commit

Permalink
test: add missing test. mainly for serial
Browse files Browse the repository at this point in the history
Signed-off-by: Nobuhiro MIKI <[email protected]>
  • Loading branch information
bobuhiro11 committed Feb 11, 2021
1 parent 3abfc53 commit 1917ed7
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 25 deletions.
6 changes: 2 additions & 4 deletions kvm/kvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -490,8 +490,7 @@ func NewLinuxGuest(bzImagePath, initPath string) (*LinuxGuest, error) {
}

serialIRQCallback := func(irq, level uint32) {
err := IRQLine(g.vmFd, irq, level)
if err != nil {
if err := IRQLine(g.vmFd, irq, level); err != nil {
panic(err)
}
}
Expand All @@ -508,8 +507,7 @@ func (g *LinuxGuest) GetInputChan() chan<- byte {
}

func (g *LinuxGuest) InjectSerialIRQ() {
g.serial.InjectIRQ(0)
g.serial.InjectIRQ(1)
g.serial.InjectIRQ()
}

func (g *LinuxGuest) initRegs() error {
Expand Down
15 changes: 15 additions & 0 deletions kvm/kvm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,3 +262,18 @@ func TestSetMemLogDirtyPages(t *testing.T) {
t.Fatal("unexpected flags")
}
}

func TestIRQLine(t *testing.T) {
t.Parallel()

devKVM, _ := os.OpenFile("/dev/kvm", os.O_RDWR, 0644)
vmFd, _ := kvm.CreateVM(devKVM.Fd())

if err := kvm.CreateIRQChip(vmFd); err != nil {
t.Fatal(err)
}

if err := kvm.IRQLine(vmFd, 4, 0); err != nil {
t.Fatal(err)
}
}
31 changes: 10 additions & 21 deletions serial/serial.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ func (s *Serial) dlab() bool {
return s.LCR&0x80 != 0
}

func (s *Serial) InjectIRQ(level uint32) {
s.irqCallback(4, level)
func (s *Serial) InjectIRQ() {
s.irqCallback(4, 0)
s.irqCallback(4, 1)
}

func (s *Serial) In(port uint64, values []byte) error {
Expand All @@ -52,34 +53,28 @@ func (s *Serial) In(port uint64, values []byte) error {
case port == 0 && s.dlab():
// DLL
values[0] = 0xc // baud rate 9600
fmt.Printf("[IN DLL] value: %#v\n", values)
case port == 1 && !s.dlab():
// IER
values[0] = s.IER
// fmt.Printf("[IN IER] value: %#v\n", values)
case port == 1 && s.dlab():
// DLM
values[0] = 0x0 // baud rate 9600
fmt.Printf("[IN DLM] value: %#v\n", values)
case port == 2:
// IIR
// fmt.Printf("[IN IIR] value: %#v\n", values)
case port == 3:
// LCR
fmt.Printf("[IN LCR] value: %#v\n", values)
case port == 4:
// MCR
fmt.Printf("[IN MCR] value: %#v\n", values)
case port == 5:
// LSR
values[0] = 0x60 // THR is empty
values[0] |= 0x20 // Empty Transmitter Holding Register
values[0] |= 0x40 // Empty Data Holding Registers

if len(s.inputChan) > 0 {
values[0] |= 0x1 // Data available
values[0] |= 0x1 // Data Ready
}
// fmt.Printf("[IN LSR] value: %#v\n", values)
case port == 6:
// MSR
// fmt.Printf("[IN MSR] value: %#v\n", values)
break
}

Expand All @@ -95,30 +90,24 @@ func (s *Serial) Out(port uint64, values []byte) error {
fmt.Printf("%c", values[0])
case port == 0 && s.dlab():
// DLL
fmt.Printf("[OUT DLL] value: %#v\n", values)
case port == 1 && !s.dlab():
// IER
s.IER = values[0]
if s.IER != 0 {
s.InjectIRQ(0)
s.InjectIRQ(1)
s.InjectIRQ()
}
// fmt.Printf("[OUT IER] value: %#v\n", values)
case port == 1 && s.dlab():
// DLM
fmt.Printf("[OUT DLM] value: %#v\n", values)
case port == 2:
// FCR
fmt.Printf("[OUT FCR] value: %#v\n", values)
case port == 3:
// LCR
s.LCR = values[0]
fmt.Printf("[OUT LCR] value: %#v\n", values)
case port == 4:
// MCR
fmt.Printf("[OUT MCR] value: %#v\n", values)
default:
fmt.Printf("factory test or not used\n")
// factory test or not used
break
}

return nil
Expand Down
58 changes: 58 additions & 0 deletions serial/serial_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package serial_test

import (
"testing"

"github.com/nmi/gokvm/serial"
)

func TestNew(t *testing.T) {
t.Parallel()

callback := func(irq, level uint32) {}
s, err := serial.New(callback)
s.GetInputChan()
s.InjectIRQ()

if err != nil {
t.Fatal(err)
}
}

func TestIn(t *testing.T) {
t.Parallel()

callback := func(irq, level uint32) {}

s, err := serial.New(callback)
if err != nil {
t.Fatal(err)
}

// Here the unit test call the function simply.
// It needs to be fixed.
for i := 0; i < 8; i++ {
if err := s.In(uint64(serial.COM1Addr+i), []byte{0}); err != nil {
t.Fatal(err)
}
}
}

func TestOut(t *testing.T) {
t.Parallel()

callback := func(irq, level uint32) {}

s, err := serial.New(callback)
if err != nil {
t.Fatal(err)
}

// Here the unit test call the function simply.
// It needs to be fixed.
for i := 0; i < 8; i++ {
if err := s.Out(uint64(serial.COM1Addr+i), []byte{0}); err != nil {
t.Fatal(err)
}
}
}

0 comments on commit 1917ed7

Please sign in to comment.