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:
committed by
Adrien Destugues
parent
d88e69ae11
commit
4d81ddab4f
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user