Skip to content

Commit f7f04ba

Browse files
lifeixlijinxia
authored andcommitted
hv: mmu: minor fix about hv mmu && ept modify
1. fix some description for hv mmu_modify 2. add pml4_page input parameter for ept_mr_modify to keep align with ept_mr_add and ept_mr_del which will support add or delete MR for trusty. Signed-off-by: Li, Fei1 <fei1.li@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 502e3e2 commit f7f04ba

File tree

5 files changed

+43
-45
lines changed

5 files changed

+43
-45
lines changed

hypervisor/arch/x86/ept.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -518,15 +518,16 @@ int ept_mr_add(struct vm *vm, uint64_t hpa,
518518
return 0;
519519
}
520520

521-
int ept_mr_modify(struct vm *vm, uint64_t gpa, uint64_t size,
522-
uint64_t attr_set, uint64_t attr_clr)
521+
int ept_mr_modify(struct vm *vm, uint64_t *pml4_page,
522+
uint64_t gpa, uint64_t size,
523+
uint64_t prot_set, uint64_t prot_clr)
523524
{
524525
struct vcpu *vcpu;
525526
uint16_t i;
526527
int ret;
527528

528-
ret = mmu_modify((uint64_t *)vm->arch_vm.nworld_eptp,
529-
gpa, size, attr_set, attr_clr, PTT_EPT);
529+
ret = mmu_modify(pml4_page, gpa, size,
530+
prot_set, prot_clr, PTT_EPT);
530531

531532
foreach_vcpu(i, vm, vcpu) {
532533
vcpu_make_request(vcpu, ACRN_REQUEST_EPT_FLUSH);

hypervisor/arch/x86/guest/guest.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -597,14 +597,7 @@ static void rebuild_vm0_e820(void)
597597
int prepare_vm0_memmap_and_e820(struct vm *vm)
598598
{
599599
uint32_t i;
600-
uint64_t attr_wb = (IA32E_EPT_R_BIT |
601-
IA32E_EPT_W_BIT |
602-
IA32E_EPT_X_BIT |
603-
IA32E_EPT_WB);
604-
uint64_t attr_uc = (IA32E_EPT_R_BIT |
605-
IA32E_EPT_W_BIT |
606-
IA32E_EPT_X_BIT |
607-
IA32E_EPT_UNCACHED);
600+
uint64_t attr_uc = (EPT_RWX | EPT_UNCACHED);
608601
struct e820_entry *entry;
609602
uint64_t hv_hpa;
610603

@@ -622,8 +615,9 @@ int prepare_vm0_memmap_and_e820(struct vm *vm)
622615
for (i = 0U; i < e820_entries; i++) {
623616
entry = &e820[i];
624617
if (entry->type == E820_TYPE_RAM) {
625-
ept_mr_add(vm, entry->baseaddr, entry->baseaddr,
626-
entry->length, attr_wb);
618+
ept_mr_modify(vm, (uint64_t *)vm->arch_vm.nworld_eptp,
619+
entry->baseaddr, entry->length,
620+
EPT_WB, EPT_MT_MASK);
627621
}
628622
}
629623

hypervisor/arch/x86/mtrr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ static uint32_t update_ept(struct vm *vm, uint64_t start,
145145
attr = IA32E_EPT_UNCACHED;
146146
}
147147

148-
ept_mr_modify(vm, start, size, attr, IA32E_EPT_MT_MASK);
148+
ept_mr_modify(vm, (uint64_t *)vm->arch_vm.nworld_eptp,
149+
start, size, attr, IA32E_EPT_MT_MASK);
149150
return attr;
150151
}
151152

hypervisor/arch/x86/pagetable.c

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -56,60 +56,66 @@ static int split_large_page(uint64_t *pte,
5656
return 0;
5757
}
5858

59+
static inline void __modify_pte(uint64_t *pte,
60+
uint64_t prot_set, uint64_t prot_clr)
61+
{
62+
uint64_t new_pte = *pte;
63+
new_pte &= ~prot_clr;
64+
new_pte |= prot_set;
65+
set_pte(pte, new_pte);
66+
}
67+
5968
/*
60-
* In PT level, modify [vaddr_start, vaddr_end) MR PTA.
69+
* In PT level,
70+
* modify [vaddr_start, vaddr_end) memory type or page access right.
6171
*/
6272
static int modify_pte(uint64_t *pde,
6373
uint64_t vaddr_start, uint64_t vaddr_end,
6474
uint64_t prot_set, uint64_t prot_clr,
6575
enum _page_table_type ptt)
6676
{
67-
uint64_t *pd_page = pde_page_vaddr(*pde);
77+
uint64_t *pt_page = pde_page_vaddr(*pde);
6878
uint64_t vaddr = vaddr_start;
6979
uint64_t index = pte_index(vaddr);
7080

7181
dev_dbg(ACRN_DBG_MMU, "%s, vaddr: [0x%llx - 0x%llx]\n",
7282
__func__, vaddr, vaddr_end);
7383
for (; index < PTRS_PER_PTE; index++) {
74-
uint64_t new_pte, *pte = pd_page + index;
75-
uint64_t vaddr_next = (vaddr & PTE_MASK) + PTE_SIZE;
84+
uint64_t *pte = pt_page + index;
7685

7786
if (pgentry_present(ptt, *pte) == 0UL) {
7887
pr_err("%s, invalid op, pte not present\n", __func__);
7988
return -EFAULT;
8089
}
8190

82-
new_pte = *pte;
83-
new_pte &= ~prot_clr;
84-
new_pte |= prot_set;
85-
set_pte(pte, new_pte);
86-
87-
if (vaddr_next >= vaddr_end) {
91+
__modify_pte(pte, prot_set, prot_clr);
92+
vaddr += PTE_SIZE;
93+
if (vaddr >= vaddr_end) {
8894
break;
8995
}
90-
vaddr = vaddr_next;
9196
}
9297

9398
return 0;
9499
}
95100

96101
/*
97-
* In PD level, modify [vaddr_start, vaddr_end) MR PTA.
102+
* In PD level,
103+
* modify [vaddr_start, vaddr_end) memory type or page access right.
98104
*/
99105
static int modify_pde(uint64_t *pdpte,
100106
uint64_t vaddr_start, uint64_t vaddr_end,
101107
uint64_t prot_set, uint64_t prot_clr,
102108
enum _page_table_type ptt)
103109
{
104110
int ret = 0;
105-
uint64_t *pdpt_page = pdpte_page_vaddr(*pdpte);
111+
uint64_t *pd_page = pdpte_page_vaddr(*pdpte);
106112
uint64_t vaddr = vaddr_start;
107113
uint64_t index = pde_index(vaddr);
108114

109115
dev_dbg(ACRN_DBG_MMU, "%s, vaddr: [0x%llx - 0x%llx]\n",
110116
__func__, vaddr, vaddr_end);
111117
for (; index < PTRS_PER_PDE; index++) {
112-
uint64_t *pde = pdpt_page + index;
118+
uint64_t *pde = pd_page + index;
113119
uint64_t vaddr_next = (vaddr & PDE_MASK) + PDE_SIZE;
114120

115121
if (pgentry_present(ptt, *pde) == 0UL) {
@@ -123,10 +129,7 @@ static int modify_pde(uint64_t *pdpte,
123129
return ret;
124130
}
125131
} else {
126-
uint64_t new_pde = *pde;
127-
new_pde &= ~prot_clr;
128-
new_pde |= prot_set;
129-
set_pte(pde, new_pde);
132+
__modify_pte(pde, prot_set, prot_clr);
130133
if (vaddr_next < vaddr_end) {
131134
vaddr = vaddr_next;
132135
continue;
@@ -146,22 +149,23 @@ static int modify_pde(uint64_t *pdpte,
146149
}
147150

148151
/*
149-
* In PDPT level, modify [vaddr, vaddr_end) MR PTA.
152+
* In PDPT level,
153+
* modify [vaddr_start, vaddr_end) memory type or page access right.
150154
*/
151155
static int modify_pdpte(uint64_t *pml4e,
152156
uint64_t vaddr_start, uint64_t vaddr_end,
153157
uint64_t prot_set, uint64_t prot_clr,
154158
enum _page_table_type ptt)
155159
{
156160
int ret = 0;
157-
uint64_t *pml4_page = pml4e_page_vaddr(*pml4e);
161+
uint64_t *pdpt_page = pml4e_page_vaddr(*pml4e);
158162
uint64_t vaddr = vaddr_start;
159163
uint64_t index = pdpte_index(vaddr);
160164

161165
dev_dbg(ACRN_DBG_MMU, "%s, vaddr: [0x%llx - 0x%llx]\n",
162166
__func__, vaddr, vaddr_end);
163167
for (; index < PTRS_PER_PDPTE; index++) {
164-
uint64_t *pdpte = pml4_page + index;
168+
uint64_t *pdpte = pdpt_page + index;
165169
uint64_t vaddr_next = (vaddr & PDPTE_MASK) + PDPTE_SIZE;
166170

167171
if (pgentry_present(ptt, *pdpte) == 0UL) {
@@ -175,10 +179,7 @@ static int modify_pdpte(uint64_t *pml4e,
175179
return ret;
176180
}
177181
} else {
178-
uint64_t new_pdpte = *pdpte;
179-
new_pdpte &= ~prot_clr;
180-
new_pdpte |= prot_set;
181-
set_pte(pdpte, new_pdpte);
182+
__modify_pte(pdpte, prot_set, prot_clr);
182183
if (vaddr_next < vaddr_end) {
183184
vaddr = vaddr_next;
184185
continue;
@@ -198,9 +199,9 @@ static int modify_pdpte(uint64_t *pml4e,
198199
}
199200

200201
/*
201-
* modify [vaddr, vaddr + size ) memory region page table attributes.
202-
* prot_clr - attributes want to be clear
203-
* prot_set - attributes want to be set
202+
* modify [vaddr, vaddr + size ) memory type or page access right.
203+
* prot_clr - memory type or page access right want to be clear
204+
* prot_set - memory type or page access right want to be set
204205
* @pre: the prot_set and prot_clr should set before call this function.
205206
* If you just want to modify access rights, you can just set the prot_clr
206207
* to what you want to set, prot_clr to what you want to clear. But if you

hypervisor/include/arch/x86/mmu.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,9 @@ uint64_t _gpa2hpa(struct vm *vm, uint64_t gpa, uint32_t *size);
400400
uint64_t hpa2gpa(struct vm *vm, uint64_t hpa);
401401
int ept_mr_add(struct vm *vm, uint64_t hpa,
402402
uint64_t gpa, uint64_t size, uint32_t prot);
403-
int ept_mr_modify(struct vm *vm, uint64_t gpa, uint64_t size,
404-
uint64_t attr_set, uint64_t attr_clr);
403+
int ept_mr_modify(struct vm *vm, uint64_t *pml4_page,
404+
uint64_t gpa, uint64_t size,
405+
uint64_t prot_set, uint64_t prot_clr);
405406
int ept_mr_del(struct vm *vm, uint64_t hpa,
406407
uint64_t gpa, uint64_t size);
407408

0 commit comments

Comments
 (0)