powerpc/64s: Blacklist functions invoked on a trap
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Thu, 29 Jun 2017 17:49:19 +0000 (23:19 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 3 Jul 2017 13:12:01 +0000 (23:12 +1000)
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>
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/exceptions-64s.S
arch/powerpc/kernel/traps.c

index ed45e86673c0eca30e1f6e2125a2136b69bb504f..d5be463b2fa451f52137c36e28552145c3d60bc0 100644 (file)
@@ -186,7 +186,7 @@ system_call:                        /* label this so stack traces look sane */
 #ifdef CONFIG_PPC_BOOK3S
        /* No MSR:RI on BookE */
        andi.   r10,r8,MSR_RI
-       beq-    unrecov_restore
+       beq-    .Lunrecov_restore
 #endif
 
 /*
@@ -437,6 +437,7 @@ _GLOBAL(save_nvgprs)
        clrrdi  r0,r11,1
        std     r0,_TRAP(r1)
        blr
+_ASM_NOKPROBE_SYMBOL(save_nvgprs);
 
        
 /*
@@ -807,11 +808,11 @@ restore:
        ld      r5,SOFTE(r1)
        lbz     r6,PACASOFTIRQEN(r13)
        cmpwi   cr0,r5,0
-       beq     restore_irq_off
+       beq     .Lrestore_irq_off
 
        /* We are enabling, were we already enabled ? Yes, just return */
        cmpwi   cr0,r6,1
-       beq     cr0,do_restore
+       beq     cr0,.Ldo_restore
 
        /*
         * We are about to soft-enable interrupts (we are hard disabled
@@ -820,14 +821,14 @@ restore:
         */
        lbz     r0,PACAIRQHAPPENED(r13)
        cmpwi   cr0,r0,0
-       bne-    restore_check_irq_replay
+       bne-    .Lrestore_check_irq_replay
 
        /*
         * Get here when nothing happened while soft-disabled, just
         * soft-enable and move-on. We will hard-enable as a side
         * effect of rfi
         */
-restore_no_replay:
+.Lrestore_no_replay:
        TRACE_ENABLE_INTS
        li      r0,1
        stb     r0,PACASOFTIRQEN(r13);
@@ -835,7 +836,7 @@ restore_no_replay:
        /*
         * Final return path. BookE is handled in a different file
         */
-do_restore:
+.Ldo_restore:
 #ifdef CONFIG_PPC_BOOK3E
        b       exception_return_book3e
 #else
@@ -869,7 +870,7 @@ fast_exception_return:
        REST_8GPRS(5, r1)
 
        andi.   r0,r3,MSR_RI
-       beq-    unrecov_restore
+       beq-    .Lunrecov_restore
 
        /* Load PPR from thread struct before we clear MSR:RI */
 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
         * or that bit can get out of sync and bad things will happen
         */
-restore_irq_off:
+.Lrestore_irq_off:
        ld      r3,_MSR(r1)
        lbz     r7,PACAIRQHAPPENED(r13)
        andi.   r0,r3,MSR_EE
@@ -937,13 +938,13 @@ restore_irq_off:
 1:     li      r0,0
        stb     r0,PACASOFTIRQEN(r13);
        TRACE_DISABLE_INTS
-       b       do_restore
+       b       .Ldo_restore
 
        /*
         * Something did happen, check if a re-emit is needed
         * (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
         * for irq_happened being just 0x01, in which case we can
         * clear it and return. That means that we would potentially
@@ -953,7 +954,7 @@ restore_check_irq_replay:
         */
        bl      __check_irq_replay
        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
@@ -1002,10 +1003,18 @@ restore_check_irq_replay:
 #endif /* CONFIG_PPC_DOORBELL */
 1:     b       ret_from_except /* What else to do here ? */
  
-unrecov_restore:
+.Lunrecov_restore:
        addi    r3,r1,STACK_FRAME_OVERHEAD
        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
 /*
index 3a7a456ab95cb8a2cffcd822ead11d343bcf2782..4c18a5fbb4bbf52dd61fc02d3953ae55a56a25f1 100644 (file)
@@ -1594,6 +1594,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
 1:     addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      kernel_bad_stack
        b       1b
+_ASM_NOKPROBE_SYMBOL(bad_stack);
 
 /*
  * When doorbell is triggered from system reset wakeup, the message is
@@ -1655,3 +1656,4 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
 1:
        blr
 
+_ASM_NOKPROBE_SYMBOL(__replay_interrupt)
index d4e545d27ef9ffacca0d8d978a9978f191a3eb90..bfcfd9ef09f20a3980f544373616e6ceba3de88c 100644 (file)
@@ -237,6 +237,7 @@ void die(const char *str, struct pt_regs *regs, long err)
                err = 0;
        oops_end(flags, regs, err);
 }
+NOKPROBE_SYMBOL(die);
 
 void user_single_step_siginfo(struct task_struct *tsk,
                                struct pt_regs *regs, siginfo_t *info)
@@ -1968,6 +1969,7 @@ void unrecoverable_exception(struct pt_regs *regs)
               regs->trap, regs->nip);
        die("Unrecoverable exception", regs, SIGABRT);
 }
+NOKPROBE_SYMBOL(unrecoverable_exception);
 
 #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);
        die("Bad kernel stack pointer", regs, SIGABRT);
 }
+NOKPROBE_SYMBOL(kernel_bad_stack);
 
 void __init trap_init(void)
 {