Commit 15770a13 authored by Naveen N. Rao's avatar Naveen N. Rao Committed by Michael Ellerman

powerpc/64s: Blacklist functions invoked on a trap

Blacklist all functions involved while handling a trap. We:
- convert some of the symbols into private symbols, and
- blacklist most functions involved while handling a trap.
Reviewed-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 3639d661
...@@ -186,7 +186,7 @@ system_call: /* label this so stack traces look sane */ ...@@ -186,7 +186,7 @@ system_call: /* label this so stack traces look sane */
#ifdef CONFIG_PPC_BOOK3S #ifdef CONFIG_PPC_BOOK3S
/* No MSR:RI on BookE */ /* No MSR:RI on BookE */
andi. r10,r8,MSR_RI andi. r10,r8,MSR_RI
beq- unrecov_restore beq- .Lunrecov_restore
#endif #endif
/* /*
...@@ -437,6 +437,7 @@ _GLOBAL(save_nvgprs) ...@@ -437,6 +437,7 @@ _GLOBAL(save_nvgprs)
clrrdi r0,r11,1 clrrdi r0,r11,1
std r0,_TRAP(r1) std r0,_TRAP(r1)
blr blr
_ASM_NOKPROBE_SYMBOL(save_nvgprs);
/* /*
...@@ -807,11 +808,11 @@ restore: ...@@ -807,11 +808,11 @@ restore:
ld r5,SOFTE(r1) ld r5,SOFTE(r1)
lbz r6,PACASOFTIRQEN(r13) lbz r6,PACASOFTIRQEN(r13)
cmpwi cr0,r5,0 cmpwi cr0,r5,0
beq restore_irq_off beq .Lrestore_irq_off
/* We are enabling, were we already enabled ? Yes, just return */ /* We are enabling, were we already enabled ? Yes, just return */
cmpwi cr0,r6,1 cmpwi cr0,r6,1
beq cr0,do_restore beq cr0,.Ldo_restore
/* /*
* We are about to soft-enable interrupts (we are hard disabled * We are about to soft-enable interrupts (we are hard disabled
...@@ -820,14 +821,14 @@ restore: ...@@ -820,14 +821,14 @@ restore:
*/ */
lbz r0,PACAIRQHAPPENED(r13) lbz r0,PACAIRQHAPPENED(r13)
cmpwi cr0,r0,0 cmpwi cr0,r0,0
bne- restore_check_irq_replay bne- .Lrestore_check_irq_replay
/* /*
* Get here when nothing happened while soft-disabled, just * Get here when nothing happened while soft-disabled, just
* soft-enable and move-on. We will hard-enable as a side * soft-enable and move-on. We will hard-enable as a side
* effect of rfi * effect of rfi
*/ */
restore_no_replay: .Lrestore_no_replay:
TRACE_ENABLE_INTS TRACE_ENABLE_INTS
li r0,1 li r0,1
stb r0,PACASOFTIRQEN(r13); stb r0,PACASOFTIRQEN(r13);
...@@ -835,7 +836,7 @@ restore_no_replay: ...@@ -835,7 +836,7 @@ restore_no_replay:
/* /*
* Final return path. BookE is handled in a different file * Final return path. BookE is handled in a different file
*/ */
do_restore: .Ldo_restore:
#ifdef CONFIG_PPC_BOOK3E #ifdef CONFIG_PPC_BOOK3E
b exception_return_book3e b exception_return_book3e
#else #else
...@@ -869,7 +870,7 @@ fast_exception_return: ...@@ -869,7 +870,7 @@ fast_exception_return:
REST_8GPRS(5, r1) REST_8GPRS(5, r1)
andi. r0,r3,MSR_RI andi. r0,r3,MSR_RI
beq- unrecov_restore beq- .Lunrecov_restore
/* Load PPR from thread struct before we clear MSR:RI */ /* Load PPR from thread struct before we clear MSR:RI */
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
...@@ -927,7 +928,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) ...@@ -927,7 +928,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
* make sure that in this case, we also clear PACA_IRQ_HARD_DIS * make sure that in this case, we also clear PACA_IRQ_HARD_DIS
* or that bit can get out of sync and bad things will happen * or that bit can get out of sync and bad things will happen
*/ */
restore_irq_off: .Lrestore_irq_off:
ld r3,_MSR(r1) ld r3,_MSR(r1)
lbz r7,PACAIRQHAPPENED(r13) lbz r7,PACAIRQHAPPENED(r13)
andi. r0,r3,MSR_EE andi. r0,r3,MSR_EE
...@@ -937,13 +938,13 @@ restore_irq_off: ...@@ -937,13 +938,13 @@ restore_irq_off:
1: li r0,0 1: li r0,0
stb r0,PACASOFTIRQEN(r13); stb r0,PACASOFTIRQEN(r13);
TRACE_DISABLE_INTS TRACE_DISABLE_INTS
b do_restore b .Ldo_restore
/* /*
* Something did happen, check if a re-emit is needed * Something did happen, check if a re-emit is needed
* (this also clears paca->irq_happened) * (this also clears paca->irq_happened)
*/ */
restore_check_irq_replay: .Lrestore_check_irq_replay:
/* XXX: We could implement a fast path here where we check /* XXX: We could implement a fast path here where we check
* for irq_happened being just 0x01, in which case we can * for irq_happened being just 0x01, in which case we can
* clear it and return. That means that we would potentially * clear it and return. That means that we would potentially
...@@ -953,7 +954,7 @@ restore_check_irq_replay: ...@@ -953,7 +954,7 @@ restore_check_irq_replay:
*/ */
bl __check_irq_replay bl __check_irq_replay
cmpwi cr0,r3,0 cmpwi cr0,r3,0
beq restore_no_replay beq .Lrestore_no_replay
/* /*
* We need to re-emit an interrupt. We do so by re-using our * We need to re-emit an interrupt. We do so by re-using our
...@@ -1002,10 +1003,18 @@ restore_check_irq_replay: ...@@ -1002,10 +1003,18 @@ restore_check_irq_replay:
#endif /* CONFIG_PPC_DOORBELL */ #endif /* CONFIG_PPC_DOORBELL */
1: b ret_from_except /* What else to do here ? */ 1: b ret_from_except /* What else to do here ? */
unrecov_restore: .Lunrecov_restore:
addi r3,r1,STACK_FRAME_OVERHEAD addi r3,r1,STACK_FRAME_OVERHEAD
bl unrecoverable_exception bl unrecoverable_exception
b unrecov_restore b .Lunrecov_restore
_ASM_NOKPROBE_SYMBOL(ret_from_except);
_ASM_NOKPROBE_SYMBOL(ret_from_except_lite);
_ASM_NOKPROBE_SYMBOL(resume_kernel);
_ASM_NOKPROBE_SYMBOL(fast_exc_return_irq);
_ASM_NOKPROBE_SYMBOL(restore);
_ASM_NOKPROBE_SYMBOL(fast_exception_return);
#ifdef CONFIG_PPC_RTAS #ifdef CONFIG_PPC_RTAS
/* /*
......
...@@ -1594,6 +1594,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR) ...@@ -1594,6 +1594,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1: addi r3,r1,STACK_FRAME_OVERHEAD 1: addi r3,r1,STACK_FRAME_OVERHEAD
bl kernel_bad_stack bl kernel_bad_stack
b 1b b 1b
_ASM_NOKPROBE_SYMBOL(bad_stack);
/* /*
* When doorbell is triggered from system reset wakeup, the message is * When doorbell is triggered from system reset wakeup, the message is
...@@ -1655,3 +1656,4 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) ...@@ -1655,3 +1656,4 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
1: 1:
blr blr
_ASM_NOKPROBE_SYMBOL(__replay_interrupt)
...@@ -237,6 +237,7 @@ void die(const char *str, struct pt_regs *regs, long err) ...@@ -237,6 +237,7 @@ void die(const char *str, struct pt_regs *regs, long err)
err = 0; err = 0;
oops_end(flags, regs, err); oops_end(flags, regs, err);
} }
NOKPROBE_SYMBOL(die);
void user_single_step_siginfo(struct task_struct *tsk, void user_single_step_siginfo(struct task_struct *tsk,
struct pt_regs *regs, siginfo_t *info) struct pt_regs *regs, siginfo_t *info)
...@@ -1968,6 +1969,7 @@ void unrecoverable_exception(struct pt_regs *regs) ...@@ -1968,6 +1969,7 @@ void unrecoverable_exception(struct pt_regs *regs)
regs->trap, regs->nip); regs->trap, regs->nip);
die("Unrecoverable exception", regs, SIGABRT); die("Unrecoverable exception", regs, SIGABRT);
} }
NOKPROBE_SYMBOL(unrecoverable_exception);
#if defined(CONFIG_BOOKE_WDT) || defined(CONFIG_40x) #if defined(CONFIG_BOOKE_WDT) || defined(CONFIG_40x)
/* /*
...@@ -1998,6 +2000,7 @@ void kernel_bad_stack(struct pt_regs *regs) ...@@ -1998,6 +2000,7 @@ void kernel_bad_stack(struct pt_regs *regs)
regs->gpr[1], regs->nip); regs->gpr[1], regs->nip);
die("Bad kernel stack pointer", regs, SIGABRT); die("Bad kernel stack pointer", regs, SIGABRT);
} }
NOKPROBE_SYMBOL(kernel_bad_stack);
void __init trap_init(void) void __init trap_init(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment