[haiku-commits] Change in haiku[master]: kernel/arm: ensure page dir is correctly aligned

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 30 Jun 2022 10:23:10 +0000

From David Karoly <karolyd577@xxxxxxxxx>:

David Karoly has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/5423 ;)


Change subject: kernel/arm: ensure page dir is correctly aligned
......................................................................

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
---
M src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp
1 file changed, 21 insertions(+), 3 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/23/5423/1

diff --git 
a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp 
b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp
index f872472..14055f2 100644
--- a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp
+++ b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp
@@ -100,16 +100,34 @@
                        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 = {};
+
+               area_id pgdir_area = create_area_etc(B_SYSTEM_TEAM, "pgdir",
+                       PAGEDIR_SIZE + PAGEDIR_ALIGN, 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;
                vm_get_page_mapping(VMAddressSpace::KernelID(),
                        (addr_t)virtualPageDir, &physicalPageDir);

+               // ensure that the physical address is properly aligned
+               if (physicalPageDir % PAGEDIR_ALIGN != 0) {
+                       uint32_t physicalAlignOffset = PAGEDIR_ALIGN - 
(physicalPageDir % PAGEDIR_ALIGN);
+
+                       physicalPageDir += physicalAlignOffset;
+                       virtualPageDir = (page_directory_entry 
*)((uint32_t)virtualPageDir + physicalAlignOffset);
+               }
+
                fPagingStructures->Init(virtualPageDir, physicalPageDir,
                        method->KernelVirtualPageDirectory());
        } else {

--
To view, visit https://review.haiku-os.org/c/haiku/+/5423
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I6723023c9deaa1c4a1081cf5a984a1766241a532
Gerrit-Change-Number: 5423
Gerrit-PatchSet: 1
Gerrit-Owner: David Karoly <karolyd577@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: kernel/arm: ensure page dir is correctly aligned - Gerrit