Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


lot of changes
Jack Lange [Wed, 21 May 2008 23:00:50 +0000 (23:00 +0000)]
29 files changed:
palacios/build/Makefile
palacios/build/depend.mak
palacios/include/devices/8254.h [new file with mode: 0644]
palacios/include/geekos/vmm_stubs.h
palacios/include/palacios/vm_guest.h
palacios/include/palacios/vmm.h
palacios/include/palacios/vmm_dev_mgr.h
palacios/include/palacios/vmm_emulate.h
palacios/include/palacios/vmm_intr.h
palacios/include/palacios/vmm_irq.h [deleted file]
palacios/include/palacios/vmm_time.h [new file with mode: 0644]
palacios/include/palacios/vmm_types.h
palacios/include/palacios/vmm_util.h
palacios/src/devices/8254.c [new file with mode: 0644]
palacios/src/devices/8259a.c
palacios/src/devices/simple_pic.c
palacios/src/devices/timer.c
palacios/src/geekos/keyboard.c
palacios/src/geekos/main.c
palacios/src/geekos/timer.c
palacios/src/geekos/vm.c
palacios/src/geekos/vmm_stubs.c
palacios/src/palacios/svm.c
palacios/src/palacios/svm_handler.c
palacios/src/palacios/vm_dev.c
palacios/src/palacios/vmm_dev_mgr.c
palacios/src/palacios/vmm_intr.c
palacios/src/palacios/vmm_irq.c [deleted file]
palacios/src/palacios/vmm_time.c [new file with mode: 0644]

index d1bfc67..c830894 100644 (file)
@@ -1,6 +1,6 @@
 # Makefile for GeekOS kernel, userspace, and tools
 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
-# $Revision: 1.33 $
+# $Revision: 1.34 $
 
 # This is free software.  You are permitted to use,
 # redistribute, and modify it as specified in the file "COPYING".
@@ -124,7 +124,7 @@ VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
 VMM_C_SRCS :=   vm_guest.c \
                svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
                vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
-               vmm_intr.c vmm_irq.c\
+               vmm_intr.c vmm_time.c\
                vmm_shadow_paging.c vm_guest_mem.c  \
                 vm_dev.c vmm_dev_mgr.c \
 #\
@@ -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
+DEVICE_C_SRCS :=  keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c
 
 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
 
@@ -211,7 +211,7 @@ CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror
 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
 
 # Flags used for VMM C source files
-CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__
+CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__
 
 # Flags used for VMM C ASM files
 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
index 0d20b9b..78abffa 100644 (file)
@@ -1,58 +1,58 @@
 geekos/idt.o: ../src/geekos/idt.c ../include/geekos/kassert.h \
   ../include/geekos/screen.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/defs.h ../include/geekos/serial.h \
   ../include/geekos/irq.h ../include/geekos/string.h \
   ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/string.h ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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 \
@@ -62,12 +62,12 @@ 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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/defs.h ../include/geekos/string.h \
   ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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 \
@@ -75,133 +75,133 @@ geekos/ide.o: ../src/geekos/ide.c ../include/geekos/serial.h \
   ../include/geekos/ide.h
 geekos/keyboard.o: ../src/geekos/keyboard.c ../include/geekos/kthread.h \
   ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/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/stdarg.h \
   ../include/geekos/kassert.h ../include/geekos/screen.h \
   ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/limits.h \
+  /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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
+  /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
   ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/defs.h ../include/geekos/gdt.h \
   ../include/geekos/segment.h ../include/geekos/string.h \
   ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/string.h ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/bget.h
 geekos/malloc.o: ../src/geekos/malloc.c ../include/geekos/screen.h \
   ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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
@@ -209,25 +209,25 @@ 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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/defs.h ../include/geekos/string.h \
   ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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 \
@@ -240,63 +240,20 @@ 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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/stdarg.h \
   ../include/geekos/defs.h ../include/geekos/string.h \
   ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
+  /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
   ../include/geekos/io.h
-geekos/vmm_stubs.o: ../src/geekos/vmm_stubs.c ../include/geekos/vmm_stubs.h \
-  ../include/geekos/mem.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/geekos/defs.h ../include/geekos/list.h \
-  ../include/geekos/kassert.h ../include/geekos/screen.h \
-  ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \
-  ../include/geekos/paging.h ../include/geekos/bootinfo.h \
-  ../include/geekos/malloc.h ../include/geekos/serial.h \
-  ../include/geekos/irq.h ../include/geekos/int.h \
-  ../include/geekos/string.h ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/geekos/io.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_types.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h ../include/palacios/vmm_irq.h
-geekos/vm.o: ../src/geekos/vm.c ../include/geekos/vmm_stubs.h \
-  ../include/geekos/mem.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/geekos/defs.h ../include/geekos/list.h \
-  ../include/geekos/kassert.h ../include/geekos/screen.h \
-  ../include/geekos/fmtout.h ../include/geekos/../libc/fmtout.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \
-  ../include/geekos/paging.h ../include/geekos/bootinfo.h \
-  ../include/geekos/malloc.h ../include/palacios/vmm.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_types.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/geekos/debug.h \
-  ../include/geekos/serial.h ../include/geekos/irq.h \
-  ../include/geekos/int.h ../include/geekos/string.h \
-  ../include/geekos/../libc/string.h ../include/geekos/io.h \
-  ../include/geekos/vm.h ../include/devices/nvram.h \
-  ../include/palacios/vm_dev.h ../include/devices/timer.h \
-  ../include/devices/simple_pic.h ../include/devices/8259a.h \
-  ../include/devices/keyboard.h
 geekos/main.o: ../src/geekos/main.c ../include/geekos/bootinfo.h \
   ../include/geekos/string.h ../include/geekos/../libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.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/pdinda/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/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 \
@@ -309,273 +266,14 @@ geekos/main.o: ../src/geekos/main.c ../include/geekos/bootinfo.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdarg.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
+  /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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/limits.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/pdinda/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/stdarg.h \
   ../include/libc/string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.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/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h
-palacios/vm_guest.o: ../src/palacios/vm_guest.c ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h
-palacios/svm.o: ../src/palacios/svm.c ../include/palacios/svm.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmcb.h \
-  ../include/palacios/svm_handler.h ../include/palacios/vmm_debug.h \
-  ../include/palacios/vm_guest_mem.h ../include/palacios/vmm_emulate.h
-palacios/svm_handler.o: ../src/palacios/svm_handler.c \
-  ../include/palacios/svm_handler.h ../include/palacios/svm.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmcb.h \
-  ../include/palacios/vm_guest_mem.h ../include/palacios/vmm_emulate.h \
-  ../include/palacios/vmm_ctrl_regs.h ../include/palacios/svm_io.h
-palacios/vmm.o: ../src/palacios/vmm.c ../include/palacios/vmm.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/svm.h \
-  ../include/palacios/vmcb.h ../include/palacios/vmx.h \
-  ../include/palacios/vmcs.h ../include/palacios/vmcs_gen.h
-palacios/vmm_util.o: ../src/palacios/vmm_util.c ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h
-palacios/vmm_ctrl_regs.o: ../src/palacios/vmm_ctrl_regs.c \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmcb.h \
-  ../include/palacios/vmm_emulate.h ../include/palacios/vm_guest_mem.h \
-  ../include/palacios/vmm_ctrl_regs.h
-palacios/vmcb.o: ../src/palacios/vmcb.c ../include/palacios/vmcb.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmm.h
-palacios/vmm_mem.o: ../src/palacios/vmm_mem.c ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h
-palacios/vmm_paging.o: ../src/palacios/vmm_paging.c \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_intr.h ../include/palacios/vmm_dev_mgr.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vm_guest_mem.h
-palacios/vmm_io.o: ../src/palacios/vmm_io.c ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_irq.h
-palacios/vmm_debug.o: ../src/palacios/vmm_debug.c ../include/palacios/vmm_debug.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h
-palacios/svm_io.o: ../src/palacios/svm_io.c ../include/palacios/svm_io.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmcb.h \
-  ../include/palacios/vmm.h ../include/palacios/vmm_ctrl_regs.h \
-  ../include/palacios/vmm_emulate.h ../include/palacios/vm_guest_mem.h
-palacios/vmm_intr.o: ../src/palacios/vmm_intr.c ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_dev_mgr.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h
-palacios/vmm_irq.o: ../src/palacios/vmm_irq.c
-palacios/vmm_shadow_paging.o: ../src/palacios/vmm_shadow_paging.c \
-  ../include/palacios/vmm_shadow_paging.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vm_guest_mem.h
-palacios/vm_guest_mem.o: ../src/palacios/vm_guest_mem.c \
-  ../include/palacios/vm_guest_mem.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_list.h \
-  ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmm.h
-palacios/vm_dev.o: ../src/palacios/vm_dev.c ../include/palacios/vm_dev.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_irq.h
-palacios/vmm_dev_mgr.o: ../src/palacios/vmm_dev_mgr.c ../include/palacios/vm_dev.h \
-  ../include/palacios/vmm_types.h ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_irq.h ../include/palacios/vmm.h
-devices/keyboard.o: ../src/devices/keyboard.c ../include/devices/keyboard.h \
-  ../include/palacios/vm_dev.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/geekos/io.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_irq.h
-devices/nvram.o: ../src/devices/nvram.c ../include/devices/nvram.h \
-  ../include/palacios/vm_dev.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_irq.h
-devices/timer.o: ../src/devices/timer.c ../include/devices/timer.h \
-  ../include/palacios/vm_dev.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm.h \
-  ../include/palacios/vm_guest.h ../include/palacios/vmm_mem.h \
-  ../include/palacios/vmm_io.h ../include/palacios/vmm_util.h \
-  ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm_irq.h
-devices/simple_pic.o: ../src/devices/simple_pic.c ../include/devices/simple_pic.h \
-  ../include/palacios/vm_dev.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_irq.h
-devices/8259a.o: ../src/devices/8259a.c ../include/devices/8259a.h \
-  ../include/palacios/vm_dev.h ../include/palacios/vmm_types.h \
-  ../include/geekos/ktypes.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stdbool.h \
-  ../include/palacios/vmm_list.h ../include/palacios/vmm_string.h \
-  /home/pdinda/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h \
-  ../include/palacios/vmm_dev_mgr.h ../include/palacios/vmm_intr.h \
-  ../include/palacios/vmm.h ../include/palacios/vm_guest.h \
-  ../include/palacios/vmm_mem.h ../include/palacios/vmm_io.h \
-  ../include/palacios/vmm_util.h ../include/palacios/vmm_shadow_paging.h \
-  ../include/palacios/vmm_paging.h ../include/palacios/vmm_irq.h
+  /home/jarusl/vmm-dev/devtools/i386/lib/gcc/i386-elf/3.4.6/include/stddef.h
diff --git a/palacios/include/devices/8254.h b/palacios/include/devices/8254.h
new file mode 100644 (file)
index 0000000..4123bb9
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __8254_H
+#define __8254_H
+
+#include <palacios/vm_dev.h>
+
+
+
+struct vm_device * create_pit();
+
+
+
+
+
+#endif
index 5a4b4cb..396e614 100644 (file)
@@ -20,5 +20,62 @@ void * Identity(void *addr);
 int hook_irq_stub(struct guest_info * info, int irq);
 int ack_irq(int irq);
 
+
+unsigned int get_cpu_khz();
+
 void Init_Stubs();
+
+
+
+
+
+
+
+
+
+#if 0
+
+# define do_div(n,base) ({                                     \
+       uint32_t __base = (base);                               \
+       uint32_t __rem;                                         \
+       __rem = ((uint64_t)(n)) % __base;                       \
+       (n) = ((uint64_t)(n)) / __base;                         \
+       __rem;                                                  \
+ })
+
+#else
+
+/*
+ * do_div() is NOT a C function. It wants to return
+ * two values (the quotient and the remainder), but
+ * since that doesn't work very well in C, what it
+ * does is:
+ *
+ * - modifies the 64-bit dividend _in_place_
+ * - returns the 32-bit remainder
+ *
+ * This ends up being the most efficient "calling
+ * convention" on x86.
+ */
+#define do_div(n,base) ({                                   \
+      unsigned long __upper, __low, __high, __mod, __base;   \
+      __base = (base);                                      \
+      asm("":"=a" (__low), "=d" (__high):"A" (n));          \
+      __upper = __high;                                             \
+      if (__high) {                                         \
+       __upper = __high % (__base);                         \
+       __high = __high / (__base);                          \
+      }                                                                        \
+      asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
+      asm("":"=A" (n):"a" (__low),"d" (__high));                       \
+      __mod;                                                           \
+    })
+
+#endif
+
+
+
+
+
+
 #endif
index 89e6590..0987f95 100644 (file)
@@ -10,7 +10,7 @@
 #include <palacios/vmm_shadow_paging.h>
 #include <palacios/vmm_intr.h>
 #include <palacios/vmm_dev_mgr.h>
-#include <palacios/vmm_irq.h>
+#include <palacios/vmm_time.h>
 
 
 typedef ullong_t v3_reg_t;
@@ -72,7 +72,7 @@ struct shadow_map;
 
 
 struct vm_ctrl_ops {
-  int (*raise_irq)(struct guest_info * info, int irq, int error_code);
+  int (*raise_irq)(struct guest_info * info, int irq);
 };
 
 
@@ -88,8 +88,10 @@ struct guest_info {
 
   uint_t cpl;
 
+
   struct shadow_map mem_map;
 
+  struct vm_time time_state;
   
   vm_page_mode_t page_mode;
   struct shadow_page_state shdw_pg_state;
@@ -99,8 +101,6 @@ struct guest_info {
   // This structure is how we get interrupts for the guest
   struct vm_intr intr_state;
 
-
-  // struct vmm_irq_map irq_map;
   vmm_io_map_t io_map;
   // device_map
 
@@ -115,6 +115,8 @@ struct guest_info {
 
   struct vm_ctrl_ops vm_ops;
 
+
+
   void * vmm_data;
 };
 
index 01d4d35..ec36284 100644 (file)
@@ -53,7 +53,7 @@
   } while (0)                                          \
 
 
-
+/*
 #define V3_Malloc(type, var, size)                     \
   do {                                                 \
     extern struct vmm_os_hooks * os_hooks;             \
       var = (type)(os_hooks)->malloc(size);            \
     }                                                  \
   } while (0)                                          \
+*/
 
+#define V3_Malloc(size) ({                     \
+      extern struct vmm_os_hooks * os_hooks;   \
+      void * var = 0;                          \
+      if ((os_hooks) && (os_hooks)->malloc) {  \
+       var = (os_hooks)->malloc(size);         \
+      }                                                \
+      var;                                     \
+    })
 
 // We need to check the hook structure at runtime to ensure its SAFE
 #define V3_Free(addr)                                  \
     }                                                  \
   } while (0)                                          \
 
+#define V3_CPU_KHZ(khz)                                        \
+  do {                                                 \
+    extern struct vmm_os_hooks * os_hooks;             \
+    if ((os_hooks) && (os_hooks)->get_cpu_khz) {       \
+      khz = (os_hooks)->get_cpu_khz();                 \
+    }                                                  \
+  } while (0)                                          \
+
 
 /* ** */
 
@@ -112,8 +129,13 @@ struct vmm_os_hooks {
   int (*hook_interrupt)(struct guest_info * info, int irq);
   int (*ack_irq)(int irq);
 
+
+  unsigned int (*get_cpu_khz)();
+
   // Do we need this here?
-  void (*snprintf)(char * dst, char * format, int len, ...);
+  //  void (*snprintf)(char * dst, char * format, int len, ...);
+
+
 
   void (*start_kernel_thread)(); // include pointer to function
 };
index 080de99..ed49769 100644 (file)
@@ -18,10 +18,7 @@ struct vmm_dev_mgr {
   
   uint_t num_mem_hooks;
   struct list_head mem_hooks;
-  /*
-  uint_t num_irq_hooks;
-  struct list_head irq_hooks;
-  */
+
 };
 
 
@@ -35,10 +32,7 @@ struct dev_io_hook {
   struct vm_device * dev;
 
   // Do not touch anything below this  
-  /*
-    struct dev_io_hook *dev_next, *dev_prev;
-    struct dev_io_hook *mgr_next, *mgr_prev;
-  */
+
   struct list_head dev_list;
   struct list_head mgr_list;
 };
@@ -54,19 +48,7 @@ struct dev_mem_hook {
   struct list_head mgr_list;
 };
 
-/*
-struct dev_irq_hook {
-  uint_t irq;
-
-  int (*handler)(uint_t irq, struct vm_device * dev);
-
-  struct vm_device * dev;
-
-  struct list_head dev_list;
-  struct list_head mgr_list;
-};
 
-*/
 // Registration of devices
 
 //
@@ -87,14 +69,7 @@ int dev_mgr_add_device(struct vmm_dev_mgr * mgr, struct vm_device * dev);
 int dev_mgr_remove_device(struct vmm_dev_mgr * mgr, struct vm_device * dev);
 
 
-/*
-  int dev_mgr_add_io_hook(struct vmm_dev_mgr * mgr, struct dev_io_hook * hook);
-  int dev_mgr_remove_io_hook(struct vmm_dev_mgr * mgr, struct dev_io_hook * hook);
-  int dev_add_io_hook(struct vmm_dev_mgr * mgr, struct dev_io_hook * hook);
-  int dev_remove_io_hook(struct vmm_dev_mgr * mgr, struct dev_io_hook * hook);
-  struct dev_io_hook * dev_find_io_hook(struct vm_device * dev, ushort_t port);
-  struct dev_io_hook * dev_mgr_find_io_hook(struct vmm_dev_mgr * mgr, ushort_t port)
-*/
+
 
 void PrintDebugDevMgr(struct vmm_dev_mgr * mgr);
 void PrintDebugDev(struct vm_device * dev);
index fb1436b..26d4c6f 100644 (file)
@@ -6,12 +6,11 @@
 /*
  * This is where we do the hideous X86 instruction parsing among other things
  * We can parse out the instruction prefixes, as well as decode the operands 
-
  */
 
 
-/* JRL: Some of this was taken from the Xen sources... 
- *
+/* 
+ * JRL: Some of this was taken from the Xen sources... 
  */
 
 #define PACKED __attribute__((packed))
index 402d6f9..eccf8fc 100644 (file)
@@ -29,6 +29,14 @@ typedef enum {INVALID_INTR, EXTERNAL_IRQ, NMI, EXCEPTION, SOFTWARE, VIRTUAL} int
 
 struct guest_info;
 
+
+
+/* We need a way to allow the APIC/PIC to decide when they are supposed to receive interrupts...
+ * Maybe a notification call when they have been turned on, to deliver irqs to them...
+ * We can rehook the guest raise_irq op, to the appropriate controller
+ */
+
+
 struct vm_intr {
 
   /* We need to rework the exception state, to handle stacking */
@@ -45,13 +53,13 @@ struct vm_intr {
 };
 
 
-int raise_irq(struct guest_info * info, int irq, int error_code);
+int raise_irq(struct guest_info * info, int irq);
 int hook_irq(struct guest_info * info, int irq);
 
 struct intr_ctrl_ops {
   int (*intr_pending)(void * private_data);
   int (*get_intr_number)(void * private_data);
-  int (*raise_intr)(void * private_data, int irq, int error_code);
+  int (*raise_intr)(void * private_data, int irq);
   int (*begin_irq)(void * private_data, int irq);
 };
 
diff --git a/palacios/include/palacios/vmm_irq.h b/palacios/include/palacios/vmm_irq.h
deleted file mode 100644 (file)
index 26958e2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __VMM_IRQ_H
-#define __VMM_IRQ_H
-
-#if 0
-#include <palacios/vmm_types.h>
-
-
-struct vmm_irq_hook;
-
-
-
-
-struct vmm_irq_hook {
-  uint_t irq;
-  void * private_data;
-
-  int(*handler)(uint_t irq, void * private_data);
-
-  struct vmm_irq_hook *next, *prev;
-};
-
-
-void init_irq_map(struct vmm_irq_map * map);
-
-
-int hook_irq(struct vmm_irq_map * map, uint_t irq, 
-            int(*handler)(uint_t irq, void * private_data), 
-            void * private_data);
-
-
-int unhook_irq(struct vmm_irq_map * map, uint_t irq);
-
-struct vmm_irq_hook * get_irq_hook(struct vmm_irq_map * map, uint_t irq);
-
-#endif
-#endif
diff --git a/palacios/include/palacios/vmm_time.h b/palacios/include/palacios/vmm_time.h
new file mode 100644 (file)
index 0000000..2411187
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef __VMM_TIME_H
+#define __VMM_TIME_H
+
+
+#include <palacios/vmm_types.h>
+#include <palacios/vmm_list.h>
+
+struct guest_info;
+
+struct vm_time {
+  uint32_t cpu_freq; // in kHZ
+
+  // Total number of guest run time cycles
+  ullong_t guest_tsc;
+
+  // Cache value to help calculate the guest_tsc
+  ullong_t cached_host_tsc;
+
+  // The number of cycles pending for notification to the timers
+  ullong_t pending_cycles;
+
+  // Installed Timers 
+  uint_t num_timers;
+  struct list_head timers;
+};
+
+
+struct vm_timer_ops {
+ void (*update_time)(ullong_t cpu_cycles, ullong_t cpu_freq, void * priv_data);
+
+};
+
+struct vm_timer {
+  void * private_data;
+  struct vm_timer_ops ops;
+
+  struct list_head timer_link;
+};
+
+
+void v3_init_time(struct vm_time * time_state);
+
+
+
+
+int v3_add_timer(struct guest_info * info, struct vm_timer_ops * ops, void * private_data);
+int v3_remove_timer(struct guest_info * info, struct vm_timer * timer);
+
+
+void v3_update_timers(struct guest_info * info);
+
+#endif
index 752cee1..fbc9743 100644 (file)
@@ -22,4 +22,13 @@ typedef unsigned long ulong_t;
 typedef unsigned long size_t;
 
 */
+
+
+
+typedef unsigned long long uint64_t;
+typedef long long sint64_t;
+
+typedef unsigned int uint32_t;
+typedef int sint32_t;
+
 #endif
index 323b977..95a0c8e 100644 (file)
@@ -42,4 +42,79 @@ void PrintTraceHex(unsigned char x);
 void PrintTraceMemDump(unsigned char * start, int n);
 
 
+
+
+#define rdtsc(low,high)                                                \
+     __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
+
+#define rdtscl(low)                                            \
+     __asm__ __volatile__("rdtsc" : "=a" (low) : : "edx")
+
+#if defined(__i386__)
+
+#define rdtscll(val)                           \
+     __asm__ __volatile__("rdtsc" : "=A" (val))
+
+#elif defined(__x86_64__)
+
+#define rdtscll(val) do {                                  \
+    unsigned int a,d;                                      \
+    asm volatile("rdtsc" : "=a" (a), "=d" (d));                    \
+    (val) = ((unsigned long)a) | (((unsigned long)d)<<32);  \
+  } while(0)
+
+#endif
+
+
+
+
+
+
+
+
+
+#ifdef __V3_64BIT__
+
+# define do_div(n,base) ({                                     \
+       uint32_t __base = (base);                               \
+       uint32_t __rem;                                         \
+       __rem = ((uint64_t)(n)) % __base;                       \
+       (n) = ((uint64_t)(n)) / __base;                         \
+       __rem;                                                  \
+ })
+
+#else
+
+/*
+ * do_div() is NOT a C function. It wants to return
+ * two values (the quotient and the remainder), but
+ * since that doesn't work very well in C, what it
+ * does is:
+ *
+ * - modifies the 64-bit dividend _in_place_
+ * - returns the 32-bit remainder
+ *
+ * This ends up being the most efficient "calling
+ * convention" on x86.
+ */
+#define do_div(n,base) ({ \
+       unsigned long __upper, __low, __high, __mod, __base; \
+       __base = (base); \
+       asm("":"=a" (__low), "=d" (__high):"A" (n)); \
+       __upper = __high; \
+       if (__high) { \
+               __upper = __high % (__base); \
+               __high = __high / (__base); \
+       } \
+       asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
+       asm("":"=A" (n):"a" (__low),"d" (__high)); \
+       __mod; \
+})
+
+#endif
+
+
+
+
+
 #endif
diff --git a/palacios/src/devices/8254.c b/palacios/src/devices/8254.c
new file mode 100644 (file)
index 0000000..b11fb7e
--- /dev/null
@@ -0,0 +1,150 @@
+#include <devices/8254.h>
+#include <palacios/vmm.h>
+#include <palacios/vmm_time.h>
+
+// constants
+#define OSC_HZ 1193182
+
+
+/* The 8254 has three counters and one control port */
+#define CHANNEL0_PORT 0x40
+#define CHANNEL1_PORT 0x41
+#define CHANNEL2_PORT 0x42
+#define COMMAND_PORT 0x43
+
+
+#define PIT_INTR_NUM 0
+
+/* The order of these typedefs is important because the numerical values correspond to the 
+ * values coming from the io ports
+ */
+typedef enum {NOT_RUNNING, WAITING_LOBYTE, WAITING_HIBYTE, RUNNING} channel_access_state_t;
+typedef enum {LATCH_COUNT, LOBYTE_ONLY, HIBYTE_ONLY, LOBYTE_HIBYTE} channel_access_mode_t;
+typedef enum {IRQ_ON_TERM_CNT, ONE_SHOT, RATE_GEN, SQR_WAVE, SW_STROBE, HW_STROBE} channel_op_mode_t;
+
+
+struct channel {
+  channel_access_mode_t access_mode;
+  channel_access_state_t access_state;
+
+  channel_op_mode_t op_mode;
+
+  // Time til interrupt trigger 
+  ullong_t ns;
+
+  uint_t ctr;
+  uint_t prg_ctr;
+};
+
+
+struct pit {
+
+  struct channel ch_0;
+  struct channel ch_1;
+  struct channel ch_2;
+};
+
+struct pit_cmd {
+  uint_t channel     : 2;
+  uint_t access_mode : 2;
+  uint_t op_mode     : 3;
+  uint_t bcd_mode    : 1;
+};
+
+
+
+
+
+
+static void pit_update_time(ullong_t cpu_cycles, ullong_t cpu_freq, void * private_data) {
+
+  return;
+}
+
+
+
+static int pit_read_channel(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
+  PrintDebug("8254 PIT: Read of PIT Channel %d\n", port - CHANNEL0_PORT);
+  return length;
+}
+
+
+
+static int pit_write_channel(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
+  PrintDebug("8254 PIT: Write to PIT Channel %d\n", port - CHANNEL0_PORT);
+  return length;
+}
+
+
+static int pit_write_command(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
+  struct pit * state = (struct pit *)dev->private_data;
+  struct pit_cmd * cmd = (struct pit_cmd *)src;
+
+  PrintDebug("8254 PIT: Write to PIT Command port\n");
+
+  if (length != 1) {
+    PrintDebug("8254 PIT: Write of Invalid length to command port\n");
+    return -1;
+  }
+
+  switch (cmd->channel) {
+  case 0:
+    state->ch_0.op_mode = cmd->op_mode;
+    break;
+  case 1:
+    break;
+  case 2:
+    break;
+  default:
+    break;
+  }
+
+
+  return length;
+}
+
+
+
+
+static struct vm_timer_ops timer_ops = {
+  .update_time = pit_update_time,
+};
+
+
+static int pit_init(struct vm_device * dev) {
+  dev_hook_io(dev, CHANNEL0_PORT, &pit_read_channel, &pit_write_channel);
+  dev_hook_io(dev, CHANNEL1_PORT, &pit_read_channel, &pit_write_channel);
+  dev_hook_io(dev, CHANNEL2_PORT, &pit_read_channel, &pit_write_channel);
+  dev_hook_io(dev, COMMAND_PORT, NULL, &pit_write_command);
+
+
+  v3_add_timer(dev->vm, &timer_ops, dev);
+
+  return 0;
+}
+
+static int pit_deinit(struct vm_device * dev) {
+
+  return 0;
+}
+
+
+static struct vm_device_ops dev_ops = {
+  .init = pit_init,
+  .deinit = pit_deinit,
+  .reset = NULL,
+  .start = NULL,
+  .stop = NULL,
+
+};
+
+
+struct vm_device * create_pit() {
+  struct pit * pit_state = NULL;
+  pit_state = (struct pit *)V3_Malloc(sizeof(struct pit));
+  V3_ASSERT(pit_state != NULL);
+
+  struct vm_device * dev = create_device("PIT", &dev_ops, pit_state);
+  
+  return dev;
+}
index 7db595f..0f712b0 100644 (file)
@@ -11,9 +11,11 @@ static const uint_t MASTER_PORT2 = 0x21;
 static const uint_t SLAVE_PORT1 = 0xA0;
 static const uint_t SLAVE_PORT2 = 0xA1;
 
+#define IS_ICW1(x) (((x & 0x10) >> 4) == 0x1)
 #define IS_OCW2(x) (((x & 0x18) >> 3) == 0x0)
 #define IS_OCW3(x) (((x & 0x18) >> 3) == 0x1)
 
+
 struct icw1 {
   uint_t ic4    : 1;  // ICW4 has to be read
   uint_t sngl   : 1;  // single (only one PIC)
@@ -122,21 +124,21 @@ struct pic_internal {
 
 
 
-static int pic_raise_intr(void * private_data, int irq, int error_code) {
+static int pic_raise_intr(void * private_data, int irq) {
   struct pic_internal * state = (struct pic_internal*)private_data;
 
   if (irq == 2) {
     irq = 9;
   }
 
-  PrintDebug("Raising irq %d in the PIC\n", irq);
+  PrintDebug("8259 PIC: Raising irq %d in the PIC\n", irq);
 
   if (irq <= 7) {
     state->master_irr |= 0x01 << irq;
   } else if ((irq > 7) && (irq < 16)) {
     state->slave_irr |= 0x01 << (irq - 7);
   } else {
-    PrintDebug("Invalid IRQ raised (%d)\n", irq);
+    PrintDebug("8259 PIC: Invalid IRQ raised (%d)\n", irq);
     return -1;
   }
 
@@ -164,7 +166,7 @@ static int pic_get_intr_number(void * private_data) {
        //state->master_isr |= (0x1 << i);
        // reset the irr
        //state->master_irr &= ~(0x1 << i);
-       PrintDebug("IRQ: %d, icw2: %x\n", i, state->master_icw2);
+       PrintDebug("8259 PIC: IRQ: %d, icw2: %x\n", i, state->master_icw2);
        return i + state->master_icw2;
       }
     } else {
@@ -180,6 +182,7 @@ static int pic_get_intr_number(void * private_data) {
 }
 
 
+
 /* The IRQ number is the number returned by pic_get_intr_number(), not the pin number */
 static int pic_begin_irq(void * private_data, int irq) {
   struct pic_internal * state = (struct pic_internal*)private_data;
@@ -190,6 +193,7 @@ static int pic_begin_irq(void * private_data, int irq) {
     irq &= 0x7;
     irq += 8;
   } else {
+    PrintDebug("8259 PIC: Could not find IRQ to Begin\n");
     return -1;
   }
 
@@ -206,9 +210,9 @@ static int pic_begin_irq(void * private_data, int irq) {
   return 0;
 }
 
+
 /*
 static int pic_end_irq(void * private_data, int irq) {
-
   return 0;
 }
 */
@@ -225,8 +229,10 @@ static struct intr_ctrl_ops intr_ops = {
 
 int read_master_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
   struct pic_internal * state = (struct pic_internal*)dev->private_data;
+
   if (length != 1) {
-    //error
+    PrintDebug("8259 PIC: Invalid Read length (rd_Master1)\n");
+    return -1;
   }
   
   if ((state->master_ocw3 & 0x03) == 0x02) {
@@ -242,8 +248,10 @@ int read_master_port1(ushort_t port, void * dst, uint_t length, struct vm_device
 
 int read_master_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
   struct pic_internal * state = (struct pic_internal*)dev->private_data;
+
   if (length != 1) {
-    // error
+    PrintDebug("8259 PIC: Invalid Read length (rd_Master2)\n");
+    return -1;
   }
 
   *(char *)dst = state->master_imr;
@@ -254,8 +262,10 @@ int read_master_port2(ushort_t port, void * dst, uint_t length, struct vm_device
 
 int read_slave_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
   struct pic_internal * state = (struct pic_internal*)dev->private_data;
+
   if (length != 1) {
-    // error
+    PrintDebug("8259 PIC: Invalid Read length (rd_Slave1)\n");
+    return -1;
   }
   
   if ((state->slave_ocw3 & 0x03) == 0x02) {
@@ -271,8 +281,10 @@ int read_slave_port1(ushort_t port, void * dst, uint_t length, struct vm_device
 
 int read_slave_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
   struct pic_internal * state = (struct pic_internal*)dev->private_data;
+
   if (length != 1) {
-    // error
+    PrintDebug("8259 PIC: Invalid Read length  (rd_Slave2)\n");
+    return -1;
   }
 
   *(char *)dst = state->slave_imr;
@@ -286,10 +298,11 @@ int write_master_port1(ushort_t port, void * src, uint_t length, struct vm_devic
   char cw = *(char *)src;
 
   if (length != 1) {
-    // error
+    PrintDebug("8259 PIC: Invalid Write length (wr_Master1)\n");
+    return -1;
   }
   
-  if (state->master_state == ICW1) {
+  if (IS_ICW1(cw)) {
     state->master_icw1 = cw;
     state->master_state = ICW2;
 
@@ -305,26 +318,31 @@ int write_master_port1(ushort_t port, void * src, uint_t length, struct vm_devic
       } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
        int i;
        // Non-specific EOI
-       PrintDebug("Pre ISR = %x\n", state->master_isr);
+       PrintDebug("8259 PIC: Pre ISR = %x (wr_Master1)\n", state->master_isr);
        for (i = 0; i < 8; i++) {
          if (state->master_isr & (0x01 << i)) {
            state->master_isr &= ~(0x01 << i);
            break;
          }
        }       
-               PrintDebug("Post ISR = %x\n", state->master_isr);
+               PrintDebug("8259 PIC: Post ISR = %x (wr_Master1)\n", state->master_isr);
       } else {
-       // error;
+       PrintDebug("8259 PIC: Command not handled, or in error (wr_Master1)\n");
+       return -1;
       }
 
       state->master_ocw2 = cw;
     } else if (IS_OCW3(cw)) {
       state->master_ocw3 = cw;
     } else {
-      // error
+      PrintDebug("8259 PIC: Invalid OCW to PIC (wr_Master1)\n");
+      PrintDebug("8259 PIC: CW=%x\n", cw);
+      return -1;
     }
   } else {
-    // error
+    PrintDebug("8259 PIC: Invalid PIC State (wr_Master1)\n");
+    PrintDebug("8259 PIC: CW=%x\n", cw);
+    return -1;
   }
 
   return 1;
@@ -335,13 +353,14 @@ int write_master_port2(ushort_t port, void * src, uint_t length, struct vm_devic
     char cw = *(char *)src;    
 
     if (length != 1) {
-      //error
+      PrintDebug("8259 PIC: Invalid Write length (wr_Master2)\n");
+      return -1;
     }
     
     if (state->master_state == ICW2) {
       struct icw1 * cw1 = (struct icw1 *)&(state->master_icw1);
 
-      PrintDebug("Setting ICW2 = %x\n", cw);
+      PrintDebug("8259 PIC: Setting ICW2 = %x (wr_Master2)\n", cw);
       state->master_icw2 = cw;
 
       if (cw1->sngl == 0) {
@@ -370,6 +389,8 @@ int write_master_port2(ushort_t port, void * src, uint_t length, struct vm_devic
       state->master_imr = cw;
     } else {
       // error
+      PrintDebug("8259 PIC: Invalid master PIC State (wr_Master2)\n");
+      return -1;
     }
 
     return 1;
@@ -381,9 +402,11 @@ int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device
 
   if (length != 1) {
     // error
+    PrintDebug("8259 PIC: Invalid Write length (wr_Slave1)\n");
+    return -1;
   }
 
-  if (state->slave_state == ICW1) {
+  if (IS_ICW1(cw)) {
     state->slave_icw1 = cw;
     state->slave_state = ICW2;
   } else if (state->slave_state == READY) {
@@ -397,16 +420,17 @@ int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device
       } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
        int i;
        // Non-specific EOI
-       PrintDebug("Pre ISR = %x\n", state->slave_isr);
+       PrintDebug("8259 PIC: Pre ISR = %x (wr_Slave1)\n", state->slave_isr);
        for (i = 0; i < 8; i++) {
          if (state->slave_isr & (0x01 << i)) {
            state->slave_isr &= ~(0x01 << i);
            break;
          }
        }       
-               PrintDebug("Post ISR = %x\n", state->slave_isr);
+               PrintDebug("8259 PIC: Post ISR = %x (wr_Slave1)\n", state->slave_isr);
       } else {
-       // error;
+       PrintDebug("8259 PIC: Command not handled or invalid  (wr_Slave1)\n");
+       return -1;
       }
 
       state->slave_ocw2 = cw;
@@ -414,10 +438,12 @@ int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device
       // Basically sets the IRR/ISR read flag
       state->slave_ocw3 = cw;
     } else {
-      // error
+      PrintDebug("8259 PIC: Invalid command work (wr_Slave1)\n");
+      return -1;
     }
   } else {
-    // error
+    PrintDebug("8259 PIC: Invalid State writing (wr_Slave1)\n");
+    return -1;
   }
 
   return 1;
@@ -428,7 +454,8 @@ int write_slave_port2(ushort_t port, void * src, uint_t length, struct vm_device
     char cw = *(char *)src;    
 
     if (length != 1) {
-      //error
+      PrintDebug("8259 PIC: Invalid write length (wr_Slave2)\n");
+      return -1;
     }
 
     if (state->slave_state == ICW2) {
@@ -461,7 +488,8 @@ int write_slave_port2(ushort_t port, void * src, uint_t length, struct vm_device
     } else if (state->slave_state == READY) {
       state->slave_imr = cw;
     } else {
-      // error
+      PrintDebug("8259 PIC: Invalid State at write (wr_Slave2)\n");
+      return -1;
     }
 
     return 1;
@@ -538,7 +566,8 @@ static struct vm_device_ops dev_ops = {
 
 struct vm_device * create_pic() {
   struct pic_internal * state = NULL;
-  V3_Malloc(struct pic_internal *, state, sizeof(struct pic_internal));
+  state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal));
+  V3_ASSERT(state != NULL);
 
   struct vm_device *device = create_device("8259A", &dev_ops, state);
 
index 55eea77..7465ea0 100644 (file)
@@ -5,7 +5,7 @@
 
 struct pic_internal {
   int pending_irq;
-  int error_code;
+
 };
 
 
@@ -15,11 +15,11 @@ static int pic_intr_pending(void * private_data) {
   return (data->pending_irq > 0);
 }
 
-static int pic_raise_intr(void * private_data, int irq, int error_code) {
+static int pic_raise_intr(void * private_data, int irq) {
   struct pic_internal * data = (struct pic_internal *)private_data;
 
   data->pending_irq = irq;
-  data->error_code = error_code;
+
 
   return 0;
 }
@@ -69,7 +69,8 @@ static struct vm_device_ops dev_ops = {
 
 struct vm_device * create_simple_pic() {
   struct pic_internal * state = NULL;
-  V3_Malloc(struct pic_internal *, state, sizeof(struct pic_internal));
+  state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal));
+  V3_ASSERT(state != NULL);
 
   struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state);
 
index d941fe5..65d1a1b 100644 (file)
@@ -40,7 +40,9 @@ static struct vm_device_ops dev_ops = {
 
 struct vm_device * create_timer() {
   struct timer_state * timer = NULL;
-  V3_Malloc(struct timer_state *, timer, sizeof(struct timer_state));
+  timer = (struct timer_state *)V3_Malloc( sizeof(struct timer_state));
+  V3_ASSERT(timer != NULL);
+
   struct vm_device * dev = create_device("Timer", &dev_ops, timer);
   
   return dev;
index 28e0ff3..4853c48 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Keyboard driver
  * Copyright (c) 2001,2004 David H. Hovemeyer <daveho@cs.umd.edu>
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
  * 
  * This is free software.  You are permitted to use,
  * redistribute, and modify it as specified in the file "COPYING".
@@ -166,7 +166,7 @@ static void Keyboard_Interrupt_Handler(struct Interrupt_State* state)
 
     Begin_IRQ(state);
 
-    Print("Keybaord\n");
+    //    Print("Keybaord\n");
 
     status = In_Byte(KB_CMD);
     IO_Delay();
@@ -264,7 +264,7 @@ void Init_Keyboard(void)
 {
     ushort_t irqMask;
 
-    Print("Initializing keyboard...\n");
+        Print("Initializing keyboard...\n");
 
     /* Start out with no shift keys enabled. */
     s_shiftState = 0;
index de46041..a498a90 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
  * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
  * Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu>
- * $Revision: 1.35 $
+ * $Revision: 1.36 $
  * 
  * This is free software.  You are permitted to use,
  * redistribute, and modify it as specified in the file "COPYING".
@@ -173,10 +173,7 @@ int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte)
  */
 void Main(struct Boot_Info* bootInfo)
 {
-  struct Kernel_Thread * key_thread;
-  struct Kernel_Thread * spkr_thread;
 
-  ulong_t doIBuzz = 0;
 
   Out_Byte(0x1234,5);
   Out_Byte(0x1234,5);
@@ -212,7 +209,14 @@ void Main(struct Boot_Info* bootInfo)
   */
 #endif
 
-#if 1
+#if 0
+  {
+
+  struct Kernel_Thread * key_thread;
+  struct Kernel_Thread * spkr_thread;
+
+  ulong_t doIBuzz = 0;
+
   SerialPrint("Dumping BIOS code ffff0-fffff\n\n");
   SerialMemDump((unsigned char *)0x10fff0, 16);
   /*
@@ -223,7 +227,7 @@ void Main(struct Boot_Info* bootInfo)
   SerialPrint("Noisemaker and keyboard listener threads\n");
   key_thread = Start_Kernel_Thread(Keyboard_Listener, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false);
   spkr_thread = Start_Kernel_Thread(Buzzer, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false);
-
+  }
 #endif
 
   {
index 113a17f..e0311a4 100644 (file)
@@ -2,7 +2,7 @@
  * GeekOS timer interrupt support
  * Copyright (c) 2001,2003 David H. Hovemeyer <daveho@cs.umd.edu>
  * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
- * $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".
 #include <geekos/serial.h>
 #include <geekos/debug.h>
 
-#define HZ 100
+
+/* JRL Add a cpu frequency measurement */
+uint_t cpu_khz_freq;
+
+
+#define __SLOW_DOWN_IO "\noutb %%al,$0x80"
+
+#ifdef REALLY_SLOW_IO
+#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO
+#else
+#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO
+#endif
+
+
+
+#define __OUT1(s,x) \
+static inline void out##s(unsigned x value, unsigned short port) {
+
+#define __OUT2(s,s1,s2) \
+__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1"
+
+#define __OUT(s,s1,x) \
+__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \
+__OUT1(s##_p,x) __OUT2(s,s1,"w") __FULL_SLOW_DOWN_IO : : "a" (value), "Nd" (port));} \
+
+
+#define __IN1(s) \
+static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v;
+
+#define __IN2(s,s1,s2) \
+__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0"
+
+#define __IN(s,s1,i...) \
+__IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
+__IN1(s##_p) __IN2(s,s1,"w") __FULL_SLOW_DOWN_IO : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
+
+
+#define RETURN_TYPE unsigned char
+__IN(b,"")
+#undef RETURN_TYPE
+#define RETURN_TYPE unsigned short
+__IN(w,"")
+#undef RETURN_TYPE
+#define RETURN_TYPE unsigned int
+__IN(l,"")
+#undef RETURN_TYPE
+
+
+
+__OUT(b,"b",char)
+__OUT(w,"w",short)
+
+
+
+
+
+#if defined(__i386__)
+
+#define rdtscll(val)                            \
+     __asm__ __volatile__("rdtsc" : "=A" (val))
+
+#elif defined(__x86_64__)
+
+#define rdtscll(val) do {                                   \
+    unsigned int a,d;                                       \
+    asm volatile("rdtsc" : "=a" (a), "=d" (d));             \
+    (val) = ((unsigned long)a) | (((unsigned long)d)<<32);  \
+  } while(0)
+
+#endif
+
+#define do_div(n,base) ({                                   \
+      unsigned long __upper, __low, __high, __mod, __base;   \
+      __base = (base);                                      \
+      asm("":"=a" (__low), "=d" (__high):"A" (n));          \
+      __upper = __high;                                             \
+      if (__high) {                                         \
+       __upper = __high % (__base);                         \
+       __high = __high / (__base);                          \
+      }                                                                        \
+      asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
+      asm("":"=A" (n):"a" (__low),"d" (__high));                       \
+      __mod;                                                           \
+    })
+
+
+/**
+ * This uses the Programmable Interval Timer that is standard on all
+ * PC-compatible systems to determine the time stamp counter frequency.
+ *
+ * This uses the speaker output (channel 2) of the PIT. This is better than
+ * using the timer interrupt output because we can read the value of the
+ * speaker with just one inb(), where we need three i/o operations for the
+ * interrupt channel. We count how many ticks the TSC does in 50 ms.
+ *
+ * Returns the detected time stamp counter frequency in KHz.
+ */
+
+
+static unsigned int 
+pit_calibrate_tsc(void)
+{
+  uint_t khz = 0;
+  ullong_t start, end;
+  //        unsigned long flags;
+  unsigned long pit_tick_rate = 1193182UL;  /* 1.193182 MHz */
+  
+  //        spin_lock_irqsave(&pit_lock, flags);
+  
+  outb((inb(0x61) & ~0x02) | 0x01, 0x61);
+  
+  outb(0xb0, 0x43);
+  outb((pit_tick_rate / (1000 / 50)) & 0xff, 0x42);
+  outb((pit_tick_rate / (1000 / 50)) >> 8, 0x42);
+  //        start = get_cycles_sync();
+  rdtscll(start);
+  while ((inb(0x61) & 0x20) == 0);
+  rdtscll(end);
+  //   end = get_cycles_sync();
+  
+  //        spin_unlock_irqrestore(&pit_lock, flags);
+  
+  
+  //  return (end - start) / 50;
+  khz = end - start;
+;
+
+  return khz / 50;
+}
+
+
+
+/* END JRL */
+
+
+
 
 
 /*
@@ -51,7 +186,8 @@ int g_Quantum = DEFAULT_MAX_TICKS;
  * Ticks per second.
  * FIXME: should set this to something more reasonable, like 100.
  */
-#define TICKS_PER_SEC 18
+#define HZ 100
+//#define TICKS_PER_SEC 18
 
 /*#define DEBUG_TIMER */
 #ifdef DEBUG_TIMER
@@ -155,12 +291,16 @@ static void Calibrate_Delay(void)
        ;
 
     /*
-     * Execute the spin loop.
+     * Execute the spin loop.xs
      * The temporary interrupt handler will overwrite the
      * loop counter when the next tick occurs.
      */
+
+
     Spin(INT_MAX);
 
+
+
     Disable_Interrupts();
 
     /*
@@ -179,6 +319,9 @@ void Init_Timer(void)
 {
   ushort_t foo = 1193182L / HZ;
   
+  cpu_khz_freq = pit_calibrate_tsc();
+  PrintBoth("CPU KHZ=%lu\n", (ulong_t)cpu_khz_freq);
+
   PrintBoth("Initializing timer and setting to %d Hz...\n",HZ);
   
   /* Calibrate for delay loop */
@@ -198,7 +341,7 @@ void Init_Timer(void)
 }
 
 
-#define US_PER_TICK (TICKS_PER_SEC * 1000000)
+#define US_PER_TICK (HZ * 1000000)
 
 /*
  * Spin for at least given number of microseconds.
index 3666486..86c9ebf 100644 (file)
@@ -9,17 +9,16 @@
 #include <devices/timer.h>
 #include <devices/simple_pic.h>
 #include <devices/8259a.h>
+#include <devices/8254.h>
 #include <devices/keyboard.h>
 
 #include <palacios/vmm_intr.h>
 #include <palacios/vmm_dev_mgr.h>
+#include <palacios/vmm_time.h>
 
 #define SPEAKER_PORT 0x61
 
-
-
-
-inline void VM_Out_Byte(ushort_t port, uchar_t value)
+static inline void VM_Out_Byte(ushort_t port, uchar_t value)
 {
     __asm__ __volatile__ (
        "outb %b0, %w1"
@@ -31,7 +30,7 @@ inline void VM_Out_Byte(ushort_t port, uchar_t value)
 /*
  * Read a byte from an I/O port.
  */
-inline uchar_t VM_In_Byte(ushort_t port)
+static inline uchar_t VM_In_Byte(ushort_t port)
 {
     uchar_t value;
 
@@ -46,6 +45,7 @@ inline uchar_t VM_In_Byte(ushort_t port)
 
 
 
+
 int IO_Read(ushort_t port, void * dst, uint_t length, void * priv_data) {
 
   if (length != 1) {
@@ -182,7 +182,7 @@ int RunVMM(struct Boot_Info * bootInfo) {
     os_hooks.paddr_to_vaddr = &Identity;
     os_hooks.hook_interrupt = &hook_irq_stub;
     os_hooks.ack_irq = &ack_irq;
+    os_hooks.get_cpu_khz = &get_cpu_khz;
 
     Init_VMM(&os_hooks, &vmm_ops);
   
@@ -190,6 +190,7 @@ int RunVMM(struct Boot_Info * bootInfo) {
     /* MOVE THIS TO AN INIT GUEST ROUTINE */
     init_shadow_map(&(vm_info.mem_map));
     init_shadow_page_state(&(vm_info.shdw_pg_state));
+    v3_init_time(&(vm_info.time_state));
     vm_info.page_mode = SHADOW_PAGING;
 
     vm_info.cpu_mode = REAL;
@@ -316,12 +317,14 @@ int RunVMM(struct Boot_Info * bootInfo) {
        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 * keyboard = create_keyboard();
+       struct vm_device * pit= create_pit();
 
        attach_device(&(vm_info), nvram);
        //attach_device(&(vm_info), timer);
        attach_device(&(vm_info), pic);
-       attach_device(&(vm_info), keyboard);
+       attach_device(&(vm_info), pit);
+       //attach_device(&(vm_info), keyboard);
 
        PrintDebugDevMgr(&(vm_info.dev_mgr));
       }
index aae2376..c83e6d5 100644 (file)
@@ -1,6 +1,36 @@
 #include <geekos/vmm_stubs.h>
 #include <geekos/serial.h>
 #include <palacios/vm_guest.h>
+#include <geekos/debug.h>
+
+
+
+static inline void VM_Out_Byte(ushort_t port, uchar_t value)
+{
+    __asm__ __volatile__ (
+       "outb %b0, %w1"
+       :
+       : "a" (value), "Nd" (port)
+    );
+}
+
+/*
+ * Read a byte from an I/O port.
+ */
+static inline uchar_t VM_In_Byte(ushort_t port)
+{
+    uchar_t value;
+
+    __asm__ __volatile__ (
+       "inb %w1, %b0"
+       : "=a" (value)
+       : "Nd" (port)
+    );
+
+    return value;
+}
+
+
 
 
 void * Identity(void *addr) { return addr; };
@@ -55,7 +85,7 @@ static void pic_intr_handler(struct Interrupt_State * state) {
   SerialPrint("Interrupt %d (IRQ=%d)\n", state->intNum, state->intNum - 32);
 
   if (info) {
-    info->vm_ops.raise_irq(info, state->intNum - 32, state->errorCode);
+    info->vm_ops.raise_irq(info, state->intNum - 32);
   } else {
     SerialPrint("Interrupt handler error: NULL pointer found, no action taken\n");
     End_IRQ(state);
@@ -91,3 +121,82 @@ int ack_irq(int irq) {
 void Init_Stubs() {
   memset(irq_map, 0, sizeof(struct guest_info *) * 256);
 }
+
+
+unsigned int get_cpu_khz() {
+  extern uint_t cpu_khz_freq;
+
+  unsigned long  print_khz = (unsigned long)(cpu_khz_freq & 0xffffffff);
+  
+  PrintBoth("Detected %lu.%lu MHz CPU\n", print_khz / 1000, print_khz % 1000);
+
+  return cpu_khz_freq;
+}
+
+
+
+
+#if 0
+
+
+/* ------ Calibrate the TSC ------- 
+ * Return processor ticks per second / CALIBRATE_FRAC.
+ *
+ * Ported From Xen
+ */
+#define PIT_MODE 0x43
+#define PIT_CH2 0x42
+#define CLOCK_TICK_RATE 1193180 /* system crystal frequency (Hz) */
+#define CALIBRATE_FRAC  20      /* calibrate over 50ms */
+#define CALIBRATE_LATCH ((CLOCK_TICK_RATE+(CALIBRATE_FRAC/2))/CALIBRATE_FRAC)
+
+
+unsigned long long get_cpu_khz() {
+    ullong_t start, end;
+    unsigned long count;
+    unsigned long long tmp;
+    unsigned long print_tmp; 
+
+    /* Set the Gate high, disable speaker */
+    VM_Out_Byte((VM_In_Byte(0x61) & ~0x02) | 0x01, 0x61);
+
+    /*
+     * Now let's take care of CTC channel 2
+     *
+     * Set the Gate high, program CTC channel 2 for mode 0, (interrupt on
+     * terminal count mode), binary count, load 5 * LATCH count, (LSB and MSB)
+     * to begin countdown.
+     */
+    VM_Out_Byte(0xb0, PIT_MODE);           /* binary, mode 0, LSB/MSB, Ch 2 */
+    VM_Out_Byte(CALIBRATE_LATCH & 0xff, PIT_CH2); /* LSB of count */
+    VM_Out_Byte(CALIBRATE_LATCH >> 8, PIT_CH2);   /* MSB of count */
+
+    rdtscll(start);
+    for ( count = 0; (VM_In_Byte(0x61) & 0x20) == 0; count++ )
+        continue;
+    rdtscll(end);
+
+    /* Error if the CTC doesn't behave itself. */
+    if ( count == 0 ) {
+     PrintBoth("CPU Frequency Calibration Error\n");
+      return 0;
+    }
+
+    tmp = ((end - start) * (ullong_t)CALIBRATE_FRAC);
+
+    do_div(tmp, 1000);
+
+    tmp &= 0xffffffff;
+    print_tmp = (unsigned long)tmp;
+
+   PrintBoth("Detected %lu.%lu MHz CPU\n", print_tmp / 1000, print_tmp % 1000);
+    return tmp;
+}
+
+#undef PIT_CH2
+#undef PIT_MODE
+#undef CLOCK_TICK_RATE
+#undef CALIBRATE_FRAC  
+#undef CALIBRATE_LATCH 
+
+#endif
index 7889c11..e62f5a7 100644 (file)
@@ -132,29 +132,33 @@ int init_svm_guest(struct guest_info *info) {
 
 // can we start a kernel thread here...
 int start_svm_guest(struct guest_info *info) {
-
-
+  vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
+  vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));
 
   PrintDebug("Launching SVM VM (vmcb=%x)\n", info->vmm_data);
   //PrintDebugVMCB((vmcb_t*)(info->vmm_data));
 
   while (1) {
+    ullong_t tmp_tsc;
 
     CLGI();
 
+    rdtscll(info->time_state.cached_host_tsc);
+    guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc;
     //PrintDebug("SVM Launch Args (vmcb=%x), (info=%x), (vm_regs=%x)\n", info->vmm_data,  &(info->vm_regs));
     //PrintDebug("Launching to RIP: %x\n", info->rip);
     safe_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs));
     //launch_svm((vmcb_t*)(info->vmm_data));
     //PrintDebug("SVM Returned\n");
-
+    rdtscll(tmp_tsc);
+    info->time_state.guest_tsc += tmp_tsc - info->time_state.cached_host_tsc;
     
 
     STGI();
 
      
     if (handle_svm_exit(info) != 0) {
-      vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
+
       addr_t host_addr;
       addr_t linear_addr = 0;
 
index 4ab4979..3da68a6 100644 (file)
@@ -36,7 +36,12 @@ int handle_svm_exit(struct guest_info * info) {
 
   exit_code = guest_ctrl->exit_code;
  
-  //PrintDebug("SVM Returned: Exit Code: %x\n",exit_code); 
+
+  // Disable printing io exits due to bochs debug messages
+  if (!((exit_code == VMEXIT_IOIO) && ((ushort_t)(guest_ctrl->exit_info1 >> 16) == 0x402))) {
+
+    PrintDebug("SVM Returned: Exit Code: %x \t\t(tsc=%ul)\n",exit_code, (uint_t)info->time_state.guest_tsc); 
+  }
   // PrintDebugVMCB((vmcb_t*)(info->vmm_data));
 
 
index 8cb45b4..26d973e 100644 (file)
@@ -6,7 +6,9 @@
 struct vm_device * allocate_device() {
 
   struct vm_device * dev = NULL;
-  V3_Malloc(struct vm_device *, dev, sizeof(struct vm_device));
+  dev = (struct vm_device*)V3_Malloc(sizeof(struct vm_device));
+
+  V3_ASSERT(dev != NULL);
 
   dev->ops = NULL;
   memset(dev->name, 0, 32);
index 04d7448..7f536bf 100644 (file)
@@ -2,7 +2,7 @@
 #include <palacios/vmm_dev_mgr.h>
 #include <palacios/vm_guest.h>
 #include <palacios/vmm.h>
-#include <palacios/vmm_irq.h>
+
 
 extern struct vmm_os_hooks *os_hooks;
 
@@ -160,120 +160,6 @@ int dev_unhook_io(struct vm_device   *dev,
 }
 
 
-
-
-/* IRQ HOOKS */
-/*
-int dev_mgr_add_irq_hook(struct vmm_dev_mgr * mgr, struct dev_irq_hook * hook) {
-  list_add(&(hook->mgr_list), &(mgr->irq_hooks));
-  mgr->num_irq_hooks++;
-  return 0;
-}
-
-
-int dev_mgr_remove_irq_hook(struct vmm_dev_mgr * mgr, struct dev_irq_hook * hook) {
-  list_del(&(hook->mgr_list));
-  mgr->num_irq_hooks--;
-
-  return 0;
-}
-
-
-int dev_add_irq_hook(struct vm_device * dev, struct dev_irq_hook * hook) {
-  list_add(&(hook->dev_list), &(dev->irq_hooks));
-  dev->num_irq_hooks++;
-  return 0;
-}
-
-
-int dev_remove_irq_hook(struct vm_device * dev, struct dev_irq_hook * hook) {
-  list_del(&(hook->dev_list));
-  dev->num_irq_hooks--;
-
-  return 0;
-}
-
-
-
-
-
-struct dev_irq_hook * dev_mgr_find_irq_hook(struct vmm_dev_mgr * mgr, uint_t irq) {
-  struct dev_irq_hook * tmp;
-
-  list_for_each_entry(tmp, &(mgr->irq_hooks), mgr_list) {
-    if (tmp->irq == irq) {
-      return tmp;
-    }
-  }
-  return NULL;
-}
-
-struct dev_irq_hook * dev_find_irq_hook(struct vm_device * dev, uint_t irq) {
-  struct dev_irq_hook * tmp;
-
-  list_for_each_entry(tmp, &(dev->irq_hooks), dev_list) {
-    if (tmp->irq == irq) {
-      return tmp;
-    }
-  }
-  return NULL;
-}
-
-
-
-
-int dev_hook_irq(struct vm_device   *dev,
-                uint_t irq,
-                int (*handler)(uint_t irq, struct vm_device * dev)) {
-
-  struct dev_irq_hook *hook = os_hooks->malloc(sizeof(struct dev_irq_hook));
-  
-  if (!hook) { 
-    return -1;
-  }
-
-
-  if (hook_irq(&(dev->vm->irq_map), irq, 
-              (int (*)(uint_t, void *))handler, 
-              (void *)dev) == 0) {
-
-    hook->dev = dev;
-    hook->irq = irq;
-    hook->handler = handler;
-    
-    dev_mgr_add_irq_hook(&(dev->vm->dev_mgr), hook);
-    dev_add_irq_hook(dev, hook);
-  } else {
-    return -1;
-  }
-
-  return 0;
-}
-
-
-int dev_unhook_irq(struct vm_device * dev,
-                  uint_t irq) {
-
-  struct vmm_dev_mgr * mgr = &(dev->vm->dev_mgr);
-  struct dev_irq_hook * hook = dev_mgr_find_irq_hook(mgr, irq);
-
-  if (!hook) { 
-    return -1;
-  }
-
-  dev_mgr_remove_irq_hook(mgr, hook);
-  dev_remove_irq_hook(dev, hook);
-
-  return unhook_irq(&(dev->vm->irq_map), irq);
-}
-
-
-*/
-
-
-
-
-
 int attach_device(struct guest_info * vm, struct vm_device * dev) {
   struct vmm_dev_mgr *mgr= &(vm->dev_mgr);
   
@@ -304,16 +190,13 @@ int dev_mgr_hook_mem(struct guest_info    *vm,
                     void               *end)
 {
 
-  struct dev_mem_hook *hook;
-  V3_Malloc(struct dev_mem_hook *, hook,sizeof(struct dev_mem_hook));
-  
+  struct dev_mem_hook * hook = (struct dev_mem_hook*)V3_Malloc(sizeof(struct dev_mem_hook));
+  //  V3_Malloc(struct dev_mem_hook *, hook,sizeof(struct dev_mem_hook));
+
   if (!hook) { 
     return -1;
   }
 
-
-    
-
   /* not implemented yet
   hook_memory(vm->mem_map, 
              guest_physical_address_start, 
index f0f177e..e1dbfd8 100644 (file)
@@ -62,7 +62,7 @@ int raise_exception(struct guest_info * info, uint_t excp) {
 }
 
 
-int raise_irq(struct guest_info * info, int irq, int error_code) {
+int raise_irq(struct guest_info * info, int irq) {
   // Look up PIC and resend
   V3_ASSERT(info);
   V3_ASSERT(info->intr_state.controller);
@@ -70,7 +70,7 @@ int raise_irq(struct guest_info * info, int irq, int error_code) {
 
   //  if ((info->intr_state.controller) && 
   //  (info->intr_state.controller->raise_intr)) {
-    info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq, error_code);
+    info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq);
     //} else {
     // PrintDebug("There is no registered Interrupt Controller... (NULL POINTER)\n");
     // return -1;
diff --git a/palacios/src/palacios/vmm_irq.c b/palacios/src/palacios/vmm_irq.c
deleted file mode 100644 (file)
index 1074245..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-#if 0
-#include <palacios/vmm_irq.h>
-#include <palacios/vmm.h>
-
-void init_irq_map(struct vmm_irq_map * map) {
-  map->head = NULL;
-  map->num_hooks = 0;
-}
-
-
-int add_irq_hook(struct vmm_irq_map * map, struct vmm_irq_hook * hook) {
-  if (!(map->head)) {
-    map->head = hook;
-    map->num_hooks = 1;
-    return 0;
-  } else if (map->head->irq > hook->irq) {
-    hook->next = map->head;
-
-    map->head->prev = hook;
-    map->head = hook;
-    map->num_hooks++;
-
-    return 0;
-  } else {
-    struct vmm_irq_hook * tmp_hook = map->head;
-    while ((tmp_hook->next) &&
-          (tmp_hook->next->irq <= hook->irq)) {
-      tmp_hook = tmp_hook->next;
-    }
-
-    if (tmp_hook->irq == hook->irq) {
-      return -1;
-    } else {
-      hook->prev = tmp_hook;
-      hook->next = tmp_hook->next;
-
-      if (tmp_hook->next) {
-       tmp_hook->next->prev = hook;
-      }
-
-      tmp_hook->next = hook;
-
-      map->num_hooks++;
-      return 0;
-    }
-  }
-  return -1;
-}
-
-
-int remove_irq_hook(struct vmm_irq_map * map, struct vmm_irq_hook * hook) {
-  if (map->head == hook) {
-    map->head = hook->next;
-  } else if (hook->prev) {
-    hook->prev->next = hook->next;
-  } else {
-    return -1;
-  }
-
-  if (hook->next) {
-    hook->next->prev = hook->prev;
-  }
-
-  map->num_hooks--;
-
-  return 0;
-}
-
-
-int hook_irq(struct vmm_irq_map * map, uint_t irq, 
-            int(*handler)(uint_t irq, void * private_data), 
-            void * private_data) {
-
-  struct vmm_irq_hook * hook = NULL;
-  V3_Malloc(struct vmm_irq_hook *, hook, sizeof(struct vmm_irq_hook));
-
-  if (!hook) {
-    // big problems
-    return -1;
-  }
-
-  hook->irq = irq;
-  hook->handler = handler;
-  hook->private_data = private_data;
-  hook->next = NULL;
-  hook->prev = NULL;
-  
-  if (add_irq_hook(map, hook) != 0) {
-    V3_Free(hook);
-    return -1;
-  }
-
-  return 0;
-}
-
-
-int unhook_irq(struct vmm_irq_map * map, uint_t irq) {
-  struct vmm_irq_hook * hook = get_irq_hook(map, irq);
-
-  if (!hook) {
-    return -1;
-  }
-
-  remove_irq_hook(map, hook);
-  return 0;
-}
-
-
-struct vmm_irq_hook * get_irq_hook(struct vmm_irq_map * map, uint_t irq) {
-  struct vmm_irq_hook * tmp_hook = map->head;
-  
-  while (tmp_hook) {
-    if (tmp_hook->irq == irq) {
-      return tmp_hook;
-    }
-    tmp_hook = tmp_hook->next;
-  }
-  return NULL;
-}
-
-
-#endif
diff --git a/palacios/src/palacios/vmm_time.c b/palacios/src/palacios/vmm_time.c
new file mode 100644 (file)
index 0000000..027236d
--- /dev/null
@@ -0,0 +1,49 @@
+#include "palacios/vmm_time.h"
+#include "palacios/vmm.h"
+
+
+void v3_init_time(struct vm_time * time_state) {
+  ullong_t cpu_khz = 0;
+
+  V3_CPU_KHZ(cpu_khz);
+  time_state->cpu_freq = cpu_khz;
+
+  PrintDebug("CPU KHZ = HI=%x LO=%x\n", (uint_t)(cpu_khz >> 32), (uint_t)cpu_khz);
+  time_state->guest_tsc = 0;
+  time_state->cached_host_tsc = 0;
+  time_state->pending_cycles = 0;
+  
+  INIT_LIST_HEAD(&(time_state->timers));
+  time_state->num_timers = 0;
+}
+
+
+int v3_add_timer(struct guest_info * info, struct vm_timer_ops * ops, void * private_data) {
+  //  V3_Malloc
+
+  /*
+  list_add(&(timer->timer_link), &(info->time_state.timers));
+  info->time_state.num_timers++;
+  */
+  return 0;
+}
+
+int remove_timer(struct guest_info * info, struct vm_timer * timer) {
+  list_del(&(timer->timer_link));
+  info->time_state.num_timers--;
+
+  return 0;
+}
+
+
+void update_timers(struct guest_info * info) {
+  struct vm_timer * tmp_timer;
+  
+  list_for_each_entry(tmp_timer, &(info->time_state.timers), timer_link) {
+    tmp_timer->ops.update_time(info->time_state.pending_cycles, info->time_state.cpu_freq, tmp_timer->private_data);
+  }
+
+
+  info->time_state.pending_cycles = 0;
+}