From: Peter Dinda Date: Thu, 22 May 2008 19:49:13 +0000 (+0000) Subject: Added generic device, some keyboard fixes (still in progress) X-Git-Tag: boot386puppy-26-to-ide~38 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=028d9b71d4a4e6d49a22ad5904b6dd2f8c596a26 Added generic device, some keyboard fixes (still in progress) --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index c830894..741c1fd 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -1,6 +1,6 @@ # Makefile for GeekOS kernel, userspace, and tools # Copyright (c) 2004,2005 David H. Hovemeyer -# $Revision: 1.34 $ +# $Revision: 1.35 $ # This is free software. You are permitted to use, # redistribute, and modify it as specified in the file "COPYING". @@ -134,7 +134,7 @@ VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o) VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS) -DEVICE_C_SRCS := keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c +DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o) diff --git a/palacios/build/depend.mak b/palacios/build/depend.mak deleted file mode 100644 index 78abffa..0000000 --- a/palacios/build/depend.mak +++ /dev/null @@ -1,279 +0,0 @@ -geekos/idt.o: ../src/geekos/idt.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/idt.h \ - ../include/geekos/int.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h ../include/geekos/debug.h -geekos/int.o: ../src/geekos/int.c ../include/geekos/idt.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h ../include/geekos/debug.h \ - ../include/geekos/cpu.h -geekos/trap.o: ../src/geekos/trap.c ../include/geekos/idt.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/kthread.h \ - ../include/geekos/list.h ../include/geekos/trap.h \ - ../include/geekos/serial.h ../include/geekos/irq.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h ../include/geekos/debug.h -geekos/irq.o: ../src/geekos/irq.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/idt.h ../include/geekos/int.h \ - ../include/geekos/defs.h ../include/geekos/io.h ../include/geekos/irq.h \ - ../include/geekos/debug.h ../include/geekos/serial.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h -geekos/io.o: ../src/geekos/io.c ../include/geekos/io.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h -geekos/blockdev.o: ../src/geekos/blockdev.c ../include/geekos/errno.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/malloc.h ../include/geekos/int.h \ - ../include/geekos/kassert.h ../include/geekos/defs.h \ - ../include/geekos/kthread.h ../include/geekos/list.h \ - ../include/geekos/synch.h ../include/geekos/blockdev.h \ - ../include/geekos/fileio.h -geekos/ide.o: ../src/geekos/ide.c ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/int.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h ../include/geekos/errno.h \ - ../include/geekos/malloc.h ../include/geekos/timer.h \ - ../include/geekos/kthread.h ../include/geekos/list.h \ - ../include/geekos/blockdev.h ../include/geekos/fileio.h \ - ../include/geekos/ide.h -geekos/keyboard.o: ../src/geekos/keyboard.c ../include/geekos/kthread.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/list.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/fmtout.h \ - ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/irq.h ../include/geekos/int.h \ - ../include/geekos/defs.h ../include/geekos/io.h \ - ../include/geekos/keyboard.h -geekos/screen.o: ../src/geekos/screen.c \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - ../include/geekos/io.h ../include/geekos/int.h ../include/geekos/defs.h \ - ../include/geekos/debug.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h -geekos/timer.o: ../src/geekos/timer.c \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/limits.h \ - ../include/geekos/io.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/fmtout.h \ - ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/irq.h \ - ../include/geekos/kthread.h ../include/geekos/list.h \ - ../include/geekos/timer.h ../include/geekos/serial.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/debug.h -geekos/mem.o: ../src/geekos/mem.c ../include/geekos/defs.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/bootinfo.h ../include/geekos/gdt.h \ - ../include/geekos/int.h ../include/geekos/malloc.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/mem.h ../include/geekos/list.h \ - ../include/geekos/paging.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/io.h \ - ../include/geekos/debug.h -geekos/crc32.o: ../src/geekos/crc32.c ../include/geekos/crc32.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/serial.h ../include/geekos/irq.h \ - ../include/geekos/int.h ../include/geekos/defs.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - ../include/geekos/io.h ../include/geekos/debug.h -geekos/gdt.o: ../src/geekos/gdt.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/segment.h ../include/geekos/int.h \ - ../include/geekos/defs.h ../include/geekos/tss.h \ - ../include/geekos/gdt.h ../include/libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/debug.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h ../include/geekos/io.h -geekos/tss.o: ../src/geekos/tss.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/gdt.h \ - ../include/geekos/segment.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/tss.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/int.h ../include/geekos/io.h \ - ../include/geekos/debug.h -geekos/segment.o: ../src/geekos/segment.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/tss.h ../include/geekos/segment.h -geekos/bget.o: ../src/geekos/bget.c ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/bget.h -geekos/malloc.o: ../src/geekos/malloc.c ../include/geekos/screen.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/defs.h ../include/geekos/bget.h \ - ../include/geekos/malloc.h -geekos/synch.o: ../src/geekos/synch.c ../include/geekos/kthread.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/list.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/fmtout.h \ - ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/int.h ../include/geekos/defs.h \ - ../include/geekos/synch.h -geekos/kthread.o: ../src/geekos/kthread.c ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/int.h \ - ../include/geekos/mem.h ../include/geekos/list.h \ - ../include/geekos/paging.h ../include/geekos/bootinfo.h \ - ../include/geekos/symbol.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/kthread.h ../include/geekos/malloc.h \ - ../include/geekos/serial.h ../include/geekos/irq.h \ - ../include/geekos/io.h ../include/geekos/debug.h -geekos/serial.o: ../src/geekos/serial.c ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/int.h \ - ../include/geekos/kassert.h ../include/geekos/screen.h \ - ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h ../include/geekos/reboot.h \ - ../include/geekos/gdt.h ../include/geekos/idt.h -geekos/reboot.o: ../src/geekos/reboot.c ../include/geekos/reboot.h \ - ../include/libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h -geekos/paging.o: ../src/geekos/paging.c ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/idt.h \ - ../include/geekos/kthread.h ../include/geekos/list.h \ - ../include/geekos/mem.h ../include/geekos/paging.h \ - ../include/geekos/bootinfo.h ../include/geekos/malloc.h \ - ../include/geekos/gdt.h ../include/geekos/segment.h \ - ../include/geekos/crc32.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/io.h \ - ../include/geekos/debug.h -geekos/debug.o: ../src/geekos/debug.c ../include/geekos/debug.h \ - ../include/geekos/serial.h ../include/geekos/irq.h \ - ../include/geekos/int.h ../include/geekos/kassert.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/defs.h ../include/geekos/string.h \ - ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/io.h -geekos/main.o: ../src/geekos/main.c ../include/geekos/bootinfo.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/screen.h ../include/geekos/ktypes.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/geekos/mem.h ../include/geekos/defs.h \ - ../include/geekos/list.h ../include/geekos/kassert.h \ - ../include/geekos/paging.h ../include/geekos/crc32.h \ - ../include/geekos/tss.h ../include/geekos/int.h \ - ../include/geekos/kthread.h ../include/geekos/trap.h \ - ../include/geekos/timer.h ../include/geekos/keyboard.h \ - ../include/geekos/io.h ../include/geekos/serial.h \ - ../include/geekos/irq.h ../include/geekos/reboot.h \ - ../include/geekos/ide.h ../include/geekos/malloc.h \ - ../include/geekos/debug.h ../include/geekos/vm.h \ - ../include/geekos/gdt.h ../include/geekos/vmm_stubs.h -common/fmtout.o: ../src/common/fmtout.c \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \ - ../include/geekos/string.h ../include/geekos/../libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/limits.h \ - ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h -common/string.o: ../src/common/string.c ../include/libc/fmtout.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \ - ../include/libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h -common/memmove.o: ../src/common/memmove.c ../include/libc/string.h \ - /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h diff --git a/palacios/include/devices/generic.h b/palacios/include/devices/generic.h new file mode 100644 index 0000000..05d9198 --- /dev/null +++ b/palacios/include/devices/generic.h @@ -0,0 +1,39 @@ +#ifndef __GENERIC_H +#define __GENERIC_H + +#include + +// +// The generic device simply hooks ranges of ports, addresses, and irqs +// if they are not already hooked +// +// for each hooked port, it simply executes reads and writes and the same physical port, +// for each hooked memory range, it simply executes reads and writes on the same +// physical memory addresses +// for each hooked irq, it simply injects the irq into the VM +// +// These operations are also logged to serial (optionaly) +// +// If you attach a generic device *last*, you can capture all ops that are not +// already hooked, and capture a log of VM activity with respect to them. +// +// The effects of using the generic device should be identical to +// doing passthrough I/O, but with logging, and, of course, slower +// + + +// A port range is low..high, inclusive +typedef uint_t generic_port_range_type[2]; +// A memory range is low..high, inclusive +typedef void *generic_address_range_type[2]; +// An interrupt ory map range is low..high, inclusive +typedef uint_t generic_irq_range_type[2]; + +struct vm_device *create_generic(generic_port_range_type port_ranges[], + uint_t num_port_ranges, + generic_address_range_type addess_ranges[], + uint_t num_address_ranges, + generic_irq_range_type irq_ranges[], + uint_t num_irqranges); + +#endif diff --git a/palacios/include/devices/keyboard.h b/palacios/include/devices/keyboard.h index da4c085..bd22b44 100644 --- a/palacios/include/devices/keyboard.h +++ b/palacios/include/devices/keyboard.h @@ -3,7 +3,11 @@ #include - +// +// The underlying driver needs to call this on each key that +// it wants to inject into the VMM for delivery to a VM +// +void deliver_key_to_vmm(uchar_t status, uchar_t scancode); struct vm_device *create_keyboard(); diff --git a/palacios/src/devices/generic.c b/palacios/src/devices/generic.c new file mode 100644 index 0000000..269840e --- /dev/null +++ b/palacios/src/devices/generic.c @@ -0,0 +1,282 @@ +#include +#include +#include +#include + + + +#define GENERIC_DEBUG 1 + +#if GENERIC_DEBUG +#define GENERIC_DEBUG_PRINT(first, rest...) do { SerialPrint(first, ## rest ); } while (0) +#else +#define GENERIC_DEBUG_PRINT(first, rest...) +#endif + + +#define PORT_HOOKS 1 +#define MEM_HOOKS 0 // not yet implmented in device model +#define IRQ_HOOKS 0 // not yet implemented in device model + +extern struct vmm_os_hooks *os_hooks; + +extern void SerialPrint(const char *format, ...); + + + +struct generic_internal { + generic_port_range_type *port_ranges; + uint_t num_port_ranges; + generic_address_range_type *address_ranges; + uint_t num_address_ranges; + generic_irq_range_type *irq_ranges; + uint_t num_irq_ranges; +}; + + + + + + + + +int generic_reset_device(struct vm_device * dev) +{ + GENERIC_DEBUG_PRINT("generic: reset device\n"); + + return 0; + +} + + + + + +int generic_start_device(struct vm_device *dev) +{ + GENERIC_DEBUG_PRINT("generic: start device\n"); + return 0; +} + + +int generic_stop_device(struct vm_device *dev) +{ + GENERIC_DEBUG_PRINT("generic: stop device\n"); + return 0; +} + + + + +int generic_write_port(ushort_t port, + void * src, + uint_t length, + struct vm_device * dev) +{ + uint_t i; + + GENERIC_DEBUG_PRINT("generic: writing 0x"); + for (i=0;ivm->vm_ops.raise_irq(dev->vm,irq,0); + + return 0; + +} + + +int generic_init_device(struct vm_device * dev) +{ + struct generic_internal *state = (struct generic_internal *) dev->private_data; + uint_t i,j; + + GENERIC_DEBUG_PRINT("generic: init_device\n"); + + // Would read state here + + generic_reset_device(dev); + + for (i=0;inum_port_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: hooking ports 0x%x to 0x%x\n",state->port_ranges[i][0],state->port_ranges[i][1]); +#if PORT_HOOKS + for (j=state->port_ranges[i][0]; j<=state->port_ranges[i][1];j++) { + if (dev_hook_io(dev, j, &generic_read_port, &generic_write_port)) { + GENERIC_DEBUG_PRINT("generic: can't hook port 0x%x (already hooked?)\n",j); + } + } +#else + GENERIC_DEBUG_PRINT("generic: hooking ports not supported\n"); +#endif + + } + + for (i=0;inum_address_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: hooking addresses 0x%x to 0x%x\n",state->address_ranges[i][0],state->address_ranges[i][1]); +#if MEM_HOOKS + if (dev_hook_mem(dev, state->address_ranges[i][0],state->address_ranges[i][1])) { + GENERIC_DEBUG_PRINT("generic: Can't hook addresses 0x%x to 0x%x (already hooked?)\n", + state->address_ranges[i][0],state->address_ranges[i][1]); + } +#else + GENERIC_DEBUG_PRINT("generic: hooking addresses not supported\n"); +#endif + + } + + for (i=0;inum_irq_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: hooking irqs 0x%x to 0x%x\n",state->irq_ranges[i][0],state->irq_ranges[i][1]); +#if IRQ_HOOKS + for (j=state->irq_ranges[i][0]; j<=state->irq_ranges[i][1];j++) { + if (dev_hook_irq(dev, j, &generic_interrupt)) { + GENERIC_DEBUG_PRINT("generic: can't hook irq 0x%x (already hooked?)\n",j); + } + } +#else + GENERIC_DEBUG_PRINT("generic: hooking irqs not supported\n"); +#endif + } + + return 0; +} + +int generic_deinit_device(struct vm_device *dev) +{ + struct generic_internal *state = (struct generic_internal *) dev->private_data; + uint_t i,j; + + GENERIC_DEBUG_PRINT("generic: deinit_device\n"); + + for (i=0;inum_irq_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: unhooking irqs 0x%x to 0x%x\n",state->irq_ranges[i][0],state->irq_ranges[i][1]); +#if IRQ_HOOKS + for (j=state->irq_ranges[i][0]; j<=state->irq_ranges[i][1];j++) { + if (dev_unhook_irq(dev, j)) { + GENERIC_DEBUG_PRINT("generic: can't unhook irq 0x%x (already unhooked?)\n",j); + } + } +#else + GENERIC_DEBUG_PRINT("generic: unhooking irqs not supported\n"); +#endif + + } + + for (i=0;inum_address_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: unhooking addresses 0x%x to 0x%x\n",state->address_ranges[i][0],state->address_ranges[i][1]); +#if MEM_HOOKS + if (dev_unhook_mem(dev, state->address_ranges[i][0],state->address_ranges[i][1])) { + GENERIC_DEBUG_PRINT("generic: Can't unhook addresses 0x%x to 0x%x (already unhooked?)\n", + state->address_ranges[i][0],state->address_ranges[i][1]); + } +#else + GENERIC_DEBUG_PRINT("generic: unhooking addresses not supported\n"); +#endif + } + + for (i=0;inum_port_ranges;i++) { + GENERIC_DEBUG_PRINT("generic: unhooking ports 0x%x to 0x%x\n",state->port_ranges[i][0],state->port_ranges[i][1]); +#if PORT_HOOKS + for (j=state->port_ranges[i][0]; j<=state->port_ranges[i][1];j++) { + if (dev_unhook_io(dev, j)) { + GENERIC_DEBUG_PRINT("generic: can't unhook port 0x%x (already unhooked?)\n",j); + } + } +#else + GENERIC_DEBUG_PRINT("generic: unhooking ports not supported\n"); +#endif + + } + + generic_reset_device(dev); + return 0; +} + + + + + +static struct vm_device_ops dev_ops = { + .init = generic_init_device, + .deinit = generic_deinit_device, + .reset = generic_reset_device, + .start = generic_start_device, + .stop = generic_stop_device, +}; + + + + +struct vm_device *create_generic(generic_port_range_type port_ranges[], + uint_t num_port_ranges, + generic_address_range_type address_ranges[], + uint_t num_address_ranges, + generic_irq_range_type irq_ranges[], + uint_t num_irq_ranges) +{ + struct generic_internal * generic_state = os_hooks->malloc(sizeof(struct generic_internal)); + + + generic_state->num_port_ranges=num_port_ranges; + if (num_port_ranges>0) { + generic_state->port_ranges = os_hooks->malloc(sizeof(generic_address_range_type)*num_port_ranges); + memcpy(generic_state->port_ranges,port_ranges,sizeof(generic_port_range_type)*num_port_ranges); + } else { + generic_state->port_ranges=NULL; + } + + generic_state->num_address_ranges=num_address_ranges; + if (num_address_ranges>0) { + generic_state->address_ranges = os_hooks->malloc(sizeof(generic_address_range_type)*num_address_ranges); + memcpy(generic_state->address_ranges,address_ranges,sizeof(generic_address_range_type)*num_address_ranges); + } else { + generic_state->address_ranges=NULL; + } + generic_state->num_irq_ranges=num_irq_ranges; + if (num_irq_ranges>0) { + generic_state->irq_ranges = os_hooks->malloc(sizeof(generic_address_range_type)*num_irq_ranges); + memcpy(generic_state->irq_ranges,irq_ranges,sizeof(generic_irq_range_type)*num_port_ranges); + } else { + generic_state->irq_ranges=NULL; + } + + + struct vm_device *device = create_device("GENERIC", &dev_ops, generic_state); + + return device; +} diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 6c71667..3ef783e 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -3,6 +3,15 @@ #include #include +#define KEYBOARD_DEBUG 1 + +#if KEYBOARD_DEBUG +#define KEYBOARD_DEBUG_PRINT(first, rest...) do { SerialPrint(first, ## rest ); } while (0) +#else +#define KEYBOARD_DEBUG_PRINT(first, rest...) +#endif + + extern struct vmm_os_hooks *os_hooks; extern void SerialPrint(const char *format, ...); @@ -16,22 +25,59 @@ extern void SerialPrint(const char *format, ...); +// The currently targetted keyboard +static struct vm_device *thekeyboard=NULL; + + struct keyboard_internal { - int x; - // figure this out later - it should be the internal state of the keyboard buffer and - // the emulated status, etc. - // which should be fed from the underlying OS and drained via this interface + // read* is what is seen when reads are done from the VM + uchar_t read_status; + uchar_t read_scancode; + // write* is where we put the writes from the VM + uchar_t write_status; + uchar_t write_scancode; + + uchar_t status_byte; // for on-board uC + + uchar_t input_queue; // input queue is for communication *to* the on-board uC + uint_t input_queue_len; // num items queued + uchar_t output_queue; // output queue is for communcation *from* the on-board uC + uint_t output_queue_len; // num items queued }; +static struct vm_device *demultiplex_injected_key(uchar_t status, uchar_t scancode) +{ + // this currently does nothing + return thekeyboard; +} +int keyboard_interrupt(uint_t irq,struct vm_device * dev); -int keyboard_reset_device(struct vm_device * dev) +void deliver_key_to_vmm(uchar_t status, uchar_t scancode) { - // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + struct vm_device *dev = demultiplex_injected_key(status,scancode); + + struct keyboard_internal *state = (struct keyboard_internal *)dev->private_data; + + KEYBOARD_DEBUG_PRINT("keyboard: injected status 0x%x, and scancode 0x%x\n", status,scancode); - SerialPrint("keyboard: reset device\n"); + // This is wrong - the read status should be some combination of the + // status/scancode within the VM, and that of the actual device + state->read_status=status; + state->read_scancode=scancode; + + keyboard_interrupt(KEYBOARD_IRQ,dev); + +} +int keyboard_reset_device(struct vm_device * dev) +{ + struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + + memset(data,0,sizeof(struct keyboard_internal)); + + KEYBOARD_DEBUG_PRINT("keyboard: reset device\n"); return 0; @@ -43,14 +89,14 @@ int keyboard_reset_device(struct vm_device * dev) int keyboard_start_device(struct vm_device *dev) { - SerialPrint("keyboard: start device\n"); + KEYBOARD_DEBUG_PRINT("keyboard: start device\n"); return 0; } int keyboard_stop_device(struct vm_device *dev) { - SerialPrint("keyboard: stop device\n"); + KEYBOARD_DEBUG_PRINT("keyboard: stop device\n"); return 0; } @@ -62,15 +108,15 @@ int keyboard_write_control_port(ushort_t port, uint_t length, struct vm_device * dev) { - //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data; if (length==1) { uchar_t data = *((uchar_t*)src); - PrintDebug("keyboard: write of 0x%x to control port\n",data); - Out_Byte(KEYBOARD_CONTROL_REG,data); + KEYBOARD_DEBUG_PRINT("keyboard: write of 0x%x to control port\n",data); + state->write_status=data; return 1; } else { - PrintDebug("keyboard: unknown size write to control port!\n"); + KEYBOARD_DEBUG_PRINT("keyboard: unknown size write to control port!\n"); return -1; } } @@ -80,17 +126,17 @@ int keyboard_read_control_port(ushort_t port, uint_t length, struct vm_device * dev) { - //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data; if (length==1) { uchar_t data; - PrintDebug("keyboard: read from control port: "); - data=In_Byte(KEYBOARD_CONTROL_REG); - PrintDebug("0x%x\n",data); - memcpy(dest,&data,1); + KEYBOARD_DEBUG_PRINT("keyboard: read from control port: "); + data=state->read_status; + KEYBOARD_DEBUG_PRINT("0x%x\n",data); + memcpy(dest,&data,length); return 1; } else { - PrintDebug("keyboard: unknown size read from control port!\n"); + KEYBOARD_DEBUG_PRINT("keyboard: unknown size read from control port!\n"); return -1; } } @@ -100,15 +146,15 @@ int keyboard_write_data_port(ushort_t port, uint_t length, struct vm_device * dev) { - //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data; if (length==1) { uchar_t data = *((uchar_t*)src); - PrintDebug("keyboard: write of 0x%x to data port\n",data); - Out_Byte(KEYBOARD_DATA_REG,data); + KEYBOARD_DEBUG_PRINT("keyboard: write of 0x%x to data port\n",data); + state->write_scancode=data; return 1; } else { - PrintDebug("keyboard: unknown size write to data port!\n"); + KEYBOARD_DEBUG_PRINT("keyboard: unknown size write to data port!\n"); return -1; } } @@ -118,17 +164,17 @@ int keyboard_read_data_port(ushort_t port, uint_t length, struct vm_device * dev) { - //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; + struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data; if (length==1) { uchar_t data; - PrintDebug("keyboard: read from data port: "); - data=In_Byte(KEYBOARD_DATA_REG); - PrintDebug("0x%x\n",data); + KEYBOARD_DEBUG_PRINT("keyboard: read from data port: "); + data=state->read_scancode; + KEYBOARD_DEBUG_PRINT("0x%x\n",data); memcpy(dest,&data,1); return 1; } else { - PrintDebug("keyboard: unknown size read from data port!\n"); + KEYBOARD_DEBUG_PRINT("keyboard: unknown size read from data port!\n"); return -1; } } @@ -137,9 +183,12 @@ int keyboard_read_data_port(ushort_t port, int keyboard_interrupt(uint_t irq, struct vm_device * dev) { - PrintDebug("keyboard: interrupt\n"); + KEYBOARD_DEBUG_PRINT("keyboard: interrupt\n"); + + dev->vm->vm_ops.raise_irq(dev->vm,irq,0); + return 0; - // Inject ? + } @@ -148,7 +197,7 @@ int keyboard_init_device(struct vm_device * dev) // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; - SerialPrint("keyboard: init_device\n"); + KEYBOARD_DEBUG_PRINT("keyboard: init_device\n"); // Would read state here @@ -158,10 +207,10 @@ int keyboard_init_device(struct vm_device * dev) dev_hook_io(dev, KEYBOARD_DATA_REG, &keyboard_read_data_port, &keyboard_write_data_port); dev_hook_io(dev, KEYBOARD_CONTROL_REG, &keyboard_read_control_port, &keyboard_write_control_port); - // hook irq - // currently assume this is done in vm.c? - //dev_hook_irq(dev,KEYBOARD_IRQ,&keyboard_interrupt); - + // + // We do not hook the IRQ here. Instead, the underlying device driver + // is responsible to call us back + // return 0; } @@ -169,8 +218,6 @@ int keyboard_init_device(struct vm_device * dev) int keyboard_deinit_device(struct vm_device *dev) { - - //dev_unhook_irq(dev,KEYBOARD_IRQ); dev_unhook_io(dev, KEYBOARD_DATA_REG); dev_unhook_io(dev, KEYBOARD_CONTROL_REG); @@ -194,9 +241,16 @@ static struct vm_device_ops dev_ops = { struct vm_device *create_keyboard() { + + if (thekeyboard!=NULL) { + KEYBOARD_DEBUG_PRINT("keyboard: creating >1 keyboard device. This will probably fail!\n"); + } + struct keyboard_internal * keyboard_state = os_hooks->malloc(sizeof(struct keyboard_internal)); struct vm_device *device = create_device("KEYBOARD", &dev_ops, keyboard_state); + thekeyboard=device; + return device; } diff --git a/palacios/src/geekos/keyboard.c b/palacios/src/geekos/keyboard.c index 4853c48..554f42f 100644 --- a/palacios/src/geekos/keyboard.c +++ b/palacios/src/geekos/keyboard.c @@ -1,7 +1,7 @@ /* * Keyboard driver * Copyright (c) 2001,2004 David H. Hovemeyer - * $Revision: 1.3 $ + * $Revision: 1.4 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -35,6 +35,11 @@ #include #include + +static enum {TARGET_GEEKOS,TARGET_VMM} target=TARGET_GEEKOS; + +extern void deliver_key_to_vmm(uchar_t status, uchar_t scancode); + /* ---------------------------------------------------------------------- * Private data and functions * ---------------------------------------------------------------------- */ @@ -159,101 +164,134 @@ static __inline__ Keycode Dequeue_Keycode(void) */ static void Keyboard_Interrupt_Handler(struct Interrupt_State* state) { + uchar_t raw_status, raw_scancode; + uchar_t status, scanCode; unsigned flag = 0; bool release = false, shift; Keycode keycode; + bool flagchange; Begin_IRQ(state); - // Print("Keybaord\n"); + Print("Keyboard\n"); status = In_Byte(KB_CMD); + + raw_status=status; + IO_Delay(); if ((status & KB_OUTPUT_FULL) != 0) { - /* There is a byte available */ - scanCode = In_Byte(KB_DATA); - IO_Delay(); -/* - * Print("code=%x%s\n", scanCode, (scanCode&0x80) ? " [release]" : ""); - */ - - if (scanCode & KB_KEY_RELEASE) { - release = true; - scanCode &= ~(KB_KEY_RELEASE); - } - - if (scanCode >= SCAN_TABLE_SIZE) { - Print("Unknown scan code: %x\n", scanCode); + /* There is a byte available */ + scanCode = In_Byte(KB_DATA); + raw_scancode=scanCode; + Print("Keyboard: status=0x%x, scancode=0x%x\n", raw_status, raw_scancode); + IO_Delay(); + /* + * Print("code=%x%s\n", scanCode, (scanCode&0x80) ? " [release]" : ""); + */ + + if (scanCode & KB_KEY_RELEASE) { + release = true; + scanCode &= ~(KB_KEY_RELEASE); + } + + if (scanCode >= SCAN_TABLE_SIZE) { + Print("Unknown scan code: %x\n", scanCode); + goto done; + } + + /* Process the key */ + shift = ((s_shiftState & SHIFT_MASK) != 0); + keycode = shift ? s_scanTableWithShift[scanCode] : s_scanTableNoShift[scanCode]; + + flagchange=false; + + /* Update shift, control and alt state */ + switch (keycode) { + case KEY_LSHIFT: + flag = LEFT_SHIFT; + break; + case KEY_RSHIFT: + flag = RIGHT_SHIFT; + break; + case KEY_LCTRL: + flag = LEFT_CTRL; + break; + case KEY_RCTRL: + flag = RIGHT_CTRL; + break; + case KEY_LALT: + flag = LEFT_ALT; + break; + case KEY_RALT: + flag = RIGHT_ALT; + break; + default: + goto noflagchange; + } + + if (release) + s_shiftState &= ~(flag); + else + s_shiftState |= flag; + + /* + * Shift, control and alt keys don't have to be + * queued, flags will be set! + */ + // huh? + flagchange=true; + goto skip_flagchange; + +noflagchange: + /* Format the new keycode */ + if (shift) + keycode |= KEY_SHIFT_FLAG; + if ((s_shiftState & CTRL_MASK) != 0) + keycode |= KEY_CTRL_FLAG; + if ((s_shiftState & ALT_MASK) != 0) + keycode |= KEY_ALT_FLAG; + if (release) + keycode |= KEY_RELEASE_FLAG; + + +skip_flagchange: + + if (target==TARGET_GEEKOS) { + if (raw_scancode==0xc4) { // F10 release + Print("Switching keyboard to VMM\n"); + target=TARGET_VMM; + } else { + if (flagchange) { goto done; + } + /* Put the keycode in the buffer */ + Enqueue_Keycode(keycode); + + /* Wake up event consumers */ + Wake_Up(&s_waitQueue); + + /* + * Pick a new thread upon return from interrupt + * (hopefully the one waiting for the keyboard event) + */ + g_needReschedule = true; } - - /* Process the key */ - shift = ((s_shiftState & SHIFT_MASK) != 0); - keycode = shift ? s_scanTableWithShift[scanCode] : s_scanTableNoShift[scanCode]; - - /* Update shift, control and alt state */ - switch (keycode) { - case KEY_LSHIFT: - flag = LEFT_SHIFT; - break; - case KEY_RSHIFT: - flag = RIGHT_SHIFT; - break; - case KEY_LCTRL: - flag = LEFT_CTRL; - break; - case KEY_RCTRL: - flag = RIGHT_CTRL; - break; - case KEY_LALT: - flag = LEFT_ALT; - break; - case KEY_RALT: - flag = RIGHT_ALT; - break; - default: - goto noflagchange; + } else if (target==TARGET_VMM) { + if (raw_scancode==0xc4) { // F10 release + Print("Switching keyboard to GeekOS\n"); + target=TARGET_GEEKOS; + } else { + deliver_key_to_vmm(raw_status,raw_scancode); } - - if (release) - s_shiftState &= ~(flag); - else - s_shiftState |= flag; - - /* - * Shift, control and alt keys don't have to be - * queued, flags will be set! - */ - goto done; - -noflagchange: - /* Format the new keycode */ - if (shift) - keycode |= KEY_SHIFT_FLAG; - if ((s_shiftState & CTRL_MASK) != 0) - keycode |= KEY_CTRL_FLAG; - if ((s_shiftState & ALT_MASK) != 0) - keycode |= KEY_ALT_FLAG; - if (release) - keycode |= KEY_RELEASE_FLAG; - - /* Put the keycode in the buffer */ - Enqueue_Keycode(keycode); - - /* Wake up event consumers */ - Wake_Up(&s_waitQueue); - - /* - * Pick a new thread upon return from interrupt - * (hopefully the one waiting for the keyboard event) - */ - g_needReschedule = true; + } } -done: + done: End_IRQ(state); + } /* ---------------------------------------------------------------------- diff --git a/palacios/src/geekos/vm.c b/palacios/src/geekos/vm.c index 160be77..910dbd6 100644 --- a/palacios/src/geekos/vm.c +++ b/palacios/src/geekos/vm.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -314,18 +315,27 @@ int RunVMM(struct Boot_Info * bootInfo) { hook_io_port(&(vm_info.io_map), 0x403, &IO_Read, &IO_Write_to_Serial, NULL); { + struct vm_device * nvram = create_nvram(); //struct vm_device * timer = create_timer(); struct vm_device * pic = create_pic(); //struct vm_device * keyboard = create_keyboard(); struct vm_device * pit = create_pit(); + //generic_port_range_type range = {0,1024} ; // hook first 1024 ports if not already hooked + + //struct vm_device * generic = create_generic(&range,1,NULL,0,NULL,0); + + attach_device(&(vm_info), nvram); //attach_device(&(vm_info), timer); attach_device(&(vm_info), pic); attach_device(&(vm_info), pit); //attach_device(&(vm_info), keyboard); + // Important that this be attached last! + //attach_device(&(vm_info), generic); + PrintDebugDevMgr(&(vm_info.dev_mgr)); }