if (pde == NULL) {
return;
}
+ PrintDebug("Deleting Page Tables -- PDE (%p)\n", pde);
for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
if (pde[i].present) {
// We double cast, first to an addr_t to handle 64 bit issues, then to the pointer
- PrintDebug("PTE base addr %x \n", pde[i].pt_base_addr);
+
pte32_t * pte = (pte32_t *)((addr_t)(uint_t)(pde[i].pt_base_addr << PAGE_POWER));
- PrintDebug("Deleting PTE %d (%p)\n", i, pte);
+
V3_FreePage(pte);
}
}
- PrintDebug("Deleting PDE (%p)\n", pde);
+
V3_FreePage(V3_PAddr(pde));
}
-static int translate_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_32_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
addr_t * paddr = (addr_t *)private_data;
switch (type) {
}
}
-static int translate_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_32pae_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
addr_t * paddr = (addr_t *)private_data;
switch (type) {
}
}
-static int translate_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int translate_pt_64_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
addr_t * paddr = (addr_t *)private_data;
switch (type) {
}
-int v3_translate_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
- return v3_drill_host_pt_32(host_cr3, vaddr, translate_pt_32_cb, paddr);
+int v3_translate_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+ return v3_drill_host_pt_32(info, host_cr3, vaddr, translate_pt_32_cb, paddr);
}
int v3_translate_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
return v3_drill_guest_pt_32(info, guest_cr3, vaddr, translate_pt_32_cb, paddr);
}
-int v3_translate_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
- return v3_drill_host_pt_32pae(host_cr3, vaddr, translate_pt_32pae_cb, paddr);
+int v3_translate_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+ return v3_drill_host_pt_32pae(info, host_cr3, vaddr, translate_pt_32pae_cb, paddr);
}
int v3_translate_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
return v3_drill_guest_pt_32pae(info, guest_cr3, vaddr, translate_pt_32pae_cb, paddr);
}
-int v3_translate_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
- return v3_drill_host_pt_64(host_cr3, vaddr, translate_pt_64_cb, paddr);
+int v3_translate_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr) {
+ return v3_drill_host_pt_64(info, host_cr3, vaddr, translate_pt_64_cb, paddr);
}
int v3_translate_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr) {
return v3_drill_guest_pt_64(info, guest_cr3, vaddr, translate_pt_64_cb, paddr);
struct pt_find_data {
page_type_t type;
- addr_t * pt_page_addr;
+ addr_t * pt_page_ptr;
+ addr_t * pt_page_pa;
};
-static int find_pt_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int find_pt_cb(struct guest_info * info, page_type_t type, addr_t vaddr,
+ addr_t page_ptr, addr_t page_pa, void * private_data) {
struct pt_find_data * pt_data = (struct pt_find_data *)private_data;
+ PrintDebug("FIND_PT Type=%s, page_pa = %p\n",
+ v3_page_type_to_str(type),
+ (void *)page_pa);
+
if (type == pt_data->type) {
- *(pt_data->pt_page_addr) = page_ptr;
+ *(pt_data->pt_page_ptr) = page_ptr;
+ *(pt_data->pt_page_pa) = page_pa;
return 1;
}
}
-int v3_find_host_pt_32_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_32_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
- return v3_drill_host_pt_32(host_cr3, vaddr, find_pt_cb, &data);
+ return v3_drill_host_pt_32(info, host_cr3, vaddr, find_pt_cb, &data);
}
-int v3_find_host_pt_32pae_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_32pae_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
-
- return v3_drill_host_pt_32pae(host_cr3, vaddr, find_pt_cb, &data);
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
+
+ return v3_drill_host_pt_32pae(info, host_cr3, vaddr, find_pt_cb, &data);
}
-int v3_find_host_pt_64_page(v3_reg_t host_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_host_pt_64_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
-
- return v3_drill_host_pt_64(host_cr3, vaddr, find_pt_cb, &data);
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
+
+ return v3_drill_host_pt_64(info, host_cr3, vaddr, find_pt_cb, &data);
}
-int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
return v3_drill_guest_pt_32(info, guest_cr3, vaddr, find_pt_cb, &data);
}
-int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
return v3_drill_guest_pt_32pae(info, guest_cr3, vaddr, find_pt_cb, &data);
}
-int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr, addr_t * page_addr) {
+int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa) {
struct pt_find_data data;
data.type = type;
- data.pt_page_addr = page_addr;
+ data.pt_page_ptr = page_ptr;
+ data.pt_page_pa = page_pa;
return v3_drill_guest_pt_64(info, guest_cr3, vaddr, find_pt_cb, &data);
}
pt_access_status_t * access_status;
};
-static int check_pt_32_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_32_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
struct pt_check_data * chk_data = (struct pt_check_data *)private_data;
switch (type) {
}
-static int check_pt_32pae_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_32pae_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
struct pt_check_data * chk_data = (struct pt_check_data *)private_data;
switch (type) {
}
-static int check_pt_64_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+static int check_pt_64_cb(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
struct pt_check_data * chk_data = (struct pt_check_data *)private_data;
switch (type) {
-int v3_check_host_pt_32(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
struct pt_check_data access_data;
access_data.access_type = access_type;
access_data.access_status = access_status;
- return v3_drill_host_pt_32(host_cr3, vaddr, check_pt_32_cb, &access_data);
+ return v3_drill_host_pt_32(info, host_cr3, vaddr, check_pt_32_cb, &access_data);
}
-int v3_check_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
struct pt_check_data access_data;
access_data.access_type = access_type;
access_data.access_status = access_status;
- return v3_drill_host_pt_32pae(host_cr3, vaddr, check_pt_32pae_cb, &access_data);
+ return v3_drill_host_pt_32pae(info, host_cr3, vaddr, check_pt_32pae_cb, &access_data);
}
-int v3_check_host_pt_64(v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
+int v3_check_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, pf_error_t access_type, pt_access_status_t * access_status) {
struct pt_check_data access_data;
access_data.access_type = access_type;
access_data.access_status = access_status;
- return v3_drill_host_pt_64(host_cr3, vaddr, check_pt_64_cb, &access_data);
+ return v3_drill_host_pt_64(info, host_cr3, vaddr, check_pt_64_cb, &access_data);
}
}
+static int get_data_page_type_cb(struct guest_info * info, page_type_t type,
+ addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
+ switch (type) {
+ case PAGE_4KB:
+ case PAGE_2MB:
+ case PAGE_4MB:
+ case PAGE_1GB:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+
+page_type_t v3_get_guest_data_page_type_32(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_guest_pt_32(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+page_type_t v3_get_guest_data_page_type_32pae(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_guest_pt_32pae(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+page_type_t v3_get_guest_data_page_type_64(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_guest_pt_64(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+page_type_t v3_get_host_data_page_type_32(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_host_pt_32(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+page_type_t v3_get_host_data_page_type_32pae(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_host_pt_32pae(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+page_type_t v3_get_host_data_page_type_64(struct guest_info * info, v3_reg_t cr3, addr_t vaddr) {
+ return v3_drill_host_pt_64(info, cr3, vaddr, get_data_page_type_cb, NULL);
+}
+
/*
* PAGE TABLE LOOKUP FUNCTIONS
}
pt_access_status_t inline v3_can_access_pde64(pde64_t * pde, addr_t addr, pf_error_t access_type) {
- gen_pt_t * entry = (gen_pt_t *)&pde[PDE32_INDEX(addr)];
+ gen_pt_t * entry = (gen_pt_t *)&pde[PDE64_INDEX(addr)];
return can_access_pt_entry(entry, access_type);
}
}
-int v3_drill_host_pt_32(v3_reg_t host_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pde32_t * host_pde = (pde32_t *)CR3_TO_PDE32_VA(host_cr3);
addr_t host_pde_pa = CR3_TO_PDE32_PA(host_cr3);
addr_t page_pa = 0;
int ret;
- if ((ret = callback(PAGE_PD32, vaddr, (addr_t)host_pde, host_pde_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)host_pde, host_pde_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PD32;
}
case PT_ENTRY_NOT_PRESENT:
return -1;
case PT_ENTRY_LARGE_PAGE:
- if ((ret == callback(PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4MB;
}
return 0;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PT32, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT32;
}
if (pte32_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
return -1;
} else {
- if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
return 0;
-int v3_drill_host_pt_32pae(v3_reg_t host_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pdpe32pae_t * host_pdpe = (pdpe32pae_t *)CR3_TO_PDPE32PAE_VA(host_cr3);
addr_t host_pdpe_pa = CR3_TO_PDPE32PAE_PA(host_cr3);
addr_t page_pa = 0;
int ret;
- if ((ret = callback(PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, host_pdpe_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, host_pdpe_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PDP32PAE;
}
return -1;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PD32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PD32PAE;
}
case PT_ENTRY_NOT_PRESENT:
return -1;
case PT_ENTRY_LARGE_PAGE:
- if ((ret == callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_2MB;
}
return 0;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PT32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT32PAE;
}
if (pte32pae_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
return -1;
} else {
- if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
return 0;
}
-int v3_drill_host_pt_64(v3_reg_t host_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pml4e64_t * host_pmle = (pml4e64_t *)CR3_TO_PML4E64_VA(host_cr3);
addr_t host_pmle_pa = CR3_TO_PML4E64_PA(host_cr3);
addr_t page_pa = 0;
int ret;
- if ((ret = callback(PAGE_PML464, vaddr, (addr_t)host_pmle, host_pmle_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)host_pmle, host_pmle_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PML464;
}
return -1;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PDP64, vaddr, (addr_t)V3_VAddr((void *)host_pdpe_pa), host_pdpe_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)V3_VAddr((void *)host_pdpe_pa), host_pdpe_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PDP64;
}
case PT_ENTRY_NOT_PRESENT:
return -1;
case PT_ENTRY_LARGE_PAGE:
- if ((ret == callback(PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_1GB;
}
PrintError("1 Gigabyte Pages not supported\n");
return 0;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PD64, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)V3_VAddr((void *)host_pde_pa), host_pde_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PD64;
}
case PT_ENTRY_NOT_PRESENT:
return -1;
case PT_ENTRY_LARGE_PAGE:
- if ((ret == callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_2MB;
}
return 0;
case PT_ENTRY_PAGE:
- if ((ret = callback(PAGE_PT64, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)V3_VAddr((void *)host_pte_pa), host_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT64;
}
if (pte64_lookup(V3_VAddr((void *)host_pte_pa), vaddr, &page_pa) == PT_ENTRY_NOT_PRESENT) {
return -1;
} else {
- if ((ret = callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)PAGE_BASE_ADDR(page_pa)), page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
return 0;
int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pde_pa = CR3_TO_PDE32_PA(guest_cr3);
pde32_t * guest_pde = NULL;
int ret;
- if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t*)&guest_pde) == -1) {
+ if (guest_pa_to_host_va(info, guest_pde_pa, (addr_t *)&guest_pde) == -1) {
PrintError("Could not get virtual address of Guest PDE32 (PA=%p)\n",
(void *)guest_pde_pa);
return -1;
}
- if ((ret = callback(PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PD32;
}
}
- if ((ret == callback(PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4MB;
}
return 0;
return -1;
}
- if ((ret = callback(PAGE_PT32, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT32;
}
return -1;
}
- if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
return 0;
int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pdpe_pa = CR3_TO_PDPE32PAE_PA(guest_cr3);
pdpe32pae_t * guest_pdpe = 0;
return -1;
}
- if ((ret = callback(PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PDP32PAE;
}
return -1;
}
- if ((ret = callback(PAGE_PD32PAE, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PD32PAE;
}
}
- if ((ret == callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_2MB;
}
return 0;
return -1;
}
- if ((ret = callback(PAGE_PT32PAE, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT32PAE;
}
return -1;
}
- if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
return 0;
}
int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pml4_pa = CR3_TO_PML4E64_PA(guest_cr3);
pml4e64_t * guest_pmle = 0;
return -1;
}
- if ((ret = callback(PAGE_PML464, vaddr, (addr_t)guest_pmle, guest_pml4_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)guest_pmle, guest_pml4_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PML464;
}
return -1;
}
- if ((ret = callback(PAGE_PDP64, vaddr, (addr_t)guest_pdp, guest_pdpe_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)guest_pdp, guest_pdpe_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PDP64;
}
}
- if ((ret == callback(PAGE_1GB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_1GB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_1GB;
}
PrintError("1 Gigabyte Pages not supported\n");
return -1;
}
- if ((ret = callback(PAGE_PD64, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_PD64;
}
}
- if ((ret == callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ if ((ret == callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_2MB;
}
return 0;
return -1;
}
- if ((ret = callback(PAGE_PT64, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
+ if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)guest_pte, guest_pte_pa, private_data) != 0)) {
return (ret == -1) ? -1 : PAGE_PT64;
}
return -1;
}
- if ((ret = callback(PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
return (ret == -1) ? -1 : PAGE_4KB;
}
int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pde_pa = CR3_TO_PDE32_PA(guest_cr3);
pde32_t * guest_pde = NULL;
int i, j;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Call back was not specified\n");
return -1;
}
- callback(PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)guest_pde, guest_pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
if (guest_pde[i].present) {
large_page_va = 0;
}
- callback(PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_4MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_4MB;
} else {
return -1;
}
- callback(PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
if (tmp_pte[j].present) {
page_va = 0;
}
- callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pdpe_pa = CR3_TO_PDPE32PAE_PA(guest_cr3);
pdpe32pae_t * guest_pdpe = NULL;
int i, j, k;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Call back was not specified\n");
}
-
- callback(PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data);
+ if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)guest_pdpe, guest_pdpe_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
if (guest_pdpe[i].present) {
return -1;
}
- callback(PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
if (tmp_pde[j].present) {
large_page_va = 0;
}
- callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_2MB;
} else {
return -1;
}
- callback(PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
if (tmp_pte[k].present) {
page_va = 0;
}
- callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pml_pa = CR3_TO_PML4E64_PA(guest_cr3);
pml4e64_t * guest_pml = NULL;
int i, j, k, m;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Call back was not specified\n");
}
- callback(PAGE_PML464, vaddr, (addr_t)guest_pml, guest_pml_pa, private_data);
+ if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)guest_pml, guest_pml_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
if (guest_pml[i].present) {
return -1;
}
- callback(PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data);
+ if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PDPE64_ENTRIES; j++) {
if (tmp_pdpe[j].present) {
large_page_va = 0;
}
- callback(PAGE_1GB, vaddr, (addr_t)large_page_va, large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_1GB, vaddr, (addr_t)large_page_va, large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_1GB;
} else {
return -1;
}
- callback(PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (k = 0; k < MAX_PDE64_ENTRIES; k++) {
if (tmp_pde[k].present) {
large_page_va = 0;
}
- callback(PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_2MB, vaddr, large_page_va, large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_2MB;
} else {
return -1;
}
- callback(PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (m = 0; m < MAX_PTE64_ENTRIES; m++) {
if (tmp_pte[m].present) {
page_va = 0;
}
- callback(PAGE_4KB, vaddr, page_va, page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, page_va, page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
return 0;
}
-int v3_walk_host_pt_32(v3_reg_t host_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pde32_t * host_pde = (pde32_t *)CR3_TO_PDE32_VA(host_cr3);
addr_t pde_pa = CR3_TO_PDE32_PA(host_cr3);
int i, j;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Call back was not specified\n");
return -1;
}
- callback(PAGE_PD32, vaddr, (addr_t)host_pde, pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD32, vaddr, (addr_t)host_pde, pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
if (host_pde[i].present) {
pde32_4MB_t * large_pde = (pde32_4MB_t *)&(host_pde[i]);
addr_t large_page_pa = BASE_TO_PAGE_ADDR_4MB(large_pde->page_base_addr);
- callback(PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_4MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_4MB;
} else {
addr_t pte_pa = BASE_TO_PAGE_ADDR(host_pde[i].pt_base_addr);
pte32_t * tmp_pte = (pte32_t *)V3_VAddr((void *)pte_pa);
- callback(PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT32, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
if (tmp_pte[j].present) {
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[j].page_base_addr);
- callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
-int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pdpe32pae_t * host_pdpe = (pdpe32pae_t *)CR3_TO_PDPE32PAE_VA(host_cr3);
addr_t pdpe_pa = CR3_TO_PDPE32PAE_PA(host_cr3);
int i, j, k;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Callback was not specified\n");
return -1;
}
- callback(PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, pdpe_pa, private_data);
+ if ((ret = callback(info, PAGE_PDP32PAE, vaddr, (addr_t)host_pdpe, pdpe_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PDPE32PAE_ENTRIES; i++) {
if (host_pdpe[i].present) {
addr_t pde_pa = BASE_TO_PAGE_ADDR(host_pdpe[i].pd_base_addr);
pde32pae_t * tmp_pde = (pde32pae_t *)V3_VAddr((void *)pde_pa);
- callback(PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD32PAE, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PDE32PAE_ENTRIES; j++) {
if (tmp_pde[j].present) {
pde32pae_2MB_t * large_pde = (pde32pae_2MB_t *)&(tmp_pde[j]);
addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
- callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_2MB;
} else {
addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[j].pt_base_addr);
pte32pae_t * tmp_pte = (pte32pae_t *)V3_VAddr((void *)pte_pa);
- callback(PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT32PAE, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
if (tmp_pte[k].present) {
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[k].page_base_addr);
- callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
}
-int v3_walk_host_pt_64(v3_reg_t host_cr3,
- int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+int v3_walk_host_pt_64(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pml4e64_t * host_pml = (pml4e64_t *)CR3_TO_PML4E64_VA(host_cr3);
addr_t pml_pa = CR3_TO_PML4E64_PA(host_cr3);
int i, j, k, m;
addr_t vaddr = 0;
+ int ret = 0;
if (!callback) {
PrintError("Callback was not specified\n");
return -1;
}
- callback(PAGE_PML464, vaddr, (addr_t)host_pml, pml_pa, private_data);
+ if ((ret = callback(info, PAGE_PML464, vaddr, (addr_t)host_pml, pml_pa, private_data)) != 0) {
+ return ret;
+ }
for (i = 0; i < MAX_PML4E64_ENTRIES; i++) {
if (host_pml[i].present) {
addr_t pdpe_pa = BASE_TO_PAGE_ADDR(host_pml[i].pdp_base_addr);
pdpe64_t * tmp_pdpe = (pdpe64_t *)V3_VAddr((void *)pdpe_pa);
- callback(PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data);
+ if ((ret = callback(info, PAGE_PDP64, vaddr, (addr_t)tmp_pdpe, pdpe_pa, private_data)) != 0) {
+ return ret;
+ }
for (j = 0; j < MAX_PDPE64_ENTRIES; j++) {
if (tmp_pdpe[j].present) {
pdpe64_1GB_t * large_pdp = (pdpe64_1GB_t *)&(tmp_pdpe[j]);
addr_t large_page_pa = BASE_TO_PAGE_ADDR_1GB(large_pdp->page_base_addr);
- callback(PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_1GB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_1GB;
} else {
addr_t pde_pa = BASE_TO_PAGE_ADDR(tmp_pdpe[j].pd_base_addr);
pde64_t * tmp_pde = (pde64_t *)V3_VAddr((void *)pde_pa);
- callback(PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data);
+ if ((ret = callback(info, PAGE_PD64, vaddr, (addr_t)tmp_pde, pde_pa, private_data)) != 0) {
+ return ret;
+ }
for (k = 0; k < MAX_PDE64_ENTRIES; k++) {
if (tmp_pde[k].present) {
pde64_2MB_t * large_pde = (pde64_2MB_t *)&(tmp_pde[k]);
addr_t large_page_pa = BASE_TO_PAGE_ADDR_2MB(large_pde->page_base_addr);
- callback(PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data);
+ if ((ret = callback(info, PAGE_2MB, vaddr, (addr_t)V3_VAddr((void *)large_page_pa), large_page_pa, private_data)) != 0) {
+ return ret;
+ }
vaddr += PAGE_SIZE_2MB;
} else {
addr_t pte_pa = BASE_TO_PAGE_ADDR(tmp_pde[k].pt_base_addr);
pte64_t * tmp_pte = (pte64_t *)V3_VAddr((void *)pte_pa);
- callback(PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data);
+ if ((ret = callback(info, PAGE_PT64, vaddr, (addr_t)tmp_pte, pte_pa, private_data)) != 0) {
+ return ret;
+ }
for (m = 0; m < MAX_PTE64_ENTRIES; m++) {
if (tmp_pte[m].present) {
addr_t page_pa = BASE_TO_PAGE_ADDR(tmp_pte[m].page_base_addr);
- callback(PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data);
+ if ((ret = callback(info, PAGE_4KB, vaddr, (addr_t)V3_VAddr((void *)page_pa), page_pa, private_data)) != 0) {
+ return ret;
+ }
}
vaddr += PAGE_SIZE_4KB;
}