瀏覽代碼

sh: Fix syscall tracing ordering.

The implementation of system call tracing in the kernel has a
couple of ordering problems:

 - the validity of the system call number is checked before
   calling out to system call tracing code, and should be
   done after

 - the system call number used when tracing is the one the
   system call was invoked with, while the system call tracing
   code can legitimatly change the call number (for example
   strace permutes fork into clone)

This patch fixes both of these problems, and also reoders the
code slightly to make the direct path through the code the
common case.

Signed-off-by: Stuart Menefy <stuart.menefy@st.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Stuart Menefy 18 年之前
父節點
當前提交
e0969e0c9b
共有 1 個文件被更改,包括 22 次插入23 次删除
  1. 22 23
      arch/sh/kernel/entry-common.S

+ 22 - 23
arch/sh/kernel/entry-common.S

@@ -256,8 +256,7 @@ syscall_trace_entry:
 	mov.l	@(OFF_R6,r15), r6
 	mov.l	@(OFF_R6,r15), r6
 	mov.l	@(OFF_R7,r15), r7   ! arg3
 	mov.l	@(OFF_R7,r15), r7   ! arg3
 	mov.l	@(OFF_R3,r15), r3   ! syscall_nr
 	mov.l	@(OFF_R3,r15), r3   ! syscall_nr
-	!   	    	    Arrange for do_syscall_trace to be called
-	!   	    	    again as the system call returns.
+	!
 	mov.l	2f, r10			! Number of syscalls
 	mov.l	2f, r10			! Number of syscalls
 	cmp/hs	r10, r3
 	cmp/hs	r10, r3
 	bf	syscall_call
 	bf	syscall_call
@@ -273,6 +272,18 @@ __restore_all:
 	.align	2
 	.align	2
 1:	.long	restore_all
 1:	.long	restore_all
 
 
+	.align	2
+not_syscall_tra:	
+	bra	debug_trap
+	 nop
+
+	.align	2
+syscall_badsys:			! Bad syscall number
+	mov	#-ENOSYS, r0
+	bra	resume_userspace
+	 mov.l	r0, @(OFF_R0,r15)	! Return value
+	
+
 /*
 /*
  * Syscall interface:
  * Syscall interface:
  *
  *
@@ -316,39 +327,27 @@ ENTRY(system_call)
 	! Is the trap argument >= 0x20? (TRA will be >= 0x80)
 	! Is the trap argument >= 0x20? (TRA will be >= 0x80)
 	mov	#0x7f, r9
 	mov	#0x7f, r9
 	cmp/hi	r9, r8
 	cmp/hi	r9, r8
-	bt/s	0f
+	bt/s	not_syscall_tra
 	 mov	#OFF_TRA, r9
 	 mov	#OFF_TRA, r9
 	add	r15, r9
 	add	r15, r9
-	!
 	mov.l	r8, @r9			! set TRA value to tra
 	mov.l	r8, @r9			! set TRA value to tra
 	sti
 	sti
-	!   	    	    Call the system call handler through the table.
-	!   	    	    First check for bad syscall number
-	mov	r3, r9
-	mov.l	2f, r8			! Number of syscalls
-	cmp/hs	r8, r9
-	get_current_thread_info r8, r10
-	bf	good_system_call
-syscall_badsys:			! Bad syscall number
-	mov	#-ENOSYS, r0
-	bra	resume_userspace
-	 mov.l	r0, @(OFF_R0,r15)	! Return value
 	!
 	!
-0:
-	bra	debug_trap
-	 nop
-	!
-good_system_call:		! Good syscall number
+	get_current_thread_info r8, r10
 	mov.l	@(TI_FLAGS,r8), r8
 	mov.l	@(TI_FLAGS,r8), r8
 	mov	#_TIF_SYSCALL_TRACE, r10
 	mov	#_TIF_SYSCALL_TRACE, r10
 	tst	r10, r8
 	tst	r10, r8
 	bf	syscall_trace_entry
 	bf	syscall_trace_entry
 	!
 	!
+	mov.l	2f, r8			! Number of syscalls
+	cmp/hs	r8, r3
+	bt	syscall_badsys
+	!
 syscall_call:
 syscall_call:
-	shll2	r9		! x4
+	shll2	r3		! x4
 	mov.l	3f, r8		! Load the address of sys_call_table
 	mov.l	3f, r8		! Load the address of sys_call_table
-	add	r8, r9
-	mov.l	@r9, r8
+	add	r8, r3
+	mov.l	@r3, r8
 	jsr	@r8	    	! jump to specific syscall handler
 	jsr	@r8	    	! jump to specific syscall handler
 	 nop
 	 nop
 	mov.l	@(OFF_R0,r15), r12		! save r0
 	mov.l	@(OFF_R0,r15), r12		! save r0