sh: Rearrange blocks in entry-common.S
This avoids out-of-range jumps that get auto-replaced by the assembler and prepares for the changes needed to implement SECCOMP_FILTER cleanly. Signed-off-by: Michael Karcher <kernel@mkarcher.dialup.fu-berlin.de> Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Signed-off-by: Rich Felker <dalias@libc.org>
This commit is contained in:
committed by
Rich Felker
parent
e1cc9d8d59
commit
9d2ec8f68e
@ -178,34 +178,6 @@ syscall_exit_work:
|
|||||||
bra resume_userspace
|
bra resume_userspace
|
||||||
nop
|
nop
|
||||||
|
|
||||||
.align 2
|
|
||||||
syscall_trace_entry:
|
|
||||||
! Yes it is traced.
|
|
||||||
mov r15, r4
|
|
||||||
mov.l 7f, r11 ! Call do_syscall_trace_enter which notifies
|
|
||||||
jsr @r11 ! superior (will chomp R[0-7])
|
|
||||||
nop
|
|
||||||
mov.l r0, @(OFF_R0,r15) ! Save return value
|
|
||||||
! Reload R0-R4 from kernel stack, where the
|
|
||||||
! parent may have modified them using
|
|
||||||
! ptrace(POKEUSR). (Note that R0-R2 are
|
|
||||||
! reloaded from the kernel stack by syscall_call
|
|
||||||
! below, so don't need to be reloaded here.)
|
|
||||||
! This allows the parent to rewrite system calls
|
|
||||||
! and args on the fly.
|
|
||||||
mov.l @(OFF_R4,r15), r4 ! arg0
|
|
||||||
mov.l @(OFF_R5,r15), r5
|
|
||||||
mov.l @(OFF_R6,r15), r6
|
|
||||||
mov.l @(OFF_R7,r15), r7 ! arg3
|
|
||||||
mov.l @(OFF_R3,r15), r3 ! syscall_nr
|
|
||||||
!
|
|
||||||
mov.l 6f, r10 ! Number of syscalls
|
|
||||||
cmp/hs r10, r3
|
|
||||||
bf syscall_call
|
|
||||||
mov #-ENOSYS, r0
|
|
||||||
bra syscall_exit
|
|
||||||
mov.l r0, @(OFF_R0,r15) ! Return value
|
|
||||||
|
|
||||||
__restore_all:
|
__restore_all:
|
||||||
mov #OFF_SR, r0
|
mov #OFF_SR, r0
|
||||||
mov.l @(r0,r15), r0 ! get status register
|
mov.l @(r0,r15), r0 ! get status register
|
||||||
@ -388,6 +360,35 @@ syscall_exit:
|
|||||||
bf syscall_exit_work
|
bf syscall_exit_work
|
||||||
bra __restore_all
|
bra __restore_all
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
syscall_trace_entry:
|
||||||
|
! Yes it is traced.
|
||||||
|
mov r15, r4
|
||||||
|
mov.l 7f, r11 ! Call do_syscall_trace_enter which notifies
|
||||||
|
jsr @r11 ! superior (will chomp R[0-7])
|
||||||
|
nop
|
||||||
|
mov.l r0, @(OFF_R0,r15) ! Save return value
|
||||||
|
! Reload R0-R4 from kernel stack, where the
|
||||||
|
! parent may have modified them using
|
||||||
|
! ptrace(POKEUSR). (Note that R0-R2 are
|
||||||
|
! reloaded from the kernel stack by syscall_call
|
||||||
|
! below, so don't need to be reloaded here.)
|
||||||
|
! This allows the parent to rewrite system calls
|
||||||
|
! and args on the fly.
|
||||||
|
mov.l @(OFF_R4,r15), r4 ! arg0
|
||||||
|
mov.l @(OFF_R5,r15), r5
|
||||||
|
mov.l @(OFF_R6,r15), r6
|
||||||
|
mov.l @(OFF_R7,r15), r7 ! arg3
|
||||||
|
mov.l @(OFF_R3,r15), r3 ! syscall_nr
|
||||||
|
!
|
||||||
|
mov.l 6f, r10 ! Number of syscalls
|
||||||
|
cmp/hs r10, r3
|
||||||
|
bf syscall_call
|
||||||
|
mov #-ENOSYS, r0
|
||||||
|
bra syscall_exit
|
||||||
|
mov.l r0, @(OFF_R0,r15) ! Return value
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
#if !defined(CONFIG_CPU_SH2)
|
#if !defined(CONFIG_CPU_SH2)
|
||||||
1: .long TRA
|
1: .long TRA
|
||||||
|
Reference in New Issue
Block a user