| From e502ef8c85ee78e0ccb7de8f96151233e3b8f24f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 17 Dec 2019 11:12:55 +0800 |
| Subject: csky: Set regs->usp to kernel sp, when the exception is from kernel |
| |
| From: Guo Ren <guoren@linux.alibaba.com> |
| |
| [ Upstream commit f8e17c17b81070f38062dce79ca7f4541851dadd ] |
| |
| In the past, we didn't care about kernel sp when saving pt_reg. But in some |
| cases, we still need pt_reg->usp to represent the kernel stack before enter |
| exception. |
| |
| For cmpxhg in atomic.S, we need save and restore usp for above. |
| |
| Signed-off-by: Guo Ren <guoren@linux.alibaba.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/csky/abiv1/inc/abi/entry.h | 19 ++++++++++++++----- |
| arch/csky/abiv2/inc/abi/entry.h | 11 +++++++++++ |
| arch/csky/kernel/atomic.S | 8 ++++++-- |
| 3 files changed, 31 insertions(+), 7 deletions(-) |
| |
| diff --git a/arch/csky/abiv1/inc/abi/entry.h b/arch/csky/abiv1/inc/abi/entry.h |
| index 7ab78bd0f3b13..f35a9f3315ee6 100644 |
| --- a/arch/csky/abiv1/inc/abi/entry.h |
| +++ b/arch/csky/abiv1/inc/abi/entry.h |
| @@ -16,14 +16,16 @@ |
| #define LSAVE_A4 40 |
| #define LSAVE_A5 44 |
| |
| +#define usp ss1 |
| + |
| .macro USPTOKSP |
| - mtcr sp, ss1 |
| + mtcr sp, usp |
| mfcr sp, ss0 |
| .endm |
| |
| .macro KSPTOUSP |
| mtcr sp, ss0 |
| - mfcr sp, ss1 |
| + mfcr sp, usp |
| .endm |
| |
| .macro SAVE_ALL epc_inc |
| @@ -45,7 +47,13 @@ |
| add lr, r13 |
| stw lr, (sp, 8) |
| |
| + mov lr, sp |
| + addi lr, 32 |
| + addi lr, 32 |
| + addi lr, 16 |
| + bt 2f |
| mfcr lr, ss1 |
| +2: |
| stw lr, (sp, 16) |
| |
| stw a0, (sp, 20) |
| @@ -79,9 +87,10 @@ |
| ldw a0, (sp, 12) |
| mtcr a0, epsr |
| btsti a0, 31 |
| + bt 1f |
| ldw a0, (sp, 16) |
| mtcr a0, ss1 |
| - |
| +1: |
| ldw a0, (sp, 24) |
| ldw a1, (sp, 28) |
| ldw a2, (sp, 32) |
| @@ -102,9 +111,9 @@ |
| addi sp, 32 |
| addi sp, 8 |
| |
| - bt 1f |
| + bt 2f |
| KSPTOUSP |
| -1: |
| +2: |
| rte |
| .endm |
| |
| diff --git a/arch/csky/abiv2/inc/abi/entry.h b/arch/csky/abiv2/inc/abi/entry.h |
| index 9897a16b45e5d..94a7a58765dff 100644 |
| --- a/arch/csky/abiv2/inc/abi/entry.h |
| +++ b/arch/csky/abiv2/inc/abi/entry.h |
| @@ -31,7 +31,13 @@ |
| |
| mfcr lr, epsr |
| stw lr, (sp, 12) |
| + btsti lr, 31 |
| + bf 1f |
| + addi lr, sp, 152 |
| + br 2f |
| +1: |
| mfcr lr, usp |
| +2: |
| stw lr, (sp, 16) |
| |
| stw a0, (sp, 20) |
| @@ -64,8 +70,10 @@ |
| mtcr a0, epc |
| ldw a0, (sp, 12) |
| mtcr a0, epsr |
| + btsti a0, 31 |
| ldw a0, (sp, 16) |
| mtcr a0, usp |
| + mtcr a0, ss0 |
| |
| #ifdef CONFIG_CPU_HAS_HILO |
| ldw a0, (sp, 140) |
| @@ -86,6 +94,9 @@ |
| addi sp, 40 |
| ldm r16-r30, (sp) |
| addi sp, 72 |
| + bf 1f |
| + mfcr sp, ss0 |
| +1: |
| rte |
| .endm |
| |
| diff --git a/arch/csky/kernel/atomic.S b/arch/csky/kernel/atomic.S |
| index 5b84f11485aeb..3821ef9b75672 100644 |
| --- a/arch/csky/kernel/atomic.S |
| +++ b/arch/csky/kernel/atomic.S |
| @@ -17,10 +17,12 @@ ENTRY(csky_cmpxchg) |
| mfcr a3, epc |
| addi a3, TRAP0_SIZE |
| |
| - subi sp, 8 |
| + subi sp, 16 |
| stw a3, (sp, 0) |
| mfcr a3, epsr |
| stw a3, (sp, 4) |
| + mfcr a3, usp |
| + stw a3, (sp, 8) |
| |
| psrset ee |
| #ifdef CONFIG_CPU_HAS_LDSTEX |
| @@ -47,7 +49,9 @@ ENTRY(csky_cmpxchg) |
| mtcr a3, epc |
| ldw a3, (sp, 4) |
| mtcr a3, epsr |
| - addi sp, 8 |
| + ldw a3, (sp, 8) |
| + mtcr a3, usp |
| + addi sp, 16 |
| KSPTOUSP |
| rte |
| END(csky_cmpxchg) |
| -- |
| 2.20.1 |
| |