X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=87bea697c760257709da6ce51ef28366dd65d646;hb=04fc4c8fbac29e04f0d0817a2906687c2c972559;hp=2cd5a6a7909034395126d0abc5a518b3978d78be;hpb=8126d0d154dfd37ed7997f4fa78a1c179c4d2c81;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 2cd5a6a..87bea69 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.10 $ + * $Revision: 1.18 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -26,26 +26,16 @@ #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; - } -*/ +#include + @@ -118,7 +108,9 @@ void BuzzVM() int j; unsigned char init; - + + SerialPrint("Starting To Buzz\n"); + init=MyIn_Byte(SPEAKER_PORT); while (1) { @@ -146,9 +138,6 @@ void RunVM() { -extern uint_t VMCS_STORE(); -extern uint_t VMCS_READ(); - void Buzzer(ulong_t arg) { @@ -165,19 +154,7 @@ 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; @@ -205,47 +182,15 @@ 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"); +/* 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; +/* ** */ - 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) {} - -} -*/ - int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte) { uint_t address; @@ -285,7 +230,7 @@ void Main(struct Boot_Info* bootInfo) Init_Screen(); - InitSerial(); + Init_Serial(); Init_Mem(bootInfo); Init_CRC32(); Init_TSS(); @@ -312,62 +257,70 @@ void Main(struct Boot_Info* bootInfo) */ #endif -#if 1 +#if 0 SerialPrint("Dumping GUEST KERNEL CODE (first 512*2 bytes @ 0x100000)\n"); SerialMemDump((unsigned char *)0x100000, 512*2); #endif + 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); - - SerialPrint("\n\nHello, Welcome to this horrid output-only serial interface\n"); - SerialPrint("Eventually, this will let us control the VMM\n\n"); - - SerialPrint("\n\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; + + + Init_VMM(&os_hooks, &vmm_ops); - Init_VMM(); + init_mem_layout(&(vm_info.mem_layout)); + init_mem_list(&(vm_info.mem_list)); - - 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); + 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); + rip = (ulong_t)(void*)&BuzzVM; + vm_info.rip = rip; + rsp = (ulong_t)Alloc_Page(); + vm_info.rsp = rsp; - - // Try to launch a real VM + SerialPrint("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", rip, rsp); + (vmm_ops).init_guest(&vm_info); + SerialPrint("Starting Guest\n"); + (vmm_ops).start_guest(&vm_info); + + } - // 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"); + SerialPrintLevel(1000,"Launching Noisemaker and keyboard listener threads\n"); -#define SEGLEN (1024*64) - AllocateAndMapPagesForRange(START_OF_VM+0x100000, VM_KERNEL_LENGTH / 512, template_pte); -*/ - // Now we should be copying into actual memory - //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); - //SerialPrintLevel(1000, "VM copied\n"); + + /* // jump into vmxassist