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"
|
#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);
|
addr_t kernelEntry, addr_t kernelStackTop);
|
||||||
|
|
||||||
// From arch_mmu.cpp
|
// From arch_mmu.cpp
|
||||||
@@ -68,7 +68,7 @@ arch_start_kernel(addr_t kernelEntry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate page tables for use after ExitBootServices.
|
// 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);
|
memory_map_size, memory_map, descriptor_size, descriptor_version);
|
||||||
|
|
||||||
// Attempt to fetch the memory map and exit boot services.
|
// 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);
|
//smp_boot_other_cpus(final_pml4, kernelEntry);
|
||||||
|
|
||||||
// Enter the kernel!
|
// 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);
|
gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,23 +8,45 @@
|
|||||||
|
|
||||||
.text
|
.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);
|
addr_t kernelEntry, addr_t kernelStackTop);
|
||||||
|
|
||||||
r0 - kernelArgs
|
r0 - ttbr
|
||||||
r1 - kernelEntry
|
r1 - kernelArgs
|
||||||
r2 - kernelStackTop
|
r2 - kernelEntry
|
||||||
|
r3 - kernelStackTop
|
||||||
*/
|
*/
|
||||||
FUNCTION(arch_enter_kernel):
|
FUNCTION(arch_enter_kernel):
|
||||||
|
|
||||||
// set the kernel stack
|
|
||||||
mov sp,r2
|
mov r5,r0
|
||||||
|
mov r4,r2
|
||||||
|
|
||||||
// set up kernel _start args
|
// set up kernel _start args
|
||||||
//mov r0,r0 // kernelArgs
|
mov r0,r1 // kernelArgs
|
||||||
mov r4,r1
|
|
||||||
mov r1,#0 // currentCPU=0
|
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
|
// call the kernel
|
||||||
mov pc,r4
|
mov pc,r4
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user