| From 54a20ce80ef496482d694b2096311549ff6bc87a Mon Sep 17 00:00:00 2001 |
| From: Vladimir Murzin <vladimir.murzin@arm.com> |
| Date: Thu, 10 Oct 2019 10:12:20 +0100 |
| Subject: [PATCH] ARM: 8914/1: NOMMU: Fix exc_ret for XIP |
| |
| commit 4c0742f65b4ee466546fd24b71b56516cacd4613 upstream. |
| |
| It was reported that 72cd4064fcca "NOMMU: Toggle only bits in |
| EXC_RETURN we are really care of" breaks NOMMU+XIP combination. |
| It happens because saved EXC_RETURN gets overwritten when data |
| section is relocated. |
| |
| The fix is to propagate EXC_RETURN via register and let relocation |
| code to commit that value into memory. |
| |
| Fixes: 72cd4064fcca ("ARM: 8830/1: NOMMU: Toggle only bits in EXC_RETURN we are really care of") |
| Reported-by: afzal mohammed <afzal.mohd.ma@gmail.com> |
| Tested-by: afzal mohammed <afzal.mohd.ma@gmail.com> |
| Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S |
| index a7810be07da1..4a3982812a40 100644 |
| --- a/arch/arm/kernel/head-common.S |
| +++ b/arch/arm/kernel/head-common.S |
| @@ -68,7 +68,7 @@ ENDPROC(__vet_atags) |
| * The following fragment of code is executed with the MMU on in MMU mode, |
| * and uses absolute addresses; this is not position independent. |
| * |
| - * r0 = cp#15 control register |
| + * r0 = cp#15 control register (exc_ret for M-class) |
| * r1 = machine ID |
| * r2 = atags/dtb pointer |
| * r9 = processor ID |
| @@ -137,7 +137,8 @@ __mmap_switched_data: |
| #ifdef CONFIG_CPU_CP15 |
| .long cr_alignment @ r3 |
| #else |
| - .long 0 @ r3 |
| +M_CLASS(.long exc_ret) @ r3 |
| +AR_CLASS(.long 0) @ r3 |
| #endif |
| .size __mmap_switched_data, . - __mmap_switched_data |
| |
| diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S |
| index afa350f44dea..0fc814bbc34b 100644 |
| --- a/arch/arm/kernel/head-nommu.S |
| +++ b/arch/arm/kernel/head-nommu.S |
| @@ -201,6 +201,8 @@ M_CLASS(streq r3, [r12, #PMSAv8_MAIR1]) |
| bic r0, r0, #V7M_SCB_CCR_IC |
| #endif |
| str r0, [r12, V7M_SCB_CCR] |
| + /* Pass exc_ret to __mmap_switched */ |
| + mov r0, r10 |
| #endif /* CONFIG_CPU_CP15 elif CONFIG_CPU_V7M */ |
| ret lr |
| ENDPROC(__after_proc_init) |
| diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S |
| index 1448f144e7fb..efebf4120a0c 100644 |
| --- a/arch/arm/mm/proc-v7m.S |
| +++ b/arch/arm/mm/proc-v7m.S |
| @@ -136,9 +136,8 @@ __v7m_setup_cont: |
| cpsie i |
| svc #0 |
| 1: cpsid i |
| - ldr r0, =exc_ret |
| - orr lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK |
| - str lr, [r0] |
| + /* Calculate exc_ret */ |
| + orr r10, lr, #EXC_RET_THREADMODE_PROCESSSTACK |
| ldmia sp, {r0-r3, r12} |
| str r5, [r12, #11 * 4] @ restore the original SVC vector entry |
| mov lr, r6 @ restore LR |
| -- |
| 2.7.4 |
| |