mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 15:41:36 +00:00
powerpc/32: Always save non volatile registers on exception entry
In preparation of handling exception entry and exit in C, in order to simplify the handling, always save non volatile registers when entering an exception. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/3ce8ced87a4f1467fa36fcc50763d53b45e466c1.1615552867.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
0f2793e33d
commit
e9f99704aa
@ -209,16 +209,14 @@ static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||
*/
|
||||
#define TRAP_FLAGS_MASK 0x1F
|
||||
#define TRAP(regs) ((regs)->trap & ~TRAP_FLAGS_MASK)
|
||||
#define FULL_REGS(regs) (((regs)->trap & 1) == 0)
|
||||
#define SET_FULL_REGS(regs) ((regs)->trap &= ~1)
|
||||
#define FULL_REGS(regs) true
|
||||
#define SET_FULL_REGS(regs) do { } while (0)
|
||||
#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) != 0)
|
||||
#define IS_MCHECK_EXC(regs) (((regs)->trap & 4) != 0)
|
||||
#define IS_DEBUG_EXC(regs) (((regs)->trap & 8) != 0)
|
||||
#define NV_REG_POISON 0xdeadbeef
|
||||
#define CHECK_FULL_REGS(regs) \
|
||||
do { \
|
||||
if ((regs)->trap & 1) \
|
||||
printk(KERN_CRIT "%s: partial register set\n", __func__); \
|
||||
} while (0)
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
|
@ -81,12 +81,12 @@ _ASM_NOKPROBE_SYMBOL(crit_transfer_to_handler)
|
||||
*/
|
||||
.globl transfer_to_handler_full
|
||||
transfer_to_handler_full:
|
||||
SAVE_NVGPRS(r11)
|
||||
_ASM_NOKPROBE_SYMBOL(transfer_to_handler_full)
|
||||
/* fall through */
|
||||
|
||||
.globl transfer_to_handler
|
||||
transfer_to_handler:
|
||||
SAVE_NVGPRS(r11)
|
||||
stw r2,GPR2(r11)
|
||||
stw r12,_NIP(r11)
|
||||
stw r9,_MSR(r11)
|
||||
@ -234,10 +234,6 @@ handle_page_fault:
|
||||
bl do_page_fault
|
||||
cmpwi r3,0
|
||||
beq+ ret_from_except
|
||||
SAVE_NVGPRS(r1)
|
||||
lwz r0,_TRAP(r1)
|
||||
clrrwi r0,r0,1
|
||||
stw r0,_TRAP(r1)
|
||||
mr r4,r3 /* err arg for bad_page_fault */
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
bl __bad_page_fault
|
||||
@ -810,13 +806,6 @@ recheck:
|
||||
do_user_signal: /* r10 contains MSR_KERNEL here */
|
||||
ori r10,r10,MSR_EE
|
||||
mtmsr r10 /* hard-enable interrupts */
|
||||
/* save r13-r31 in the exception frame, if not already done */
|
||||
lwz r3,_TRAP(r1)
|
||||
andi. r0,r3,1
|
||||
beq 2f
|
||||
SAVE_NVGPRS(r1)
|
||||
rlwinm r3,r3,0,0,30
|
||||
stw r3,_TRAP(r1)
|
||||
2: addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
mr r4,r9
|
||||
bl do_notify_resume
|
||||
|
@ -198,7 +198,7 @@ label:
|
||||
ret_from_except_full)
|
||||
|
||||
#define EXC_XFER_LITE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, transfer_to_handler, \
|
||||
EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
.macro vmap_stack_overflow_exception
|
||||
@ -215,7 +215,6 @@ vmap_stack_overflow:
|
||||
lwz r1, emergency_ctx@l(r1)
|
||||
addi r1, r1, THREAD_SIZE - INT_FRAME_SIZE
|
||||
EXCEPTION_PROLOG_2 vmap_stack_overflow
|
||||
SAVE_NVGPRS(r11)
|
||||
addi r3, r1, STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0, stack_overflow_exception)
|
||||
.endm
|
||||
|
@ -331,7 +331,7 @@ label:
|
||||
ret_from_except_full)
|
||||
|
||||
#define EXC_XFER_LITE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, transfer_to_handler, \
|
||||
EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
/* Check for a single step debug exception while in an exception
|
||||
|
Loading…
Reference in New Issue
Block a user