mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-04 05:09:49 +00:00
hv: ept: only treak execution right for large pages
To mitigate the page size change MCE vulnerability (CVE-2018-12207), ACRN would clear the execution permission in the EPT paging-structure entries for large pages and then intercept an EPT execution-permission violation caused by an attempt to execution an instruction in the guest. However, the current code would clear the execution permission in the EPT paging- structure entries for small pages too when we clearing the the execution permission for large pages. This would trigger extra EPT violation VM exits. This patch fix this issue. Signed-off-by: Li Fei1 <fei1.li@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com> Tracked-On: #5788
This commit is contained in:
parent
848d48786a
commit
01b54241c6
@ -309,6 +309,7 @@ static void add_pde(const uint64_t *pdpte, uint64_t paddr_start, uint64_t vaddr_
|
||||
uint64_t vaddr = vaddr_start;
|
||||
uint64_t paddr = paddr_start;
|
||||
uint64_t index = pde_index(vaddr);
|
||||
uint64_t local_prot = prot;
|
||||
|
||||
dev_dbg(DBG_LEVEL_MMU, "%s, paddr: 0x%lx, vaddr: [0x%lx - 0x%lx]\n",
|
||||
__func__, paddr, vaddr, vaddr_end);
|
||||
@ -324,8 +325,8 @@ static void add_pde(const uint64_t *pdpte, uint64_t paddr_start, uint64_t vaddr_
|
||||
mem_aligned_check(paddr, PDE_SIZE) &&
|
||||
mem_aligned_check(vaddr, PDE_SIZE) &&
|
||||
(vaddr_next <= vaddr_end)) {
|
||||
mem_ops->tweak_exe_right(&prot);
|
||||
set_pgentry(pde, paddr | (prot | PAGE_PSE), mem_ops);
|
||||
mem_ops->tweak_exe_right(&local_prot);
|
||||
set_pgentry(pde, paddr | (local_prot | PAGE_PSE), mem_ops);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
paddr += (vaddr_next - vaddr);
|
||||
vaddr = vaddr_next;
|
||||
@ -358,6 +359,7 @@ static void add_pdpte(const uint64_t *pml4e, uint64_t paddr_start, uint64_t vadd
|
||||
uint64_t vaddr = vaddr_start;
|
||||
uint64_t paddr = paddr_start;
|
||||
uint64_t index = pdpte_index(vaddr);
|
||||
uint64_t local_prot = prot;
|
||||
|
||||
dev_dbg(DBG_LEVEL_MMU, "%s, paddr: 0x%lx, vaddr: [0x%lx - 0x%lx]\n", __func__, paddr, vaddr, vaddr_end);
|
||||
for (; index < PTRS_PER_PDPTE; index++) {
|
||||
@ -372,8 +374,8 @@ static void add_pdpte(const uint64_t *pml4e, uint64_t paddr_start, uint64_t vadd
|
||||
mem_aligned_check(paddr, PDPTE_SIZE) &&
|
||||
mem_aligned_check(vaddr, PDPTE_SIZE) &&
|
||||
(vaddr_next <= vaddr_end)) {
|
||||
mem_ops->tweak_exe_right(&prot);
|
||||
set_pgentry(pdpte, paddr | (prot | PAGE_PSE), mem_ops);
|
||||
mem_ops->tweak_exe_right(&local_prot);
|
||||
set_pgentry(pdpte, paddr | (local_prot | PAGE_PSE), mem_ops);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
paddr += (vaddr_next - vaddr);
|
||||
vaddr = vaddr_next;
|
||||
|
Loading…
Reference in New Issue
Block a user