From ab78f824da7629c6167c3209d358b8f6d38d78e1 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Wed, 20 Apr 2022 15:17:31 +0200 Subject: [PATCH] boot/efi/arm: handle unaligned ranges in map_range_to_new_area() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia6c707bf8381b77aa8b256a007fb51f1c32e9e17 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5183 Reviewed-by: Jérôme Duval --- .../boot/platform/efi/arch/arm/arch_mmu.cpp | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp b/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp index a5938bc393..430d583ce3 100644 --- a/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp +++ b/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp @@ -128,22 +128,27 @@ insert_virtual_range_to_keep(uint64 start, uint64 size) } +static addr_t +map_range_to_new_area(addr_t start, size_t size, uint32_t flags) +{ + if (size == 0) + return 0; + + phys_addr_t physAddr = ROUNDDOWN(start, B_PAGE_SIZE); + size_t alignedSize = ROUNDUP(size + (start - physAddr), B_PAGE_SIZE); + addr_t virtAddr = get_next_virtual_address(alignedSize); + + map_range(virtAddr, physAddr, alignedSize, flags); + insert_virtual_range_to_keep(virtAddr, alignedSize); + + return virtAddr + (start - physAddr); +} + + static void map_range_to_new_area(addr_range& range, uint32_t flags) { - if (range.size == 0) { - range.start = 0; - return; - } - - phys_addr_t physAddr = range.start; - addr_t virtAddr = get_next_virtual_address(range.size); - - map_range(virtAddr, physAddr, range.size, flags); - - range.start = virtAddr; - - insert_virtual_range_to_keep(range.start, range.size); + range.start = map_range_to_new_area(range.start, range.size, flags); } @@ -151,9 +156,7 @@ static void map_range_to_new_area(efi_memory_descriptor *entry, uint32_t flags) { uint64_t size = entry->NumberOfPages * B_PAGE_SIZE; - entry->VirtualStart = get_next_virtual_address(size); - map_range(entry->VirtualStart, entry->PhysicalStart, size, flags); - insert_virtual_range_to_keep(entry->VirtualStart, size); + entry->VirtualStart = map_range_to_new_area(entry->PhysicalStart, size, flags); }