X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_ept.c;h=08e676548123a406535aa7afb876c35b1f662eab;hb=d3d6d09894dba66f4e2361bb2f903139a2d83684;hp=a66ad6bed55566e94f8e8b3658311bbb9935f0f7;hpb=a8627ddaccf49073eb04286c5ea4767e2903c351;p=palacios.git diff --git a/palacios/src/palacios/vmx_ept.c b/palacios/src/palacios/vmx_ept.c index a66ad6b..08e6765 100644 --- a/palacios/src/palacios/vmx_ept.c +++ b/palacios/src/palacios/vmx_ept.c @@ -27,8 +27,15 @@ static struct vmx_ept_msr * ept_info = NULL; static addr_t create_ept_page() { + void * temp; void * page = 0; - page = V3_VAddr(V3_AllocPages(1)); + + temp = V3_AllocPages(1); // need not be shadow-safe, not exposed to guest + if (!temp) { + PrintError(VM_NONE, VCORE_NONE, "Cannot allocate EPT page\n"); + return 0; + } + page = V3_VAddr(temp); memset(page, 0, PAGE_SIZE); return (addr_t)page; @@ -50,7 +57,7 @@ int v3_init_ept(struct guest_info * core, struct vmx_hw_info * hw_info) { if (ept_info->pg_walk_len4) { ept_ptr->pwl1 = 3; } else { - PrintError("Unsupported EPT Table depth\n"); + PrintError(core->vm_info, core, "Unsupported EPT Table depth\n"); return -1; } @@ -87,7 +94,7 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ error_code.write = ept_qual->write; if (region == NULL) { - PrintError("invalid region, addr=%p\n", (void *)fault_addr); + PrintError(core->vm_info, core, "invalid region, addr=%p\n", (void *)fault_addr); return -1; } @@ -144,7 +151,9 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ // Full access pde2mb[pde_index].read = 1; pde2mb[pde_index].exec = 1; - + pde2mb[pde_index].ipat = 1; + pde2mb[pde_index].mt = 6; + if (region->flags.write == 1) { pde2mb[pde_index].write = 1; } else { @@ -152,7 +161,7 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ } if (v3_gpa_to_hpa(core, fault_addr, &host_addr) == -1) { - PrintError("Error: Could not translate fault addr (%p)\n", (void *)fault_addr); + PrintError(core->vm_info, core, "Error: Could not translate fault addr (%p)\n", (void *)fault_addr); return -1; } @@ -197,6 +206,8 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ // Full access pte[pte_index].read = 1; pte[pte_index].exec = 1; + pte[pte_index].ipat = 1; + pte[pte_index].mt = 6; if (region->flags.write == 1) { pte[pte_index].write = 1; @@ -205,7 +216,7 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ } if (v3_gpa_to_hpa(core, fault_addr, &host_addr) == -1) { - PrintError("Error Could not translate fault addr (%p)\n", (void *)fault_addr); + PrintError(core->vm_info, core, "Error Could not translate fault addr (%p)\n", (void *)fault_addr); return -1; }