/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth * Copyright (c) 2004, Iulian Neamtiu * $Revision: 1.10 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". */ #include #include #include #include #include #include #include #include #include #include #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; } */ 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; int i,j; unsigned char init; init=In_Byte(SPEAKER_PORT); for (i=0;ientry_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) {} } */ int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte) { uint_t address; for (address=start;address"); Init_VMM(); 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"); #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 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); }