powerpc/64s: Blacklist system_call() and system_call_common() from kprobes
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Thu, 29 Jun 2017 17:49:16 +0000 (23:19 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 3 Jul 2017 13:11:25 +0000 (23:11 +1000)
Convert some of the symbols into private symbols and blacklist
system_call_common() and system_call() from kprobes. We can't take a
trap at parts of these functions as either MSR_RI is unset or the
kernel stack pointer is not yet setup.

Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
[mpe: Don't convert system_call_common to _GLOBAL()]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/entry_64.S

index da9486e2fd89b5f93f06dc5ed57837d6742d4d1b..410e19295259b2aa81d59c0b019098b43724daf0 100644 (file)
@@ -57,7 +57,7 @@ system_call_common:
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 BEGIN_FTR_SECTION
        extrdi. r10, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */
-       bne     tabort_syscall
+       bne     .Ltabort_syscall
 END_FTR_SECTION_IFSET(CPU_FTR_TM)
 #endif
        andi.   r10,r12,MSR_PR
@@ -152,9 +152,9 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
        CURRENT_THREAD_INFO(r11, r1)
        ld      r10,TI_FLAGS(r11)
        andi.   r11,r10,_TIF_SYSCALL_DOTRACE
-       bne     syscall_dotrace         /* does not return */
+       bne     .Lsyscall_dotrace               /* does not return */
        cmpldi  0,r0,NR_syscalls
-       bge-    syscall_enosys
+       bge-    .Lsyscall_enosys
 
 system_call:                   /* label this so stack traces look sane */
 /*
@@ -208,7 +208,7 @@ system_call:                        /* label this so stack traces look sane */
        ld      r9,TI_FLAGS(r12)
        li      r11,-MAX_ERRNO
        andi.   r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
-       bne-    syscall_exit_work
+       bne-    .Lsyscall_exit_work
 
        /* If MSR_FP and MSR_VEC are set in user msr, then no need to restore */
        li      r7,MSR_FP
@@ -217,12 +217,12 @@ system_call:                      /* label this so stack traces look sane */
 #endif
        and     r0,r8,r7
        cmpd    r0,r7
-       bne     syscall_restore_math
+       bne     .Lsyscall_restore_math
 .Lsyscall_restore_math_cont:
 
        cmpld   r3,r11
        ld      r5,_CCR(r1)
-       bge-    syscall_error
+       bge-    .Lsyscall_error
 .Lsyscall_error_cont:
        ld      r7,_NIP(r1)
 BEGIN_FTR_SECTION
@@ -248,13 +248,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
        RFI
        b       .       /* prevent speculative execution */
 
-syscall_error: 
+.Lsyscall_error:
        oris    r5,r5,0x1000    /* Set SO bit in CR */
        neg     r3,r3
        std     r5,_CCR(r1)
        b       .Lsyscall_error_cont
 
-syscall_restore_math:
+.Lsyscall_restore_math:
        /*
         * Some initial tests from restore_math to avoid the heavyweight
         * C code entry and MSR manipulations.
@@ -289,7 +289,7 @@ syscall_restore_math:
        b       .Lsyscall_restore_math_cont
 
 /* Traced system call support */
-syscall_dotrace:
+.Lsyscall_dotrace:
        bl      save_nvgprs
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      do_syscall_trace_enter
@@ -322,11 +322,11 @@ syscall_dotrace:
        b       .Lsyscall_exit
 
 
-syscall_enosys:
+.Lsyscall_enosys:
        li      r3,-ENOSYS
        b       .Lsyscall_exit
        
-syscall_exit_work:
+.Lsyscall_exit_work:
 #ifdef CONFIG_PPC_BOOK3S
        li      r10,MSR_RI
        mtmsrd  r10,1           /* Restore RI */
@@ -386,7 +386,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
        b       ret_from_except
 
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-tabort_syscall:
+.Ltabort_syscall:
        /* Firstly we need to enable TM in the kernel */
        mfmsr   r10
        li      r9, 1
@@ -412,6 +412,8 @@ tabort_syscall:
        rfid
        b       .       /* prevent speculative execution */
 #endif
+_ASM_NOKPROBE_SYMBOL(system_call_common);
+_ASM_NOKPROBE_SYMBOL(system_call);
 
 /* Save non-volatile GPRs, if not already saved. */
 _GLOBAL(save_nvgprs)