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 <[email protected]>
This commit is contained in:
David Karoly
2022-01-27 16:29:48 +00:00
committed by Alex von Gluck IV
parent 79ee00628f
commit d283a8c58a
3 changed files with 7 additions and 0 deletions
@@ -32,6 +32,7 @@ typedef struct {
uint32 phys_pgdir; uint32 phys_pgdir;
uint32 vir_pgdir; uint32 vir_pgdir;
uint32 next_pagetable; uint32 next_pagetable;
uint32 last_pagetable;
// The virtual ranges we want to keep in the kernel. // The virtual ranges we want to keep in the kernel.
uint32 num_virtual_ranges_to_keep; uint32 num_virtual_ranges_to_keep;
@@ -346,6 +346,7 @@ arch_mmu_generate_post_efi_page_tables(size_t memoryMapSize,
gKernelArgs.arch_args.phys_pgdir = (uint32)sPageDirectory; gKernelArgs.arch_args.phys_pgdir = (uint32)sPageDirectory;
gKernelArgs.arch_args.vir_pgdir = (uint32)virtPageDirectory; gKernelArgs.arch_args.vir_pgdir = (uint32)virtPageDirectory;
gKernelArgs.arch_args.next_pagetable = (uint32)(sNextPageTable) - (uint32)sPageDirectory; 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", TRACE("gKernelArgs.arch_args.phys_pgdir = 0x%08x\n",
(uint32_t)gKernelArgs.arch_args.phys_pgdir); (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); (uint32_t)gKernelArgs.arch_args.vir_pgdir);
TRACE("gKernelArgs.arch_args.next_pagetable = 0x%08x\n", TRACE("gKernelArgs.arch_args.next_pagetable = 0x%08x\n",
(uint32_t)gKernelArgs.arch_args.next_pagetable); (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 #ifdef TRACE_PAGE_DIRECTORY
dump_page_dir(); dump_page_dir();
@@ -364,6 +364,9 @@ ARMPagingMethod32Bit::CreateTranslationMap(bool kernel, VMTranslationMap** _map)
static void static void
get_free_pgtable(kernel_args* args, phys_addr_t* phys_addr, addr_t* virt_addr) 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; 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; addr_t virt = args->arch_args.vir_pgdir + args->arch_args.next_pagetable;
args->arch_args.next_pagetable += ARM_MMU_L2_COARSE_TABLE_SIZE; args->arch_args.next_pagetable += ARM_MMU_L2_COARSE_TABLE_SIZE;