diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index 5bc7fa91d095c0f44914e471f3b9ef12f89d1266..8f96d21fcb1c4722c570a991f83df7e6c131b0b6 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S @@ -256,8 +256,7 @@ syscall_trace_entry: mov.l @(OFF_R6,r15), r6 mov.l @(OFF_R7,r15), r7 ! arg3 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 cmp/hs r10, r3 bf syscall_call @@ -273,6 +272,18 @@ __restore_all: .align 2 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: * @@ -316,39 +327,27 @@ ENTRY(system_call) ! Is the trap argument >= 0x20? (TRA will be >= 0x80) mov #0x7f, r9 cmp/hi r9, r8 - bt/s 0f + bt/s not_syscall_tra mov #OFF_TRA, r9 add r15, r9 - ! mov.l r8, @r9 ! set TRA value to tra 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 #_TIF_SYSCALL_TRACE, r10 tst r10, r8 bf syscall_trace_entry ! + mov.l 2f, r8 ! Number of syscalls + cmp/hs r8, r3 + bt syscall_badsys + ! syscall_call: - shll2 r9 ! x4 + shll2 r3 ! x4 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 nop mov.l @(OFF_R0,r15), r12 ! save r0