X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=9877cd76247a53e2252886cabfe8c9767eb5ad7c;hb=29dcf8d7134d5c8fe56ec1f3ffaaa37192ce6fb8;hp=e59be37e9062843a6f2bfd96d7fffcc7bf66d2e1;hpb=122a7d532b4bb6914ff291d53f6111f1e52613b7;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index e59be37..9877cd7 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.20 $ + * $Revision: 1.29 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -31,6 +31,7 @@ #include #include + #include @@ -87,7 +88,7 @@ inline uchar_t MyIn_Byte(ushort_t port) -int IO_Read(ushort_t port, void * dst, uint_t length) { +int IO_Read(ushort_t port, void * dst, uint_t length, uint_t io_width) { uchar_t * iter = dst; uint_t i; @@ -101,7 +102,7 @@ int IO_Read(ushort_t port, void * dst, uint_t length) { -int IO_Write(ushort_t port, void * src, uint_t length) { +int IO_Write(ushort_t port, void * src, uint_t length, uint_t io_width) { uchar_t * iter = src; uint_t i; @@ -115,12 +116,26 @@ int IO_Write(ushort_t port, void * src, uint_t length) { } + +int IO_Write_to_Serial(ushort_t port, void * src, uint_t length, uint_t io_width) { + SerialPrint("Output from Guest on port %d (0x%x) Length=%d\n", port, port, length); + SerialMemDump(src, length); + return length; +} + + void BuzzVM() { int x; int j; unsigned char init; - + +#if 0 + __asm__ __volatile__ ( + "popf" + ); + +#endif PrintBoth("Starting To Buzz\n"); @@ -247,36 +262,45 @@ void Main(struct Boot_Info* bootInfo) // Init_IDE(); - Print("Done; stalling\n"); + // Print("Done; stalling\n"); #if 1 SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000); - SerialMemDump((unsigned char *)0xfe000, 4096); + SerialMemDump((unsigned char *)0x100000, 256); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ #endif +#if 0 + 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 - while (1); +#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; @@ -285,26 +309,26 @@ 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; + + vm_info.cpu_mode = REAL; - init_mem_layout(&(vm_info.mem_layout)); - init_mem_list(&(vm_info.mem_list)); init_vmm_io_map(&(vm_info.io_map)); - 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); - if (0) { // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000); - add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); + // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); rip = (ulong_t)(void*)&BuzzVM; // rip -= 0x10000; @@ -313,21 +337,33 @@ void Main(struct Boot_Info* bootInfo) vm_info.rip = rip; rsp = (addr_t)Alloc_Page(); - vm_info.rsp = (rsp +4092 );// - 0x2000; + 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); + // 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); - - vm_info.rip = 0xff00; - vm_info.rsp = 0x0; + hook_io_port(&(vm_info.io_map), 0x05, &IO_Read, &IO_Write_to_Serial); + + /* + 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; } - PrintBoth("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", (uint_t)vm_info.rip,(uint_t)vm_info.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); PrintBoth("Starting Guest\n"); (vmm_ops).start_guest(&vm_info);