This avoids out-of-range jumps that get auto-replaced by the assembler and prepares for the changes needed to implement SECCOMP_FILTER cleanly.
Unified · Split
| @@ -178,34 +178,6 @@ syscall_exit_work: · 177 unmodified lines | |||
| 178 | bra resume_userspace | 178 | bra resume_userspace |
| 179 | nop | 179 | nop |
| 180 | 180 | ||
| 181 | .align 2 | ||
| 182 | syscall_trace_entry: | ||
| 183 | ! Yes it is traced. | ||
| 184 | mov r15, r4 | ||
| 185 | mov.l 7f, r11 ! Call do_syscall_trace_enter which notifies | ||
| 186 | jsr @r11 ! superior (will chomp R[0-7]) | ||
| 187 | nop | ||
| 188 | mov.l r0, @(OFF_R0,r15) ! Save return value | ||
| 189 | ! Reload R0-R4 from kernel stack, where the | ||
| 190 | ! parent may have modified them using | ||
| 191 | ! ptrace(POKEUSR). (Note that R0-R2 are | ||
| 192 | ! reloaded from the kernel stack by syscall_call | ||
| 193 | ! below, so don't need to be reloaded here.) | ||
| 194 | ! This allows the parent to rewrite system calls | ||
| 195 | ! and args on the fly. | ||
| 196 | mov.l @(OFF_R4,r15), r4 ! arg0 | ||
| 197 | mov.l @(OFF_R5,r15), r5 | ||
| 198 | mov.l @(OFF_R6,r15), r6 | ||
| 199 | mov.l @(OFF_R7,r15), r7 ! arg3 | ||
| 200 | mov.l @(OFF_R3,r15), r3 ! syscall_nr | ||
| 201 | ! | ||
| 202 | mov.l 6f, r10 ! Number of syscalls | ||
| 203 | cmp/hs r10, r3 | ||
| 204 | bf syscall_call | ||
| 205 | mov #-ENOSYS, r0 | ||
| 206 | bra syscall_exit | ||
| 207 | mov.l r0, @(OFF_R0,r15) ! Return value | ||
| 208 | |||
| 209 | __restore_all: | 181 | __restore_all: |
| 210 | mov #OFF_SR, r0 | 182 | mov #OFF_SR, r0 |
| 211 | mov.l @(r0,r15), r0 ! get status register | 183 | mov.l @(r0,r15), r0 ! get status register |
| @@ -388,6 +360,35 @@ syscall_exit: · 176 unmodified lines | |||
| 388 | bf syscall_exit_work | 360 | bf syscall_exit_work |
| 389 | bra __restore_all | 361 | bra __restore_all |
| 390 | nop | 362 | nop |
| 363 | |||
| 364 | .align 2 | ||
| 365 | syscall_trace_entry: | ||
| 366 | ! Yes it is traced. | ||
| 367 | mov r15, r4 | ||
| 368 | mov.l 7f, r11 ! Call do_syscall_trace_enter which notifies | ||
| 369 | jsr @r11 ! superior (will chomp R[0-7]) | ||
| 370 | nop | ||
| 371 | mov.l r0, @(OFF_R0,r15) ! Save return value | ||
| 372 | ! Reload R0-R4 from kernel stack, where the | ||
| 373 | ! parent may have modified them using | ||
| 374 | ! ptrace(POKEUSR). (Note that R0-R2 are | ||
| 375 | ! reloaded from the kernel stack by syscall_call | ||
| 376 | ! below, so don't need to be reloaded here.) | ||
| 377 | ! This allows the parent to rewrite system calls | ||
| 378 | ! and args on the fly. | ||
| 379 | mov.l @(OFF_R4,r15), r4 ! arg0 | ||
| 380 | mov.l @(OFF_R5,r15), r5 | ||
| 381 | mov.l @(OFF_R6,r15), r6 | ||
| 382 | mov.l @(OFF_R7,r15), r7 ! arg3 | ||
| 383 | mov.l @(OFF_R3,r15), r3 ! syscall_nr | ||
| 384 | ! | ||
| 385 | mov.l 6f, r10 ! Number of syscalls | ||
| 386 | cmp/hs r10, r3 | ||
| 387 | bf syscall_call | ||
| 388 | mov #-ENOSYS, r0 | ||
| 389 | bra syscall_exit | ||
| 390 | mov.l r0, @(OFF_R0,r15) ! Return value | ||
| 391 | |||
| 391 | .align 2 | 392 | .align 2 |
| 392 | #if !defined(CONFIG_CPU_SH2) | 393 | #if !defined(CONFIG_CPU_SH2) |
| 393 | 1: .long TRA | 394 | 1: .long TRA |