X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=3d3ebba7def469f76047dc12ba72ef3c1a344555;hb=190b2ef9470c23c275754b74745933d973f8c439;hp=71e56442ee15163642e662ee2568297ce52fe1e7;hpb=b6c7009abd8e269d9860eb21f4aaba385ed78276;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 71e5644..3d3ebba 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.2 $ + * $Revision: 1.16 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -26,13 +26,15 @@ #include #include #include +#include -#include -#include +#include +#include #include -#include + +#include /* static inline unsigned int cpuid_ecx(unsigned int op) @@ -119,7 +121,9 @@ void BuzzVM() int j; unsigned char init; - + + SerialPrint("Starting To Buzz\n"); + init=MyIn_Byte(SPEAKER_PORT); while (1) { @@ -147,9 +151,6 @@ void RunVM() { -extern uint_t VMCS_STORE(); -extern uint_t VMCS_READ(); - void Buzzer(ulong_t arg) { @@ -166,6 +167,8 @@ void Buzzer(ulong_t arg) { + + void Hello(ulong_t arg) { char *b="hello "; @@ -206,7 +209,7 @@ extern char BSS_START, BSS_END; extern char end; - +/* void VM_Thread(ulong_t arg) { int ret; @@ -245,6 +248,8 @@ void VM_Thread(ulong_t arg) while (1) {} } +*/ + int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte) @@ -277,16 +282,16 @@ void Main(struct Boot_Info* bootInfo) { struct Kernel_Thread * key_thread; struct Kernel_Thread * spkr_thread; - struct Kernel_Thread * vm_thread; - struct VMDescriptor vm; + // struct Kernel_Thread * vm_thread; + // struct VMDescriptor vm; ulong_t doIBuzz = 0; - - Init_BSS(); Init_Screen(); - InitSerial(); + + + Init_Serial(); Init_Mem(bootInfo); Init_CRC32(); Init_TSS(); @@ -298,93 +303,82 @@ void Main(struct Boot_Info* bootInfo) Init_VM(bootInfo); Init_Paging(); - Init_IDE(); + // Init_IDE(); Print("Done; stalling\n"); - while(1); - -#if 1 - SerialPrint("Dumping VMXASSIST Code (first 512 bytes @ 0x%x)\n",VMXASSIST_START); - SerialMemDump((unsigned char *)VMXASSIST_START, 512); - SerialPrint("Dumping ROMBIOS Code (first 512 bytes @ 0x%x)\n",BIOS_START); - SerialMemDump((unsigned char *)BIOS_START, 512); - SerialPrint("Dumping ROMBIOS Code (Second copy) (first 512 bytes @ 0x%x)\n",BIOS2_START); - SerialMemDump((unsigned char *)BIOS2_START, 512); - SerialPrint("Dumping VGABIOS Code (first 512 bytes @ 0x%x)\n",VGA_BIOS_START); - SerialMemDump((unsigned char *)VGA_BIOS_START, 512); - +#if 0 + SerialPrint("Dumping VM kernel Code (first 512 bytes @ 0x%x)\n",VM_KERNEL_START); + SerialMemDump((unsigned char *)VM_KERNEL_START, 512); + /* + 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 - 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===>"); - - - SerialPrintLevel(100,"Initializing VMX\n"); - PrintBoth("Initializing VMX\n"); - VmxOnRegion * vmxRegion = InitVMX(); - if (vmxRegion==NULL) { - PrintBoth("VMX Cannot be turned on. Halted.\n"); - while (1) {} - } - + { + 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; + os_hooks.malloc = &VMM_Malloc; + os_hooks.free = &VMM_Free; + + + Init_VMM(&os_hooks, &vmm_ops); - 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); + init_mem_layout(&(vm_info.mem_layout)); + init_mem_list(&(vm_info.mem_list)); -// Enable this to run the simple buzzer VM -#if 0 + // add_mem_list_pages(&(vm_info.mem_list), START_OF_VM, 20); + //add_guest_mem_range(&(vm_info.mem_layout), 0, 20); - // Put the entry around 0x10000, where the geekos kernel used to live - vm.entry_ip=(uint_t)0x10000; - vm.exit_eip=0; - // Put the stack as the last thing in the VM partition - vm.guest_esp=(uint_t)START_OF_VM+VM_SIZE-1; - - memcpy(vm.entry_ip,MYBUZZVM_START,MYBUZZVM_LEN); - - SerialPrintLevel(1000,"VM-Launching MyBuzzVM after copy to 0x10000\n"); + vm_info.rip = (ullong_t)(void*)&BuzzVM; + vm_info.rsp = (ulong_t)Alloc_Page(); - vm_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,PRIORITY_NORMAL,false); + 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); -#else -#if 0 - // write the hello VM down to where we would usually put - // vmxassist, and see if it can talk to us - vm.entry_ip=(uint_t)START_OF_VM+0xd000000; - vm.exit_eip=0; - // Put the stack as the last thing in the VM partition - vm.guest_esp=(uint_t)START_OF_VM+VM_SIZE-1; - - memcpy((void*)(vm.entry_ip),Hello,200); // 200 should be plenty - - SerialPrintLevel(1000,"VM-Launching HelloVM after copy to 0xd000000\n"); - vm_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,PRIORITY_NORMAL,false); -#else // Try to launch a real VM - // First we will copy down VMXAssist, then we'll launch that - // and see if it can handle the system bios // 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; @@ -395,38 +389,43 @@ void Main(struct Boot_Info* bootInfo) template_pte.globalPage=0; template_pte.kernelInfo=0; - SerialPrintLevel(1000,"Allocating Pages for VMXASSIST, BIOS, and VGA BIOS\n"); + SerialPrintLevel(1000,"Allocating Pages for VM kernel\n"); #define SEGLEN (1024*64) - AllocateAndMapPagesForRange(START_OF_VM+0xd0000, SEGLEN, template_pte); - AllocateAndMapPagesForRange(START_OF_VM+0xf0000, SEGLEN, template_pte); - AllocateAndMapPagesForRange(START_OF_VM+0xc0000, SEGLEN, template_pte); - + AllocateAndMapPagesForRange(START_OF_VM+0x100000, VM_KERNEL_LENGTH / 512, template_pte); +*/ // Now we should be copying into actual memory - SerialPrintLevel(1000,"Copying VMXASSIST code from %x to %x (%d bytes)\n", VMXASSIST_START, START_OF_VM+0xd0000,VMXASSIST_LENGTH); - memcpy((char*)(START_OF_VM+0xd0000),(char*)VMXASSIST_START,VMXASSIST_LENGTH); - SerialPrintLevel(1000,"Copying BIOS (2nd copy) code from %x to %x (%d bytes)\n", BIOS2_START, START_OF_VM+0xf0000,BIOS_LENGTH); - memcpy((char*)(START_OF_VM+0xf0000),(char*)BIOS2_START,BIOS_LENGTH); - SerialPrintLevel(1000,"Copying VGA BIOS code from %x to %x (%d bytes)\n", VGA_BIOS_START, START_OF_VM+0xc0000,VGA_BIOS_LENGTH); - memcpy((char *)(START_OF_VM+0xc0000),(char*)VGA_BIOS_START,VGA_BIOS_LENGTH); + //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 - vm.entry_ip=(uint_t)0xd0000; + vm.entry_ip=(uint_t)0x00107fd0; vm.exit_eip=0; // Put the stack at 512K - vm.guest_esp=(uint_t)START_OF_VM+1024*512; + 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; - SerialPrintLevel(1000,"VM-Launching to vmxassist for boot\n"); - - vm_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,PRIORITY_NORMAL,false); + + 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"); -#endif -#endif TODO("Write a Virtual Machine Monitor"); @@ -435,5 +434,3 @@ void Main(struct Boot_Info* bootInfo) /* Now this thread is done. */ Exit(0); } - -