Skip to content

Commit f815415

Browse files
lifeixlijinxia
authored andcommitted
hv: ept: add lookup_address to lookup the page table
Add lookup_address to lokup the page table for a virtual address of primary page table or a physical address of extended page table. The remaining obtain_last_page_table_entry could be removed with their called function later. Signed-off-by: Li, Fei1 <fei1.li@intel.com>
1 parent e2516fa commit f815415

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

hypervisor/arch/x86/ept.c

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -120,26 +120,21 @@ void destroy_ept(struct vm *vm)
120120
uint64_t _gpa2hpa(struct vm *vm, uint64_t gpa, uint32_t *size)
121121
{
122122
uint64_t hpa = 0UL;
123-
uint32_t pg_size = 0U;
124-
struct entry_params entry;
125-
struct map_params map_params;
123+
uint64_t *pgentry, pg_size = 0UL;
126124

127-
map_params.page_table_type = PTT_EPT;
128-
map_params.pml4_base = vm->arch_vm.nworld_eptp;
129-
map_params.pml4_inverted = vm->arch_vm.m2p;
130-
obtain_last_page_table_entry(&map_params, &entry, (void *)gpa, true);
131-
if (entry.entry_present == PT_PRESENT) {
132-
hpa = ((entry.entry_val & (~(entry.page_size - 1)))
133-
| (gpa & (entry.page_size - 1)));
134-
pg_size = entry.page_size;
125+
pgentry = lookup_address((uint64_t *)vm->arch_vm.nworld_eptp,
126+
gpa, &pg_size, PTT_EPT);
127+
if (pgentry != NULL) {
128+
hpa = ((*pgentry & (~(pg_size - 1UL)))
129+
| (gpa & (pg_size - 1UL)));
135130
pr_dbg("GPA2HPA: 0x%llx->0x%llx", gpa, hpa);
136131
} else {
137132
pr_err("VM %d GPA2HPA: failed for gpa 0x%llx",
138133
vm->attr.boot_idx, gpa);
139134
}
140135

141136
if (size != NULL) {
142-
*size = pg_size;
137+
*size = (uint32_t)pg_size;
143138
}
144139

145140
return hpa;
@@ -153,23 +148,17 @@ uint64_t gpa2hpa(struct vm *vm, uint64_t gpa)
153148

154149
uint64_t hpa2gpa(struct vm *vm, uint64_t hpa)
155150
{
156-
struct entry_params entry;
157-
struct map_params map_params;
158-
159-
map_params.page_table_type = PTT_EPT;
160-
map_params.pml4_base = vm->arch_vm.nworld_eptp;
161-
map_params.pml4_inverted = vm->arch_vm.m2p;
162-
163-
obtain_last_page_table_entry(&map_params, &entry,
164-
(void *)hpa, false);
151+
uint64_t *pgentry, pg_size = 0UL;
165152

166-
if (entry.entry_present == PT_NOT_PRESENT) {
153+
pgentry = lookup_address((uint64_t *)vm->arch_vm.m2p,
154+
hpa, &pg_size, PTT_EPT);
155+
if (pgentry == NULL) {
167156
pr_err("VM %d hpa2gpa: failed for hpa 0x%llx",
168157
vm->attr.boot_idx, hpa);
169158
ASSERT(false, "hpa2gpa not found");
170159
}
171-
return ((entry.entry_val & (~(entry.page_size - 1)))
172-
| (hpa & (entry.page_size - 1)));
160+
return ((*pgentry & (~(pg_size - 1UL)))
161+
| (hpa & (pg_size - 1UL)));
173162
}
174163

175164
bool is_ept_supported(void)

hypervisor/arch/x86/pagetable.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,42 @@ int mmu_add(uint64_t *pml4_page, uint64_t paddr_base,
452452

453453
return 0;
454454
}
455+
456+
uint64_t *lookup_address(uint64_t *pml4_page,
457+
uint64_t addr, uint64_t *pg_size, enum _page_table_type ptt)
458+
{
459+
uint64_t *pml4e, *pdpte, *pde, *pte;
460+
461+
if ((pml4_page == NULL) || (pg_size == NULL)) {
462+
return NULL;
463+
}
464+
465+
pml4e = pml4e_offset(pml4_page, addr);
466+
if (pgentry_present(ptt, *pml4e) == 0UL) {
467+
return NULL;
468+
}
469+
470+
pdpte = pdpte_offset(pml4e, addr);
471+
if (pgentry_present(ptt, *pdpte) == 0UL) {
472+
return NULL;
473+
} else if (pdpte_large(*pdpte) != 0UL) {
474+
*pg_size = PDPTE_SIZE;
475+
return pdpte;
476+
}
477+
478+
pde = pde_offset(pdpte, addr);
479+
if (pgentry_present(ptt, *pde) == 0UL) {
480+
return NULL;
481+
} else if (pde_large(*pde) != 0UL) {
482+
*pg_size = PDE_SIZE;
483+
return pde;
484+
}
485+
486+
pte = pte_offset(pde, addr);
487+
if (pgentry_present(ptt, *pte) == 0UL) {
488+
return NULL;
489+
} else {
490+
*pg_size = PTE_SIZE;
491+
return pte;
492+
}
493+
}

hypervisor/include/arch/x86/mmu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ void invept(struct vcpu *vcpu);
339339
bool check_continuous_hpa(struct vm *vm, uint64_t gpa_arg, uint64_t size_arg);
340340
int obtain_last_page_table_entry(struct map_params *map_params,
341341
struct entry_params *entry, void *addr, bool direct);
342+
uint64_t *lookup_address(uint64_t *pml4_page, uint64_t addr,
343+
uint64_t *pg_size, enum _page_table_type ptt);
342344

343345
int register_mmio_emulation_handler(struct vm *vm,
344346
hv_mem_io_handler_t read_write, uint64_t start,

0 commit comments

Comments
 (0)