X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=18071b96d91166f0650e46db9ecd24acf29dc858;hb=158640d601f6c710cfce7bc4a6bd8f7e7847b7a3;hp=4da54610a04737b8e380611f018c93efe1742573;hpb=2e05f3b8f738466246add183c55bcb17abf33ec9;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 4da5461..18071b9 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.13 $ + * $Revision: 1.19 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -26,39 +26,16 @@ #include #include #include +#include #include #include #include -#include -#include - -/* - static inline unsigned int cpuid_ecx(unsigned int op) - { - unsigned int eax, ecx; - - __asm__("cpuid" - : "=a" (eax), "=c" (ecx) - : "0" (op) - : "bx", "dx" ); - - return ecx; - } -*/ - - - -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(); +#include -int foo=42; #define SPEAKER_PORT 0x61 @@ -109,10 +86,34 @@ 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() { @@ -121,7 +122,7 @@ void BuzzVM() unsigned char init; - SerialPrint("Starting To Buzz\n"); + PrintBoth("Starting To Buzz\n"); init=MyIn_Byte(SPEAKER_PORT); @@ -137,15 +138,7 @@ void BuzzVM() } } -extern void RunVM(); - -int vmRunning = 0; -void RunVM() { - vmRunning = 1; - - while(1); -} @@ -168,20 +161,6 @@ void Buzzer(ulong_t arg) { -void Hello(ulong_t arg) -{ - char *b="hello "; - char byte; - short port=0xe9; - int i; - while(1){ - for (i=0;i<6;i++) { - byte=b[i]; - __asm__ __volatile__ ("outb %b0, %w1" : : "a"(byte), "Nd"(port) ); - } - } -} - void Keyboard_Listener(ulong_t arg) { ulong_t * doIBuzz = (ulong_t*)arg; Keycode key_press; @@ -208,47 +187,13 @@ extern char BSS_START, BSS_END; extern char end; -/* -void VM_Thread(ulong_t arg) -{ - int ret; - struct VMDescriptor *vm = (struct VMDescriptor *) arg; - - SerialPrintLevel(100,"VM_Thread: Launching VM with (entry_ip=%x, exit_eip=%x, guest_esp=%x)\n", - vm->entry_ip, vm->exit_eip, vm->guest_esp); - - SerialPrintLevel(100,"VM_Thread: You should see nothing further from me\n"); - - - ret = VMLaunch(vm); - - - SerialPrintLevel(100,"VM_Thread: uh oh..."); - - switch (ret) { - case VMX_SUCCESS: - SerialPrintLevel(100,"Normal VMExit Occurred\n"); - break; - case VMX_FAIL_INVALID: - SerialPrintLevel(100,"Possibile invalid VMCS (%.8x)\n", ret); - break; - case VMX_FAIL_VALID: - SerialPrintLevel(100,"Valid VMCS, errorcode recorded in VMCS\n"); - break; - case VMM_ERROR: - SerialPrintLevel(100,"VMM Error\n"); - break; - default: - SerialPrintLevel(100,"VMLaunch returned unknown error (%.8x)\n", ret); - break; - } - - SerialPrintLevel(100,"VM_Thread: Spinning\n"); - while (1) {} - -} -*/ +/* This is an ugly hack to get at the VM memory */ +ulong_t vm_range_start; +ulong_t vm_range_end; +ulong_t guest_kernel_start; +ulong_t guest_kernel_end; +/* ** */ int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte) @@ -281,8 +226,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; @@ -308,119 +251,94 @@ void Main(struct Boot_Info* bootInfo) -#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, 128); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ #endif -#if 0 - SerialPrint("Dumping GUEST KERNEL CODE (first 512*2 bytes @ 0x100000)\n"); - SerialMemDump((unsigned char *)0x100000, 512*2); -#endif - - - - { - struct vmm_os_hooks os_hooks; - struct vmm_ctrl_ops vmm_ops; - guest_info_t vm_info; - 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)); - - os_hooks.print_debug = &PrintBoth; - os_hooks.print_info = &Print; - os_hooks.print_trace = &SerialPrint; - os_hooks.Allocate_Pages = &Allocate_VMM_Pages; - os_hooks.Free_Page = &Free_VMM_Page; - - Init_VMM(&os_hooks, &vmm_ops); - - - - vm_info.rip = (ullong_t)(void*)&BuzzVM; - vm_info.rsp = (ulong_t)Alloc_Page(); - - SerialPrint("Initializing Guest\n"); - (vmm_ops).init_guest(&vm_info); - SerialPrint("Starting Guest\n"); - (vmm_ops).start_guest(&vm_info); - - } 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); - - - - - // Try to launch a real VM - - - // We now map pages of physical memory into where we are going - // to slap the vmxassist, bios, and vgabios code - /* - pte_t template_pte; - - template_pte.present=1; - template_pte.flags=VM_WRITE|VM_READ|VM_USER|VM_EXEC; - template_pte.accessed=0; - template_pte.dirty=0; - template_pte.pteAttribute=0; - template_pte.globalPage=0; - template_pte.kernelInfo=0; - - SerialPrintLevel(1000,"Allocating Pages for VM kernel\n"); + { + struct vmm_os_hooks os_hooks; + struct vmm_ctrl_ops vmm_ops; + guest_info_t 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)); + + os_hooks.print_debug = &PrintBoth; + os_hooks.print_info = &Print; + os_hooks.print_trace = &SerialPrint; + os_hooks.allocate_pages = &Allocate_VMM_Pages; + os_hooks.free_page = &Free_VMM_Page; + os_hooks.malloc = &VMM_Malloc; + os_hooks.free = &VMM_Free; + + + // DumpGDT(); + Init_VMM(&os_hooks, &vmm_ops); -#define SEGLEN (1024*64) - AllocateAndMapPagesForRange(START_OF_VM+0x100000, VM_KERNEL_LENGTH / 512, template_pte); -*/ - // Now we should be copying into actual memory + init_mem_layout(&(vm_info.mem_layout)); + init_mem_list(&(vm_info.mem_list)); + init_vmm_io_map(&(vm_info.io_map)); - //SerialPrintLevel(1000,"Copying VM code from %x to %x (%d bytes)\n", VM_KERNEL_START, START_OF_VM+0x100000,VM_KERNEL_LENGTH); - //memcpy((char*)(START_OF_VM+0x100000),(char*)VM_KERNEL_START,VM_KERNEL_LENGTH); + + 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); + + 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.rsp = (rsp +4092 );// - 0x2000; + + + } else { + add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000); + + + + hook_io_port(&(vm_info.io_map), 0x61, &IO_Read, &IO_Write); + + vm_info.rip = 0x0; + vm_info.rsp = 0x0; + } - //SerialPrintLevel(1000, "VM copied\n"); + PrintBoth("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", (uint_t)vm_info.rip,(uint_t)vm_info.rsp); + (vmm_ops).init_guest(&vm_info); + PrintBoth("Starting Guest\n"); + (vmm_ops).start_guest(&vm_info); + } - /* - // 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); }