From fe3405c087a41b170a77629685de983073108163 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Fri, 1 Jul 2022 17:19:20 +0200 Subject: [PATCH] kernel/arm: ensure page dir is correctly aligned Page directory physical address must be aligned on 16K and it must be mapped to a contiguous physical region. Change-Id: I6723023c9deaa1c4a1081cf5a984a1766241a532 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5423 Tested-by: Commit checker robot Reviewed-by: Adrien Destugues --- .../paging/32bit/ARMVMTranslationMap32Bit.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp index f872472473..577df91399 100644 --- a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp +++ b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp @@ -100,10 +100,22 @@ ARMVMTranslationMap32Bit::Init(bool kernel) return error; // allocate the page directory - page_directory_entry* virtualPageDir = (page_directory_entry*)memalign( - PAGEDIR_ALIGN, PAGEDIR_SIZE); - if (virtualPageDir == NULL) + page_directory_entry *virtualPageDir = NULL; + + virtual_address_restrictions virtualRestrictions = {}; + virtualRestrictions.address_specification = B_ANY_KERNEL_ADDRESS; + + physical_address_restrictions physicalRestrictions = {}; + physicalRestrictions.alignment = PAGEDIR_ALIGN; + + area_id pgdir_area = create_area_etc(B_SYSTEM_TEAM, "pgdir", + PAGEDIR_SIZE, B_CONTIGUOUS, + B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, 0, 0, + &virtualRestrictions, &physicalRestrictions, (void **)&virtualPageDir); + + if (pgdir_area < 0) { return B_NO_MEMORY; + } // look up the page directory's physical address phys_addr_t physicalPageDir;