int page_size = PAGE_SIZE_4KB;
if (region == NULL) {
- PrintError("%s: invalid region, addr=%p\n", __FUNCTION__, (void *)fault_addr);
+ PrintError(core->vm_info, core, "%s: invalid region, addr=%p\n", __FUNCTION__, (void *)fault_addr);
return -1;
}
page_size = v3_get_max_page_size(core, fault_addr, LONG);
}
- PrintDebug("Using page size of %dKB\n", page_size / 1024);
+ PrintDebug(core->vm_info, core, "Using page size of %dKB\n", page_size / 1024);
// Lookup the correct PML address based on the PAGING MODE
//Fix up the PML entry
if (pml[pml_index].present == 0) {
- pdpe = (pdpe64_t *)create_generic_pt_page();
+ pdpe = (pdpe64_t *)create_generic_pt_page(core);
// Set default PML Flags...
pml[pml_index].present = 1;
// Fix up the PDPE entry
if (pdpe[pdpe_index].present == 0) {
- pde = (pde64_t *)create_generic_pt_page();
+ pde = (pde64_t *)create_generic_pt_page(core);
// Set default PDPE Flags...
pdpe[pdpe_index].present = 1;
}
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;
}
// Fix up the PDE entry
if (pde[pde_index].present == 0) {
- pte = (pte64_t *)create_generic_pt_page();
+ pte = (pte64_t *)create_generic_pt_page(core);
pde[pde_index].present = 1;
pde[pde_index].writable = 1;
}
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;
}
return 0;
}
-static inline int invalidate_addr_64(struct guest_info * core, addr_t inv_addr) {
+static inline int invalidate_addr_64_internal(struct guest_info * core, addr_t inv_addr,
+ addr_t *actual_start, uint64_t *actual_size) {
pml4e64_t * pml = NULL;
pdpe64_t * pdpe = NULL;
pde64_t * pde = NULL;
}
if (pml[pml_index].present == 0) {
- return 0;
+ *actual_start = BASE_TO_PAGE_ADDR_512GB(PAGE_BASE_ADDR_512GB(inv_addr));
+ *actual_size = PAGE_SIZE_512GB;
+ return 0;
}
pdpe = V3_VAddr((void*)BASE_TO_PAGE_ADDR(pml[pml_index].pdp_base_addr));
if (pdpe[pdpe_index].present == 0) {
+ *actual_start = BASE_TO_PAGE_ADDR_1GB(PAGE_BASE_ADDR_1GB(inv_addr));
+ *actual_size = PAGE_SIZE_1GB;
return 0;
} else if (pdpe[pdpe_index].large_page == 1) { // 1GiB
pdpe[pdpe_index].present = 0;
pdpe[pdpe_index].writable = 0;
pdpe[pdpe_index].user_page = 0;
+ *actual_start = BASE_TO_PAGE_ADDR_1GB(PAGE_BASE_ADDR_1GB(inv_addr));
+ *actual_size = PAGE_SIZE_1GB;
return 0;
}
pde = V3_VAddr((void*)BASE_TO_PAGE_ADDR(pdpe[pdpe_index].pd_base_addr));
if (pde[pde_index].present == 0) {
+ *actual_start = BASE_TO_PAGE_ADDR_2MB(PAGE_BASE_ADDR_2MB(inv_addr));
+ *actual_size = PAGE_SIZE_2MB;
return 0;
} else if (pde[pde_index].large_page == 1) { // 2MiB
pde[pde_index].present = 0;
pde[pde_index].writable = 0;
pde[pde_index].user_page = 0;
+ *actual_start = BASE_TO_PAGE_ADDR_2MB(PAGE_BASE_ADDR_2MB(inv_addr));
+ *actual_size = PAGE_SIZE_2MB;
return 0;
}
pte[pte_index].writable = 0;
pte[pte_index].user_page = 0;
+ *actual_start = BASE_TO_PAGE_ADDR_4KB(PAGE_BASE_ADDR_4KB(inv_addr));
+ *actual_size = PAGE_SIZE_4KB;
+
return 0;
}
+static inline int invalidate_addr_64(struct guest_info * core, addr_t inv_addr)
+{
+ addr_t start;
+ uint64_t len;
+
+ return invalidate_addr_64_internal(core,inv_addr,&start,&len);
+}
+
+static inline int invalidate_addr_64_range(struct guest_info * core, addr_t inv_addr_start, addr_t inv_addr_end)
+{
+ addr_t next;
+ addr_t start;
+ uint64_t len;
+ int rc;
+
+ for (next=inv_addr_start; next<=inv_addr_end; ) {
+ rc = invalidate_addr_64_internal(core,next,&start, &len);
+ if (rc) {
+ return rc;
+ }
+ next = start + len;
+ }
+ return 0;
+}
+
#endif