[RFC v1 4/4] arm64: Keep MMU on while kernel is being relocated

From: Pavel Tatashin
Date: Tue Jul 16 2019 - 12:56:54 EST


It is inefficient to do kernel relocation with MMU disabled. This is
because if MMU is disabled, dcache must also be disabled.

Now, that we have identity page table we can disable MMU after relocation
is completed.

Signed-off-by: Pavel Tatashin <pasha.tatashin@xxxxxxxxxx>
---
arch/arm64/kernel/cpu-reset.S | 8 -------
arch/arm64/kernel/relocate_kernel.S | 36 ++++++++++++++++++-----------
2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S
index 6ea337d464c4..d5cfc17b8e1f 100644
--- a/arch/arm64/kernel/cpu-reset.S
+++ b/arch/arm64/kernel/cpu-reset.S
@@ -30,14 +30,6 @@
* flat identity mapping.
*/
ENTRY(__cpu_soft_restart)
- /* Clear sctlr_el1 flags. */
- mrs x12, sctlr_el1
- ldr x13, =SCTLR_ELx_FLAGS
- bic x12, x12, x13
- pre_disable_mmu_workaround
- msr sctlr_el1, x12
- isb
-
cbz x0, 1f // el2_switch?
mov x0, #HVC_SOFT_RESTART
hvc #0 // no return
diff --git a/arch/arm64/kernel/relocate_kernel.S b/arch/arm64/kernel/relocate_kernel.S
index c1d7db71a726..e2724fedd082 100644
--- a/arch/arm64/kernel/relocate_kernel.S
+++ b/arch/arm64/kernel/relocate_kernel.S
@@ -36,18 +36,6 @@ ENTRY(arm64_relocate_new_kernel)
mov x14, xzr /* x14 = entry ptr */
mov x13, xzr /* x13 = copy dest */

- /* Clear the sctlr_el2 flags. */
- mrs x0, CurrentEL
- cmp x0, #CurrentEL_EL2
- b.ne 1f
- mrs x0, sctlr_el2
- ldr x1, =SCTLR_ELx_FLAGS
- bic x0, x0, x1
- pre_disable_mmu_workaround
- msr sctlr_el2, x0
- isb
-1:
-
/* Check if the new image needs relocation. */
tbnz x16, IND_DONE_BIT, .Ldone

@@ -63,10 +51,10 @@ ENTRY(arm64_relocate_new_kernel)
add x20, x0, #PAGE_SIZE
sub x1, x15, #1
bic x0, x0, x1
-2: dc ivac, x0
+1: dc ivac, x0
add x0, x0, x15
cmp x0, x20
- b.lo 2b
+ b.lo 1b
dsb sy

mov x20, x13
@@ -104,6 +92,26 @@ ENTRY(arm64_relocate_new_kernel)
dsb nsh
isb

+ /* Clear sctlr_el1 flags. */
+ mrs x12, sctlr_el1
+ ldr x13, =SCTLR_ELx_FLAGS
+ bic x12, x12, x13
+ pre_disable_mmu_workaround
+ msr sctlr_el1, x12
+ isb
+
+ /* Clear the sctlr_el2 flags. */
+ mrs x0, CurrentEL
+ cmp x0, #CurrentEL_EL2
+ b.ne 2f
+ mrs x0, sctlr_el2
+ ldr x1, =SCTLR_ELx_FLAGS
+ bic x0, x0, x1
+ pre_disable_mmu_workaround
+ msr sctlr_el2, x0
+ isb
+2:
+
/* Start new image. */
mov x0, x18
mov x1, xzr
--
2.22.0