mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 13:37:10 +00:00
hv:refine modify_or_del_pte/pde/pdpte()function
1. Print warning message instead of panic when the caller try to modify the attribute for memory region or delete memory region that are not present. 2. To avoid above warning message for memory region below 1M,its attribute may be updated by Service VM when updating MTTR setting. Tracked-On: #4112 Signed-off-by: Yonghua Huang <yonghua.huang@intel.com> Reviewed-by: Fei Li <fei1.li@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
62e9d9bf75
commit
52a968db2f
@ -91,10 +91,18 @@ static void modify_or_del_pte(const uint64_t *pde, uint64_t vaddr_start, uint64_
|
||||
uint64_t *pte = pt_page + index;
|
||||
|
||||
if (mem_ops->pgentry_present(*pte) == 0UL) {
|
||||
panic("invalid op, pte not present");
|
||||
/*
|
||||
* Entry is not present, print warning message but avoid complains for
|
||||
* low memory (< 1M bytes), Service VM may update attributes for this region
|
||||
* when updating MTRR setting.
|
||||
*/
|
||||
if (vaddr >= MEM_1M) {
|
||||
pr_warn("%s, vaddr: 0x%lx pte is not present.\n", __func__, vaddr);
|
||||
}
|
||||
} else {
|
||||
local_modify_or_del_pte(pte, prot_set, prot_clr, type);
|
||||
}
|
||||
|
||||
local_modify_or_del_pte(pte, prot_set, prot_clr, type);
|
||||
vaddr += PTE_SIZE;
|
||||
if (vaddr >= vaddr_end) {
|
||||
break;
|
||||
@ -122,21 +130,23 @@ static void modify_or_del_pde(const uint64_t *pdpte, uint64_t vaddr_start, uint6
|
||||
uint64_t vaddr_next = (vaddr & PDE_MASK) + PDE_SIZE;
|
||||
|
||||
if (mem_ops->pgentry_present(*pde) == 0UL) {
|
||||
panic("invalid op, pde not present");
|
||||
}
|
||||
if (pde_large(*pde) != 0UL) {
|
||||
if (vaddr_next > vaddr_end || !mem_aligned_check(vaddr, PDE_SIZE)) {
|
||||
split_large_page(pde, IA32E_PD, vaddr, mem_ops);
|
||||
} else {
|
||||
local_modify_or_del_pte(pde, prot_set, prot_clr, type);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
vaddr = vaddr_next;
|
||||
continue;
|
||||
pr_warn("%s, addr: 0x%lx pde is not present.\n", __func__, vaddr);
|
||||
} else {
|
||||
if (pde_large(*pde) != 0UL) {
|
||||
if (vaddr_next > vaddr_end || !mem_aligned_check(vaddr, PDE_SIZE)) {
|
||||
split_large_page(pde, IA32E_PD, vaddr, mem_ops);
|
||||
} else {
|
||||
local_modify_or_del_pte(pde, prot_set, prot_clr, type);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
vaddr = vaddr_next;
|
||||
continue;
|
||||
}
|
||||
break; /* done */
|
||||
}
|
||||
break; /* done */
|
||||
}
|
||||
modify_or_del_pte(pde, vaddr, vaddr_end, prot_set, prot_clr, mem_ops, type);
|
||||
}
|
||||
modify_or_del_pte(pde, vaddr, vaddr_end, prot_set, prot_clr, mem_ops, type);
|
||||
|
||||
if (vaddr_next >= vaddr_end) {
|
||||
break; /* done */
|
||||
}
|
||||
@ -164,22 +174,24 @@ static void modify_or_del_pdpte(const uint64_t *pml4e, uint64_t vaddr_start, uin
|
||||
uint64_t vaddr_next = (vaddr & PDPTE_MASK) + PDPTE_SIZE;
|
||||
|
||||
if (mem_ops->pgentry_present(*pdpte) == 0UL) {
|
||||
panic("invalid op, pdpte not present");
|
||||
}
|
||||
if (pdpte_large(*pdpte) != 0UL) {
|
||||
if (vaddr_next > vaddr_end ||
|
||||
pr_warn("%s, addr: 0x%lx pdpte is not present.\n", __func__, vaddr);
|
||||
} else {
|
||||
if (pdpte_large(*pdpte) != 0UL) {
|
||||
if (vaddr_next > vaddr_end ||
|
||||
!mem_aligned_check(vaddr, PDPTE_SIZE)) {
|
||||
split_large_page(pdpte, IA32E_PDPT, vaddr, mem_ops);
|
||||
} else {
|
||||
local_modify_or_del_pte(pdpte, prot_set, prot_clr, type);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
vaddr = vaddr_next;
|
||||
continue;
|
||||
split_large_page(pdpte, IA32E_PDPT, vaddr, mem_ops);
|
||||
} else {
|
||||
local_modify_or_del_pte(pdpte, prot_set, prot_clr, type);
|
||||
if (vaddr_next < vaddr_end) {
|
||||
vaddr = vaddr_next;
|
||||
continue;
|
||||
}
|
||||
break; /* done */
|
||||
}
|
||||
break; /* done */
|
||||
}
|
||||
modify_or_del_pde(pdpte, vaddr, vaddr_end, prot_set, prot_clr, mem_ops, type);
|
||||
}
|
||||
modify_or_del_pde(pdpte, vaddr, vaddr_end, prot_set, prot_clr, mem_ops, type);
|
||||
|
||||
if (vaddr_next >= vaddr_end) {
|
||||
break; /* done */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user