| From 09e9db3da614a32e318ff9d7f08e0652887aa4f6 Mon Sep 17 00:00:00 2001 |
| From: Russell Currey <ruscur@russell.cc> |
| Date: Wed, 27 Mar 2019 14:35:54 +1100 |
| Subject: powerpc/64: Fix booting large kernels with STRICT_KERNEL_RWX |
| |
| [ Upstream commit 56c46bba9bbfe229b4472a5be313c44c5b714a39 ] |
| |
| With STRICT_KERNEL_RWX enabled anything marked __init is placed at a 16M |
| boundary. This is necessary so that it can be repurposed later with |
| different permissions. However, in kernels with text larger than 16M, |
| this pushes early_setup past 32M, incapable of being reached by the |
| branch instruction. |
| |
| Fix this by setting the CTR and branching there instead. |
| |
| Fixes: 1e0fc9d1eb2b ("powerpc/Kconfig: Enable STRICT_KERNEL_RWX for some configs") |
| Signed-off-by: Russell Currey <ruscur@russell.cc> |
| [mpe: Fix it to work on BE by using DOTSYM()] |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kernel/head_64.S | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
| index 3fad8d499767c..5321a11c28358 100644 |
| --- a/arch/powerpc/kernel/head_64.S |
| +++ b/arch/powerpc/kernel/head_64.S |
| @@ -968,7 +968,9 @@ start_here_multiplatform: |
| |
| /* Restore parameters passed from prom_init/kexec */ |
| mr r3,r31 |
| - bl early_setup /* also sets r13 and SPRG_PACA */ |
| + LOAD_REG_ADDR(r12, DOTSYM(early_setup)) |
| + mtctr r12 |
| + bctrl /* also sets r13 and SPRG_PACA */ |
| |
| LOAD_REG_ADDR(r3, start_here_common) |
| ld r4,PACAKMSR(r13) |
| -- |
| 2.20.1 |
| |