diff options
author | aiju <devnull@localhost> | 2017-06-27 09:21:30 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2017-06-27 09:21:30 +0000 |
commit | dffbc1e45d61bb928ea6a9d0b1206d641daf24fe (patch) | |
tree | 8a80a3a2c7e964fc89b8776a6dd8326f545a53dc /sys/src/cmd/vmx/io.c | |
parent | b5a6dc7849cbd9f1fd23183ba46f0d5deb24e81d (diff) |
vmx(1): I/O string instructions, incomplete support for IDE disks, misc fixes
Diffstat (limited to 'sys/src/cmd/vmx/io.c')
-rw-r--r-- | sys/src/cmd/vmx/io.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/sys/src/cmd/vmx/io.c b/sys/src/cmd/vmx/io.c index a61347248..b98d2f7ec 100644 --- a/sys/src/cmd/vmx/io.c +++ b/sys/src/cmd/vmx/io.c @@ -7,7 +7,7 @@ #include "dat.h" #include "fns.h" -static uchar cmos[0x30] = { +uchar cmos[0x30] = { [1] 0xff, [3] 0xff, [5] 0xff, [0xa] 0x26, [0xb] 1<<1, @@ -727,6 +727,7 @@ kbdcmd(u8int val) case 0xee: keyputc(0xee); break; /* echo */ default: vmerror("unknown kbd command %#ux", val); + keyputc(0xfe); } } i8042kick(nil); @@ -1124,14 +1125,6 @@ uartinit(int n, char *cfg) } } -static u32int -ideio(int, u16int port, u32int, int, void *) -{ - switch(port & 7){ - case 7: return 0x71; - default: return -1; - } -} /* floppy dummy controller */ typedef struct Floppy Floppy; @@ -1226,6 +1219,7 @@ struct IOHandler { u32int vgaio(int, u16int, u32int, int, void *); u32int pciio(int, u16int, u32int, int, void *); u32int vesaio(int, u16int, u32int, int, void *); +u32int ideio(int, u16int, u32int, int, void *); IOHandler handlers[] = { 0x20, 0x21, picio, nil, 0x40, 0x43, pitio, nil, @@ -1268,8 +1262,8 @@ IOHandler handlers[] = { 0xa79, 0xa79, nopio, nil, /* isa pnp */ }; -u32int -io(int dir, u16int port, u32int val, int size) +static u32int +io0(int dir, u16int port, u32int val, int size) { IOHandler *h; extern PCIBar iobars; @@ -1283,3 +1277,28 @@ io(int dir, u16int port, u32int val, int size) return p->io(dir, port - p->addr, val, size, p->aux); return iowhine(dir, port, val, size, nil); } + +u32int iodebug[32]; + +u32int +io(int isin, u16int port, u32int val, int sz) +{ + int dbg; + + dbg = port < 0x400 && (iodebug[port >> 5] >> (port & 31) & 1) != 0; + if(isin){ + val = io0(isin, port, val, sz); + if(sz == 1) val = (u8int)val; + else if(sz == 2) val = (u16int)val; + if(dbg) + vmdebug("in %#.4ux <- %#.*ux", port, sz*2, val); + return val; + }else{ + if(sz == 1) val = (u8int)val; + else if(sz == 2) val = (u16int)val; + io0(isin, port, val, sz); + if(dbg) + vmdebug("out %#.4ux <- %#.*ux", port, sz*2, val); + return 0; + } +} |