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