powerpc/64s: Blacklist system_call() and system_call_common() from kprobes
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>
This commit is contained in:
parent
9d6c452352
commit
cf7d6fb067
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user