X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsvm.c;h=18ddcb51c9ba46d08a8cf642d735ab6f1680bc96;hb=8cb3daaded0d8c80be801aa74493006b5a06999f;hp=2c865b3e724d64c6daebc543683617db02b386ab;hpb=271ad3fd89672d441db3c5ffa673ee649e4ce532;p=palacios.git diff --git a/palacios/src/geekos/svm.c b/palacios/src/geekos/svm.c index 2c865b3..18ddcb5 100644 --- a/palacios/src/geekos/svm.c +++ b/palacios/src/geekos/svm.c @@ -7,6 +7,7 @@ #include #include +#include /* TEMPORARY BECAUSE SVM IS WEIRD */ @@ -43,16 +44,15 @@ int is_svm_capable() { Get_MSR(SVM_VM_CR_MSR, &vm_cr_high, &vm_cr_low); + if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 1) { + PrintDebug("Nested Paging not supported\n"); + } + if ((vm_cr_low & SVM_VM_CR_MSR_svmdis) == 0) { return 1; } ret = cpuid_edx(CPUID_SVM_REV_AND_FEATURE_IDS); - - - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { - PrintDebug("Nested Paging not supported\n"); - } if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { PrintDebug("SVM BIOS Disabled, not unlockable\n"); @@ -105,10 +105,8 @@ int init_svm_guest(struct guest_info *info) { info->vmm_data = (void*)Allocate_VMCB(); - PrintDebug("Generating Guest nested page tables\n"); - // print_mem_list(&(info->mem_list)); - //print_mem_layout(&(info->mem_layout)); - info->page_tables = NULL; + //PrintDebug("Generating Guest nested page tables\n"); + // info->page_tables = NULL; //info->page_tables = generate_guest_page_tables_64(&(info->mem_layout), &(info->mem_list)); //info->page_tables = generate_guest_page_tables(&(info->mem_layout), &(info->mem_list)); //PrintDebugPageTables(info->page_tables); @@ -163,7 +161,7 @@ vmcb_t * Allocate_VMCB() { } -void Init_VMCB_Real(vmcb_t * vmcb, guest_info_t vm_info) { +void Init_VMCB_Real(vmcb_t * vmcb, struct guest_info vm_info) { vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb); vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA(vmcb); uint_t i; @@ -258,7 +256,7 @@ void Init_VMCB_Real(vmcb_t * vmcb, guest_info_t vm_info) { *bitmap |= 1 << (port % 8); } - memset((uchar_t*)io_port_bitmap, 0xff, PAGE_SIZE * 2); + // memset((uchar_t*)io_port_bitmap, 0xff, PAGE_SIZE * 2); //PrintDebugMemDump((uchar_t*)io_port_bitmap, PAGE_SIZE *2); ctrl_area->instrs.instrs.IOIO_PROT = 1; @@ -267,8 +265,27 @@ void Init_VMCB_Real(vmcb_t * vmcb, guest_info_t vm_info) { ctrl_area->instrs.instrs.INTR = 1; // also determine if CPU supports nested paging - if (vm_info.page_tables) { - // if (0) { + + if (vm_info.page_mode == SHADOW_PAGING) { + PrintDebug("Creating initial shadow page table\n"); + vm_info.shdw_pg_state.shadow_cr3.e_reg.low |= ((addr_t)create_passthrough_pde32_pts(&vm_info) & ~0xfff); + PrintDebug("Created\n"); + + guest_state->cr3 = vm_info.shdw_pg_state.shadow_cr3.r_reg; + + ctrl_area->cr_reads.crs.cr3 = 1; + ctrl_area->cr_writes.crs.cr3 = 1; + ctrl_area->cr_reads.crs.cr0 = 1; + ctrl_area->cr_writes.crs.cr0 = 1; + + ctrl_area->instrs.instrs.INVLPG = 1; + ctrl_area->instrs.instrs.INVLPGA = 1; + + + guest_state->g_pat = 0x7040600070406ULL; + + guest_state->cr0 |= 0x80000000; + } else if (vm_info.page_mode == NESTED_PAGING) { // Flush the TLB on entries/exits //ctrl_area->TLB_CONTROL = 1; @@ -279,21 +296,18 @@ void Init_VMCB_Real(vmcb_t * vmcb, guest_info_t vm_info) { // Set the Nested Page Table pointer // ctrl_area->N_CR3 = ((addr_t)vm_info.page_tables); - ctrl_area->N_CR3 = 0; - guest_state->cr3 = (addr_t)(vm_info.page_tables); + // ctrl_area->N_CR3 = (addr_t)(vm_info.page_tables); // ctrl_area->N_CR3 = Get_CR3(); // guest_state->cr3 |= (Get_CR3() & 0xfffff000); - guest_state->g_pat = 0x7040600070406ULL; - - //PrintDebug("Set Nested CR3: lo: 0x%x hi: 0x%x\n", (uint_t)*(&(ctrl_area->N_CR3)), (uint_t)*((unsigned char *)&(ctrl_area->N_CR3) + 4)); - guest_state->cr0 |= 0x80000000; + // guest_state->g_pat = 0x7040600070406ULL; } + } -void Init_VMCB(vmcb_t * vmcb, guest_info_t vm_info) { +void Init_VMCB(vmcb_t * vmcb, struct guest_info vm_info) { vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb); vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA(vmcb); uint_t i; @@ -303,7 +317,8 @@ void Init_VMCB(vmcb_t * vmcb, guest_info_t vm_info) { guest_state->rip = vm_info.rip; - + //ctrl_area->instrs.instrs.CR0 = 1; + ctrl_area->cr_reads.crs.cr0 = 1; ctrl_area->cr_writes.crs.cr0 = 1; guest_state->efer |= EFER_MSR_svm_enable; @@ -370,9 +385,26 @@ void Init_VMCB(vmcb_t * vmcb, guest_info_t vm_info) { ctrl_area->instrs.instrs.INTR = 1; - // also determine if CPU supports nested paging - if (vm_info.page_tables) { - // if (0) { + + + if (vm_info.page_mode == SHADOW_PAGING) { + PrintDebug("Creating initial shadow page table\n"); + vm_info.shdw_pg_state.shadow_cr3.e_reg.low |= ((addr_t)create_passthrough_pde32_pts(&vm_info) & ~0xfff); + PrintDebug("Created\n"); + + guest_state->cr3 = vm_info.shdw_pg_state.shadow_cr3.r_reg; + + ctrl_area->cr_reads.crs.cr3 = 1; + ctrl_area->cr_writes.crs.cr3 = 1; + + + ctrl_area->instrs.instrs.INVLPG = 1; + ctrl_area->instrs.instrs.INVLPGA = 1; + + guest_state->g_pat = 0x7040600070406ULL; + + guest_state->cr0 |= 0x80000000; + } else if (vm_info.page_mode == NESTED_PAGING) { // Flush the TLB on entries/exits //ctrl_area->TLB_CONTROL = 1; @@ -383,23 +415,19 @@ void Init_VMCB(vmcb_t * vmcb, guest_info_t vm_info) { // Set the Nested Page Table pointer // ctrl_area->N_CR3 = ((addr_t)vm_info.page_tables); - ctrl_area->N_CR3 = 0; - guest_state->cr3 = (addr_t)(vm_info.page_tables); + // ctrl_area->N_CR3 = (addr_t)(vm_info.page_tables); // ctrl_area->N_CR3 = Get_CR3(); // guest_state->cr3 |= (Get_CR3() & 0xfffff000); - guest_state->g_pat = 0x7040600070406ULL; - - //PrintDebug("Set Nested CR3: lo: 0x%x hi: 0x%x\n", (uint_t)*(&(ctrl_area->N_CR3)), (uint_t)*((unsigned char *)&(ctrl_area->N_CR3) + 4)); - guest_state->cr0 |= 0x80000000; + // guest_state->g_pat = 0x7040600070406ULL; } } -void Init_VMCB_pe(vmcb_t *vmcb, guest_info_t vm_info) { +void Init_VMCB_pe(vmcb_t *vmcb, struct guest_info vm_info) { vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb); vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA(vmcb); uint_t i = 0; @@ -527,8 +555,9 @@ void Init_VMCB_pe(vmcb_t *vmcb, guest_info_t vm_info) { } - + // also determine if CPU supports nested paging + /* if (vm_info.page_tables) { // if (0) { // Flush the TLB on entries/exits @@ -553,7 +582,7 @@ void Init_VMCB_pe(vmcb_t *vmcb, guest_info_t vm_info) { // Enable Paging // guest_state->cr0 |= 0x80000000; } - + */ }