boot/efi: initialize mmu for arm

Change-Id: I918a459dfb4e5d0864ae4c8b806df059248d43b6
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4630
Reviewed-by: waddlesplash <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
David Karoly
2021-10-22 11:22:10 +00:00
committed by Adrien Destugues
parent d88e69ae11
commit 4d81ddab4f
2 changed files with 38 additions and 11 deletions
@@ -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);
}
+30 -8
View File
@@ -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