X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=19933a5f938be0e5063d5fa353104e38da462618;hb=b85f79b8030114370851ed3422c078debe630570;hp=87bea697c760257709da6ce51ef28366dd65d646;hpb=04fc4c8fbac29e04f0d0817a2906687c2c972559;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 87bea69..19933a5 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.18 $ + * $Revision: 1.28 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -31,23 +31,13 @@ #include #include + #include #include - - -extern void Get_MSR(ulong_t msr, unsigned int *val1, unsigned int *val2); -extern void Set_MSR(ulong_t msr, ulong_t val1, ulong_t val2); -extern uint_t Get_EIP(); -extern uint_t Get_ESP(); -extern uint_t Get_EBP(); - - -int foo=42; - #define SPEAKER_PORT 0x61 @@ -97,19 +87,49 @@ inline uchar_t MyIn_Byte(ushort_t port) } -extern void MyBuzzVM(); -#define MYBUZZVM_START MyBuzzVM -#define MYBUZZVM_LEN 0x3d +int IO_Read(ushort_t port, void * dst, uint_t length) { + uchar_t * iter = dst; + uint_t i; + + for (i = 0; i < length; i++) { + *iter = MyIn_Byte(port); + iter++; + } + + return 0; +} + + + +int IO_Write(ushort_t port, void * src, uint_t length) { + uchar_t * iter = src; + uint_t i; + + + for (i = 0; i < length; i++) { + MyOut_Byte(port, *iter); + iter++; + } + + return 0; +} + void BuzzVM() { int x; int j; unsigned char init; - + +#if 0 + __asm__ __volatile__ ( + "popf" + ); - SerialPrint("Starting To Buzz\n"); +#endif + + PrintBoth("Starting To Buzz\n"); init=MyIn_Byte(SPEAKER_PORT); @@ -125,15 +145,7 @@ void BuzzVM() } } -extern void RunVM(); - -int vmRunning = 0; - -void RunVM() { - vmRunning = 1; - while(1); -} @@ -221,8 +233,6 @@ void Main(struct Boot_Info* bootInfo) { struct Kernel_Thread * key_thread; struct Kernel_Thread * spkr_thread; - // struct Kernel_Thread * vm_thread; - // struct VMDescriptor vm; ulong_t doIBuzz = 0; @@ -244,13 +254,13 @@ void Main(struct Boot_Info* bootInfo) // Init_IDE(); - Print("Done; stalling\n"); + // Print("Done; stalling\n"); -#if 0 - SerialPrint("Dumping VM kernel Code (first 512 bytes @ 0x%x)\n",VM_KERNEL_START); - SerialMemDump((unsigned char *)VM_KERNEL_START, 512); +#if 1 + SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000); + SerialMemDump((unsigned char *)0x100000, 256); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); @@ -258,24 +268,31 @@ void Main(struct Boot_Info* bootInfo) #endif #if 0 - SerialPrint("Dumping GUEST KERNEL CODE (first 512*2 bytes @ 0x100000)\n"); - SerialMemDump((unsigned char *)0x100000, 512*2); + SerialPrint("Dumping BIOS code f0000-fffff\n\n"); + SerialMemDump((unsigned char *)0xf0000, 65536); + /* + SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); + SerialMemDump((unsigned char *)VM_KERNEL_START, 512); + */ #endif +#if 1 + SerialPrintLevel(1000,"Launching 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 { struct vmm_os_hooks os_hooks; struct vmm_ctrl_ops vmm_ops; - guest_info_t vm_info; + struct guest_info vm_info; addr_t rsp; addr_t rip; memset(&os_hooks, 0, sizeof(struct vmm_os_hooks)); memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops)); - memset(&vm_info, 0, sizeof(guest_info_t)); + memset(&vm_info, 0, sizeof(struct guest_info)); os_hooks.print_debug = &PrintBoth; os_hooks.print_info = &Print; @@ -284,73 +301,72 @@ void Main(struct Boot_Info* bootInfo) os_hooks.free_page = &Free_VMM_Page; os_hooks.malloc = &VMM_Malloc; os_hooks.free = &VMM_Free; + os_hooks.vaddr_to_paddr = &Identity; + os_hooks.paddr_to_vaddr = &Identity; + // DumpGDT(); Init_VMM(&os_hooks, &vmm_ops); + init_shadow_map(&(vm_info.mem_map)); + init_shadow_page_state(&(vm_info.shdw_pg_state)); + vm_info.page_mode = SHADOW_PAGING; - init_mem_layout(&(vm_info.mem_layout)); - init_mem_list(&(vm_info.mem_list)); - - - add_mem_list_pages(&(vm_info.mem_list), vm_range_start, (vm_range_end - vm_range_start) / PAGE_SIZE); - // add_unmapped_mem_range(&(vm_info.mem_layout), 0, 256); - //add_shared_mem_range(&(vm_info.mem_layout), guest_kernel_start, (guest_kernel_end - guest_kernel_start) / PAGE_SIZE, guest_kernel_start); - //add_guest_mem_range(&(vm_info.mem_layout), guest_kernel_end, 20); - - add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); + vm_info.cpu_mode = REAL; - rip = (ulong_t)(void*)&BuzzVM; - vm_info.rip = rip; - rsp = (ulong_t)Alloc_Page(); - vm_info.rsp = rsp; + init_vmm_io_map(&(vm_info.io_map)); + + if (0) { + + // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000); + // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); + + rip = (ulong_t)(void*)&BuzzVM; + // rip -= 0x10000; + // rip = (addr_t)(void*)&exit_test; + // rip -= 0x2000; + vm_info.rip = rip; + rsp = (addr_t)Alloc_Page(); + + vm_info.vm_regs.rsp = (rsp +4092 );// - 0x2000; + + + } else { + //add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000); + // add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x100000, 0x0); + + shadow_region_t *ent = Malloc(sizeof(shadow_region_t));; + init_shadow_region_physical(ent,0,0x100000,GUEST_REGION_PHYSICAL_MEMORY, + 0x100000, HOST_REGION_PHYSICAL_MEMORY); + add_shadow_region(&(vm_info.mem_map),ent); + + hook_io_port(&(vm_info.io_map), 0x61, &IO_Read, &IO_Write); + hook_io_port(&(vm_info.io_map), 0x05, &IO_Read, &IO_Write); + + /* + vm_info.cr0 = 0; + vm_info.cs.base=0xf000; + vm_info.cs.limit=0xffff; + */ + //vm_info.rip = 0xfff0; + + vm_info.rip = 0; + vm_info.vm_regs.rsp = 0x0; + } - SerialPrint("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", rip, rsp); + PrintBoth("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", (uint_t)vm_info.rip,(uint_t)vm_info.vm_regs.rsp); (vmm_ops).init_guest(&vm_info); - SerialPrint("Starting Guest\n"); + PrintBoth("Starting Guest\n"); (vmm_ops).start_guest(&vm_info); - } - SerialPrintLevel(1000,"Launching Noisemaker and keyboard listener threads\n"); - - - - - - - - /* - // jump into vmxassist - vm.entry_ip=(uint_t)0x00107fd0; - vm.exit_eip=0; - // Put the stack at 512K - vm.guest_esp=(uint_t)4096 + 8192 - 4; - *(unsigned int *)(vm.guest_esp) = 1024 * 1024; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = 8; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = vm.guest_esp + 4;; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = vm.entry_ip; - // vm.guest_esp -= 4; - - - SerialMemDump((unsigned char *)vm.entry_ip, 512); - */ - - // vm_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,PRIORITY_NORMAL,false); - - SerialPrintLevel(1000,"Next: setup GDT\n"); - TODO("Write a Virtual Machine Monitor"); - - /* Now this thread is done. */ + Exit(0); }