Index: sys/arm64/arm64/locore.S =================================================================== --- sys/arm64/arm64/locore.S +++ sys/arm64/arm64/locore.S @@ -95,6 +95,9 @@ /* Enable the mmu */ bl start_mmu + /* Load the new ttbr0 pagetable */ + adr x27, pagetable_l0_ttbr0 + /* Jump to the virtual address space */ ldr x15, .Lvirtdone br x15 @@ -132,6 +135,7 @@ adr x25, initstack str x25, [x0, 24] /* kern_stack */ str x24, [x0, 32] /* kern_l0pt */ + str x27, [x0, 40] /* kern_ttbr0 */ /* trace back starts here */ mov fp, #0 @@ -170,11 +174,14 @@ /* Load the kernel page table */ adr x24, pagetable_l0_ttbr1 /* Load the identity page table */ - adr x27, pagetable_l0_ttbr0 + adr x27, pagetable_l0_ttbr0_boostrap /* Enable the mmu */ bl start_mmu + /* Load the new ttbr0 pagetable */ + adr x27, pagetable_l0_ttbr0 + /* Jump to the virtual address space */ ldr x15, =mp_virtdone br x15 @@ -185,6 +192,15 @@ mul x5, x0, x5 add sp, x4, x5 + /* Load the kernel ttbr0 pagetable */ + msr ttbr0_el1, x27 + isb + + /* Invalidate the TLB */ + tlbi vmalle1 + dsb sy + isb + b init_secondary END(mpentry) #endif @@ -649,10 +665,13 @@ //.section .init_pagetable .align 12 /* 4KiB aligned */ /* - * 3 initial tables (in the following order): + * 6 initial tables (in the following order): * L2 for kernel (High addresses) * L1 for kernel - * L1 for user (Low addresses) + * L0 for kernel + * L1 bootstrap for user (Low addresses) + * L0 bootstrap for user + * L0 for user */ pagetable: .space PAGE_SIZE @@ -660,7 +679,9 @@ .space PAGE_SIZE pagetable_l0_ttbr1: .space PAGE_SIZE -pagetable_l1_ttbr0: +pagetable_l1_ttbr0_bootstrap: + .space PAGE_SIZE +pagetable_l0_ttbr0_boostrap: .space PAGE_SIZE pagetable_l0_ttbr0: .space PAGE_SIZE Index: sys/arm64/arm64/machdep.c =================================================================== --- sys/arm64/arm64/machdep.c +++ sys/arm64/arm64/machdep.c @@ -1161,6 +1161,7 @@ valid = bus_probe(); cninit(); + set_ttbr0(abp->kern_ttbr0); if (!valid) panic("Invalid bus configuration: %s", Index: sys/arm64/include/machdep.h =================================================================== --- sys/arm64/include/machdep.h +++ sys/arm64/include/machdep.h @@ -35,6 +35,7 @@ uint64_t kern_delta; vm_offset_t kern_stack; vm_offset_t kern_l0pt; /* L1 page table for the kernel */ + vm_paddr_t kern_ttbr0; }; enum arm64_bus {