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: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
3639d6619c
commit
15770a13be
@ -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)
|
|||||||
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:
|
|||||||
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:
|
|||||||
*/
|
*/
|
||||||
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:
|
|||||||
/*
|
/*
|
||||||
* 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:
|
|||||||
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)
|
|||||||
* 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:
|
|||||||
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:
|
|||||||
*/
|
*/
|
||||||
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:
|
|||||||
#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)
|
|||||||
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)
|
|||||||
1:
|
1:
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
_ASM_NOKPROBE_SYMBOL(__replay_interrupt)
|
||||||
|
@ -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)
|
|||||||
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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user