From d283a8c58a00a17037019e932151694300c7cc01 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Thu, 27 Jan 2022 17:12:47 +0100 Subject: [PATCH] kernel/arm: add range checking for early page tables Change-Id: Ibbd367475482eb0cf839314014c8bf68612c5d6a Reviewed-on: https://review.haiku-os.org/c/haiku/+/4891 Reviewed-by: Alex von Gluck IV --- headers/private/kernel/arch/arm/arch_kernel_args.h | 1 + src/system/boot/platform/efi/arch/arm/arch_mmu.cpp | 3 +++ .../kernel/arch/arm/paging/32bit/ARMPagingMethod32Bit.cpp | 3 +++ 3 files changed, 7 insertions(+) diff --git a/headers/private/kernel/arch/arm/arch_kernel_args.h b/headers/private/kernel/arch/arm/arch_kernel_args.h index f2a9881db3..081e7b9bcf 100644 --- a/headers/private/kernel/arch/arm/arch_kernel_args.h +++ b/headers/private/kernel/arch/arm/arch_kernel_args.h @@ -32,6 +32,7 @@ typedef struct { uint32 phys_pgdir; uint32 vir_pgdir; uint32 next_pagetable; + uint32 last_pagetable; // The virtual ranges we want to keep in the kernel. uint32 num_virtual_ranges_to_keep; 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 f01c31c9a4..a5938bc393 100644 --- a/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp +++ b/src/system/boot/platform/efi/arch/arm/arch_mmu.cpp @@ -346,6 +346,7 @@ arch_mmu_generate_post_efi_page_tables(size_t memoryMapSize, gKernelArgs.arch_args.phys_pgdir = (uint32)sPageDirectory; gKernelArgs.arch_args.vir_pgdir = (uint32)virtPageDirectory; gKernelArgs.arch_args.next_pagetable = (uint32)(sNextPageTable) - (uint32)sPageDirectory; + gKernelArgs.arch_args.last_pagetable = (uint32)(sLastPageTable) - (uint32)sPageDirectory; TRACE("gKernelArgs.arch_args.phys_pgdir = 0x%08x\n", (uint32_t)gKernelArgs.arch_args.phys_pgdir); @@ -353,6 +354,8 @@ arch_mmu_generate_post_efi_page_tables(size_t memoryMapSize, (uint32_t)gKernelArgs.arch_args.vir_pgdir); TRACE("gKernelArgs.arch_args.next_pagetable = 0x%08x\n", (uint32_t)gKernelArgs.arch_args.next_pagetable); + TRACE("gKernelArgs.arch_args.last_pagetable = 0x%08x\n", + (uint32_t)gKernelArgs.arch_args.last_pagetable); #ifdef TRACE_PAGE_DIRECTORY dump_page_dir(); diff --git a/src/system/kernel/arch/arm/paging/32bit/ARMPagingMethod32Bit.cpp b/src/system/kernel/arch/arm/paging/32bit/ARMPagingMethod32Bit.cpp index 6b02435316..05673ea7f2 100644 --- a/src/system/kernel/arch/arm/paging/32bit/ARMPagingMethod32Bit.cpp +++ b/src/system/kernel/arch/arm/paging/32bit/ARMPagingMethod32Bit.cpp @@ -364,6 +364,9 @@ ARMPagingMethod32Bit::CreateTranslationMap(bool kernel, VMTranslationMap** _map) static void get_free_pgtable(kernel_args* args, phys_addr_t* phys_addr, addr_t* virt_addr) { + if (args->arch_args.next_pagetable >= args->arch_args.last_pagetable) + panic("ran out of early page tables"); + phys_addr_t phys = args->arch_args.phys_pgdir + args->arch_args.next_pagetable; addr_t virt = args->arch_args.vir_pgdir + args->arch_args.next_pagetable; args->arch_args.next_pagetable += ARM_MMU_L2_COARSE_TABLE_SIZE;