From: Jack Lange Date: Wed, 21 May 2008 23:00:50 +0000 (+0000) Subject: lot of changes X-Git-Tag: boot386puppy-26-to-ide~40 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=d8fc6aa4bc2a5d9cec50923e9d2bd30f867dd50a lot of changes --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index d1bfc67..c830894 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -1,6 +1,6 @@ # Makefile for GeekOS kernel, userspace, and tools # Copyright (c) 2004,2005 David H. Hovemeyer -# $Revision: 1.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) diff --git a/palacios/build/depend.mak b/palacios/build/depend.mak index 0d20b9b..78abffa 100644 --- a/palacios/build/depend.mak +++ b/palacios/build/depend.mak @@ -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 index 0000000..4123bb9 --- /dev/null +++ b/palacios/include/devices/8254.h @@ -0,0 +1,14 @@ +#ifndef __8254_H +#define __8254_H + +#include + + + +struct vm_device * create_pit(); + + + + + +#endif diff --git a/palacios/include/geekos/vmm_stubs.h b/palacios/include/geekos/vmm_stubs.h index 5a4b4cb..396e614 100644 --- a/palacios/include/geekos/vmm_stubs.h +++ b/palacios/include/geekos/vmm_stubs.h @@ -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 diff --git a/palacios/include/palacios/vm_guest.h b/palacios/include/palacios/vm_guest.h index 89e6590..0987f95 100644 --- a/palacios/include/palacios/vm_guest.h +++ b/palacios/include/palacios/vm_guest.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include 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; }; diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 01d4d35..ec36284 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -53,7 +53,7 @@ } while (0) \ - +/* #define V3_Malloc(type, var, size) \ do { \ extern struct vmm_os_hooks * os_hooks; \ @@ -62,7 +62,16 @@ 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) \ @@ -73,6 +82,14 @@ } \ } 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 }; diff --git a/palacios/include/palacios/vmm_dev_mgr.h b/palacios/include/palacios/vmm_dev_mgr.h index 080de99..ed49769 100644 --- a/palacios/include/palacios/vmm_dev_mgr.h +++ b/palacios/include/palacios/vmm_dev_mgr.h @@ -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); diff --git a/palacios/include/palacios/vmm_emulate.h b/palacios/include/palacios/vmm_emulate.h index fb1436b..26d4c6f 100644 --- a/palacios/include/palacios/vmm_emulate.h +++ b/palacios/include/palacios/vmm_emulate.h @@ -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)) diff --git a/palacios/include/palacios/vmm_intr.h b/palacios/include/palacios/vmm_intr.h index 402d6f9..eccf8fc 100644 --- a/palacios/include/palacios/vmm_intr.h +++ b/palacios/include/palacios/vmm_intr.h @@ -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 index 26958e2..0000000 --- a/palacios/include/palacios/vmm_irq.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __VMM_IRQ_H -#define __VMM_IRQ_H - -#if 0 -#include - - -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 index 0000000..2411187 --- /dev/null +++ b/palacios/include/palacios/vmm_time.h @@ -0,0 +1,52 @@ +#ifndef __VMM_TIME_H +#define __VMM_TIME_H + + +#include +#include + +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 diff --git a/palacios/include/palacios/vmm_types.h b/palacios/include/palacios/vmm_types.h index 752cee1..fbc9743 100644 --- a/palacios/include/palacios/vmm_types.h +++ b/palacios/include/palacios/vmm_types.h @@ -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 diff --git a/palacios/include/palacios/vmm_util.h b/palacios/include/palacios/vmm_util.h index 323b977..95a0c8e 100644 --- a/palacios/include/palacios/vmm_util.h +++ b/palacios/include/palacios/vmm_util.h @@ -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 index 0000000..b11fb7e --- /dev/null +++ b/palacios/src/devices/8254.c @@ -0,0 +1,150 @@ +#include +#include +#include + +// 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; +} diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 7db595f..0f712b0 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -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); diff --git a/palacios/src/devices/simple_pic.c b/palacios/src/devices/simple_pic.c index 55eea77..7465ea0 100644 --- a/palacios/src/devices/simple_pic.c +++ b/palacios/src/devices/simple_pic.c @@ -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); diff --git a/palacios/src/devices/timer.c b/palacios/src/devices/timer.c index d941fe5..65d1a1b 100644 --- a/palacios/src/devices/timer.c +++ b/palacios/src/devices/timer.c @@ -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; diff --git a/palacios/src/geekos/keyboard.c b/palacios/src/geekos/keyboard.c index 28e0ff3..4853c48 100644 --- a/palacios/src/geekos/keyboard.c +++ b/palacios/src/geekos/keyboard.c @@ -1,7 +1,7 @@ /* * Keyboard driver * Copyright (c) 2001,2004 David H. Hovemeyer - * $Revision: 1.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; diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index de46041..a498a90 100644 --- a/palacios/src/geekos/main.c +++ b/palacios/src/geekos/main.c @@ -3,7 +3,7 @@ * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth * Copyright (c) 2004, Iulian Neamtiu - * $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 { diff --git a/palacios/src/geekos/timer.c b/palacios/src/geekos/timer.c index 113a17f..e0311a4 100644 --- a/palacios/src/geekos/timer.c +++ b/palacios/src/geekos/timer.c @@ -2,7 +2,7 @@ * GeekOS timer interrupt support * Copyright (c) 2001,2003 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth - * $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". @@ -18,7 +18,142 @@ #include #include -#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. diff --git a/palacios/src/geekos/vm.c b/palacios/src/geekos/vm.c index 3666486..86c9ebf 100644 --- a/palacios/src/geekos/vm.c +++ b/palacios/src/geekos/vm.c @@ -9,17 +9,16 @@ #include #include #include +#include #include #include #include +#include #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)); } diff --git a/palacios/src/geekos/vmm_stubs.c b/palacios/src/geekos/vmm_stubs.c index aae2376..c83e6d5 100644 --- a/palacios/src/geekos/vmm_stubs.c +++ b/palacios/src/geekos/vmm_stubs.c @@ -1,6 +1,36 @@ #include #include #include +#include + + + +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 diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 7889c11..e62f5a7 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -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; diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 4ab4979..3da68a6 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -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)); diff --git a/palacios/src/palacios/vm_dev.c b/palacios/src/palacios/vm_dev.c index 8cb45b4..26d973e 100644 --- a/palacios/src/palacios/vm_dev.c +++ b/palacios/src/palacios/vm_dev.c @@ -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); diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index 04d7448..7f536bf 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -2,7 +2,7 @@ #include #include #include -#include + 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, diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index f0f177e..e1dbfd8 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -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 index 1074245..0000000 --- a/palacios/src/palacios/vmm_irq.c +++ /dev/null @@ -1,122 +0,0 @@ -#if 0 -#include -#include - -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 index 0000000..027236d --- /dev/null +++ b/palacios/src/palacios/vmm_time.c @@ -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; +}