x86: fix pte corruption when setting large regions
We need a copy of the flags field for ever PTE we are updating, we can't just keep OR-ing in the address field. Fixes issues seen when setting flags for memory regions larger than a page. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
605ae101eb
commit
1459bed346
1 changed files with 3 additions and 2 deletions
|
@ -195,6 +195,7 @@ void _x86_mmu_set_flags(struct x86_mmu_pdpt *pdpt, void *ptr,
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size != 0) {
|
while (size != 0) {
|
||||||
|
x86_page_entry_data_t cur_flags = flags;
|
||||||
|
|
||||||
/* TODO we're not generating 2MB entries at the moment */
|
/* TODO we're not generating 2MB entries at the moment */
|
||||||
__ASSERT(X86_MMU_GET_PDE(pdpt, addr)->ps != 1, "2MB PDE found");
|
__ASSERT(X86_MMU_GET_PDE(pdpt, addr)->ps != 1, "2MB PDE found");
|
||||||
|
@ -206,10 +207,10 @@ void _x86_mmu_set_flags(struct x86_mmu_pdpt *pdpt, void *ptr,
|
||||||
*/
|
*/
|
||||||
if (((mask & MMU_PTE_P_MASK) != 0) &&
|
if (((mask & MMU_PTE_P_MASK) != 0) &&
|
||||||
((flags & MMU_ENTRY_PRESENT) != 0)) {
|
((flags & MMU_ENTRY_PRESENT) != 0)) {
|
||||||
flags |= addr;
|
cur_flags |= addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
pte->value = (pte->value & ~mask) | flags;
|
pte->value = (pte->value & ~mask) | cur_flags;
|
||||||
tlb_flush_page((void *)addr);
|
tlb_flush_page((void *)addr);
|
||||||
|
|
||||||
size -= MMU_PAGE_SIZE;
|
size -= MMU_PAGE_SIZE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue