From 79033fbc8b41824cb9b8f9c0c62a9e81e2ef68df Mon Sep 17 00:00:00 2001 From: fef Date: Thu, 30 Dec 2021 16:07:35 +0100 Subject: [PATCH] x86/mm: disable page caching in direct map --- arch/x86/mm/amd64/init.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/arch/x86/mm/amd64/init.c b/arch/x86/mm/amd64/init.c index da86304..23e3f58 100644 --- a/arch/x86/mm/amd64/init.c +++ b/arch/x86/mm/amd64/init.c @@ -19,8 +19,6 @@ struct vm_page *const vm_page_array = (vm_page_t)VM_PAGE_ARRAY_OFFSET; vm_page_t _vm_page_array_end = (vm_page_t)(VM_PAGE_ARRAY_OFFSET + VM_PAGE_ARRAY_LENGTH); #endif -/** @brief Initialize the members of `vm_page_array` within the given range. */ -static void init_page_range(vm_paddr_t start, vm_paddr_t end, u_int flags); static void print_mem_area(struct mb2_mmap_entry *entry); static void register_area(struct mb2_mmap_entry *entry) @@ -131,7 +129,7 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) vm_paddr_t pml4te_val = __boot_pmalloc(PAGE_SHIFT, MM_ZONE_NORMAL); panic_if(pml4te_val == BOOT_PMALLOC_ERR, "cannot reserve memory for vm_page_array"); __boot_clear_page(pml4te_val); - pml4te_val |= __P_PRESENT | __P_RW | __P_GLOBAL | __P_NOEXEC; + pml4te_val |= __P_PRESENT | __P_RW | __P_NOCACHE | __P_GLOBAL | __P_NOEXEC; pml4te->val = pml4te_val; vm_flush(); @@ -147,8 +145,8 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) * that is not the case. I've checked the disassembly with -O2, * and clang is emitting the check. So it's fine, i guess. */ if (pdpte_val != BOOT_PMALLOC_ERR) { - pdpte_val |= __P_PRESENT | __P_RW | __P_HUGE - | __P_GLOBAL | __P_NOEXEC; + pdpte_val |= __P_PRESENT | __P_RW | __P_NOCACHE + | __P_HUGE | __P_GLOBAL | __P_NOEXEC; pdpte->val = pdpte_val; map_pos += GIGAPAGE_SIZE; if (map_pos >= map_end) @@ -162,7 +160,7 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) panic_if(pdpte_val == BOOT_PMALLOC_ERR, "cannot reserve memory for vm_page_array"); __boot_clear_page(pdpte_val); - pdpte_val |= __P_PRESENT | __P_RW | __P_GLOBAL | __P_NOEXEC; + pdpte_val |= __P_PRESENT | __P_RW | __P_NOCACHE | __P_GLOBAL | __P_NOEXEC; pdpte->val = pdpte_val; vm_flush(); @@ -175,8 +173,8 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) if (map_end - map_pos >= HUGEPAGE_SIZE) { pdte_val = __boot_pmalloc(X86_PDT_SHIFT, MM_ZONE_NORMAL); if (pdte_val != BOOT_PMALLOC_ERR) { - pdte_val |= __P_PRESENT | __P_RW | __P_GLOBAL - | __P_HUGE | __P_NOEXEC; + pdte_val |= __P_PRESENT | __P_RW | __P_NOCACHE + | __P_GLOBAL | __P_HUGE | __P_NOEXEC; pdte->val = pdte_val; map_pos += HUGEPAGE_SIZE; if (map_pos >= map_end) @@ -190,7 +188,8 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) panic_if(pdte_val == BOOT_PMALLOC_ERR, "cannot reserve memory for vm_page_array"); __boot_clear_page(pdpte_val); - pdte_val |= __P_PRESENT | __P_RW | __P_GLOBAL | __P_NOEXEC; + pdte_val |= __P_PRESENT | __P_RW | __P_NOCACHE + | __P_GLOBAL | __P_NOEXEC; pdte->val = pdte_val; vm_flush(); @@ -200,7 +199,8 @@ void x86_paging_init(struct mb2_tag_mmap *mmap) vm_paddr_t pte_val = __boot_pmalloc(X86_PT_SHIFT, MM_ZONE_NORMAL); panic_if(pte_val == BOOT_PMALLOC_ERR, "cannot reserve memory for vm_page_array"); - pte_val |= __P_PRESENT | __P_RW | __P_GLOBAL | __P_NOEXEC; + pte_val |= __P_PRESENT | __P_RW | __P_NOCACHE + | __P_GLOBAL | __P_NOEXEC; pte->val = pte_val; map_pos += PAGE_SIZE; @@ -229,10 +229,10 @@ void __boot_clear_page(vm_paddr_t paddr) vm_offset_t offset = paddr - pbase; void *vbase = (void *)KERNBASE - (1 << X86_PDPT_SHIFT); x86_pdpte_t *pdpe = X86_PDPTE(vbase); - pdpe->val = pbase | __P_PRESENT | __P_RW | __P_HUGE | __P_NOEXEC; + pdpe->val = pbase | __P_PRESENT | __P_RW | __P_NOCACHE | __P_HUGE | __P_NOEXEC; vm_flush(); - memset(vbase + offset, 0, PAGE_SIZE); - pdpe->flags.present = false; + memset64(vbase + offset, 0, PAGE_SIZE); + pdpe->val = 0; vm_flush(); }