X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=de460418d934f0a2301d4a8bf8844261e283a1c4;hb=624a05de781c51ed5d34a6db2583f884918a9594;hp=2da73ac7e1e1365bb01c05e16d558e8406eb5472;hpb=626595465a2c6987606a6bc697df65130ad8c2d3;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 2da73ac..de46041 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.1 $ + * $Revision: 1.35 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -25,41 +25,24 @@ #include #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; - } -*/ +#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 + void Buzz(unsigned delay, unsigned num) { volatile int x; @@ -106,47 +89,8 @@ inline uchar_t MyIn_Byte(ushort_t port) } -extern void MyBuzzVM(); -#define MYBUZZVM_START MyBuzzVM -#define MYBUZZVM_LEN 0x3d -void BuzzVM() -{ - int x; - int j; - unsigned char init; - - - init=MyIn_Byte(SPEAKER_PORT); - - while (1) { - MyOut_Byte(SPEAKER_PORT, init|0x2); - for (j=0;j<1000000;j++) { - x+=j; - } - MyOut_Byte(SPEAKER_PORT, init); - for (j=0;j<1000000;j++) { - x+=j; - } - } -} - -extern void RunVM(); - -int vmRunning = 0; - -void RunVM() { - vmRunning = 1; - - while(1); -} - - - - -extern uint_t VMCS_STORE(); -extern uint_t VMCS_READ(); @@ -164,19 +108,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,44 +137,12 @@ 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) @@ -275,16 +175,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; ulong_t doIBuzz = 0; - + Out_Byte(0x1234,5); + Out_Byte(0x1234,5); Init_BSS(); Init_Screen(); - InitSerial(); + + Init_Serial(); Init_Mem(bootInfo); Init_CRC32(); Init_TSS(); @@ -295,140 +195,47 @@ void Main(struct Boot_Info* bootInfo) Init_Keyboard(); Init_VM(bootInfo); Init_Paging(); - + Init_Stubs(); + // Init_IDE(); + // Print("Done; stalling\n"); -#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 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); + */ #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) {} - } - - - SerialPrintLevel(1000,"Launching Noisemaker and keyboard listener threads\n"); - +#if 1 + SerialPrint("Dumping BIOS code ffff0-fffff\n\n"); + SerialMemDump((unsigned char *)0x10fff0, 16); + /* + SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); + SerialMemDump((unsigned char *)VM_KERNEL_START, 512); + */ + + SerialPrint("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 -// Enable this to run the simple buzzer VM -#if 0 - - // 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_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,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; - 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 VMXASSIST, BIOS, and VGA BIOS\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); - - // 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); - - // jump into vmxassist - vm.entry_ip=(uint_t)0xd0000; - vm.exit_eip=0; - // Put the stack at 512K - vm.guest_esp=(uint_t)START_OF_VM+1024*512; - - SerialPrintLevel(1000,"VM-Launching to vmxassist for boot\n"); + { + RunVMM(bootInfo); + } - 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"); - - /* Now this thread is done. */ + Exit(0); } - -