Skip to content

Commit 1459bed

Browse files
Andrew Boienashif
authored andcommitted
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 <[email protected]>
1 parent 605ae10 commit 1459bed

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

arch/x86/core/x86_mmu.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ void _x86_mmu_set_flags(struct x86_mmu_pdpt *pdpt, void *ptr,
195195
}
196196

197197
while (size != 0) {
198+
x86_page_entry_data_t cur_flags = flags;
198199

199200
/* TODO we're not generating 2MB entries at the moment */
200201
__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,
206207
*/
207208
if (((mask & MMU_PTE_P_MASK) != 0) &&
208209
((flags & MMU_ENTRY_PRESENT) != 0)) {
209-
flags |= addr;
210+
cur_flags |= addr;
210211
}
211212

212-
pte->value = (pte->value & ~mask) | flags;
213+
pte->value = (pte->value & ~mask) | cur_flags;
213214
tlb_flush_page((void *)addr);
214215

215216
size -= MMU_PAGE_SIZE;

0 commit comments

Comments
 (0)