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;