From 4d81ddab4f72221634919bf8f8c8473d558a3d79 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Wed, 20 Oct 2021 18:48:42 +0200 Subject: [PATCH] boot/efi: initialize mmu for arm Change-Id: I918a459dfb4e5d0864ae4c8b806df059248d43b6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4630 Reviewed-by: waddlesplash Reviewed-by: Adrien Destugues --- .../boot/platform/efi/arch/arm/arch_start.cpp | 11 ++++-- src/system/boot/platform/efi/arch/arm/entry.S | 38 +++++++++++++++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/system/boot/platform/efi/arch/arm/arch_start.cpp b/src/system/boot/platform/efi/arch/arm/arch_start.cpp index 265c0ec9c7..e6ea75b8e4 100644 --- a/src/system/boot/platform/efi/arch/arm/arch_start.cpp +++ b/src/system/boot/platform/efi/arch/arm/arch_start.cpp @@ -11,7 +11,7 @@ #include "efi_platform.h" -extern "C" void arch_enter_kernel(struct kernel_args *kernelArgs, +extern "C" void arch_enter_kernel(uint32_t ttbr, struct kernel_args *kernelArgs, addr_t kernelEntry, addr_t kernelStackTop); // From arch_mmu.cpp @@ -68,7 +68,7 @@ arch_start_kernel(addr_t kernelEntry) } // Generate page tables for use after ExitBootServices. - arch_mmu_generate_post_efi_page_tables( + uint32_t final_ttbr0 = arch_mmu_generate_post_efi_page_tables( memory_map_size, memory_map, descriptor_size, descriptor_version); // Attempt to fetch the memory map and exit boot services. @@ -106,6 +106,11 @@ arch_start_kernel(addr_t kernelEntry) //smp_boot_other_cpus(final_pml4, kernelEntry); // Enter the kernel! - arch_enter_kernel(&gKernelArgs, kernelEntry, + dprintf("arch_enter_kernel(ttbr0: 0x%08x, kernelArgs: 0x%08x, " + "kernelEntry: 0x%08x, sp: 0x%08x)\n", + final_ttbr0, (uint32_t)&gKernelArgs, (uint32_t)&kernelEntry, + (uint32_t)(gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size)); + + arch_enter_kernel(final_ttbr0, &gKernelArgs, kernelEntry, gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size); } diff --git a/src/system/boot/platform/efi/arch/arm/entry.S b/src/system/boot/platform/efi/arch/arm/entry.S index d8ea332dcf..49930196a6 100644 --- a/src/system/boot/platform/efi/arch/arm/entry.S +++ b/src/system/boot/platform/efi/arch/arm/entry.S @@ -8,23 +8,45 @@ .text -/* status_t arch_enter_kernel(struct kernel_args *kernelArgs, +/* status_t arch_enter_kernel(uint32_t ttbr, struct kernel_args *kernelArgs, addr_t kernelEntry, addr_t kernelStackTop); - r0 - kernelArgs - r1 - kernelEntry - r2 - kernelStackTop + r0 - ttbr + r1 - kernelArgs + r2 - kernelEntry + r3 - kernelStackTop */ FUNCTION(arch_enter_kernel): - // set the kernel stack - mov sp,r2 + + mov r5,r0 + mov r4,r2 // set up kernel _start args - //mov r0,r0 // kernelArgs - mov r4,r1 + mov r0,r1 // kernelArgs mov r1,#0 // currentCPU=0 + // flush TLB + MCR p15, 0, r1, c8, c7, 0 + + // set TTBR0 + MCR p15, 0, r5, c2, c0, 0 + + // flush TLB (again) + MCR p15, 0, r1, c8, c7, 0 + + // write DACR + mov r9, #0xffffffff + MCR p15, 0, r9, c3, c0, 0 + + // enable MMU + MRC p15, 0, r9, c1, c0, 0 + orr r9, r9, #1 + MCR p15, 0, r9, c1, c0, 0 + + // set the kernel stack + mov sp,r3 + // call the kernel mov pc,r4