diff options
| -rw-r--r-- | arch/sparc/kernel/entry.S | 12 | ||||
| -rw-r--r-- | arch/sparc/kernel/ptrace.c | 26 |
2 files changed, 21 insertions, 17 deletions
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 2f96256dc515..e8cdf715a546 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
| @@ -1196,8 +1196,9 @@ sys_rt_sigreturn: | |||
| 1196 | be 1f | 1196 | be 1f |
| 1197 | nop | 1197 | nop |
| 1198 | 1198 | ||
| 1199 | add %sp, STACKFRAME_SZ, %o0 | ||
| 1199 | call syscall_trace | 1200 | call syscall_trace |
| 1200 | nop | 1201 | mov 1, %o1 |
| 1201 | 1202 | ||
| 1202 | 1: | 1203 | 1: |
| 1203 | /* We are returning to a signal handler. */ | 1204 | /* We are returning to a signal handler. */ |
| @@ -1287,8 +1288,12 @@ linux_fast_syscall: | |||
| 1287 | mov %i3, %o3 | 1288 | mov %i3, %o3 |
| 1288 | 1289 | ||
| 1289 | linux_syscall_trace: | 1290 | linux_syscall_trace: |
| 1291 | add %sp, STACKFRAME_SZ, %o0 | ||
| 1290 | call syscall_trace | 1292 | call syscall_trace |
| 1291 | nop | 1293 | mov 0, %o1 |
| 1294 | cmp %o0, 0 | ||
| 1295 | bne 3f | ||
| 1296 | mov -ENOSYS, %o0 | ||
| 1292 | mov %i0, %o0 | 1297 | mov %i0, %o0 |
| 1293 | mov %i1, %o1 | 1298 | mov %i1, %o1 |
| 1294 | mov %i2, %o2 | 1299 | mov %i2, %o2 |
| @@ -1337,6 +1342,7 @@ syscall_is_too_hard: | |||
| 1337 | call %l7 | 1342 | call %l7 |
| 1338 | mov %i5, %o5 | 1343 | mov %i5, %o5 |
| 1339 | 1344 | ||
| 1345 | 3: | ||
| 1340 | st %o0, [%sp + STACKFRAME_SZ + PT_I0] | 1346 | st %o0, [%sp + STACKFRAME_SZ + PT_I0] |
| 1341 | 1347 | ||
| 1342 | ret_sys_call: | 1348 | ret_sys_call: |
| @@ -1374,6 +1380,8 @@ ret_sys_call: | |||
| 1374 | st %l2, [%sp + STACKFRAME_SZ + PT_NPC] | 1380 | st %l2, [%sp + STACKFRAME_SZ + PT_NPC] |
| 1375 | 1381 | ||
| 1376 | linux_syscall_trace2: | 1382 | linux_syscall_trace2: |
| 1383 | add %sp, STACKFRAME_SZ, %o0 | ||
| 1384 | mov 1, %o1 | ||
| 1377 | call syscall_trace | 1385 | call syscall_trace |
| 1378 | add %l1, 0x4, %l2 /* npc = npc+4 */ | 1386 | add %l1, 0x4, %l2 /* npc = npc+4 */ |
| 1379 | st %l1, [%sp + STACKFRAME_SZ + PT_PC] | 1387 | st %l1, [%sp + STACKFRAME_SZ + PT_PC] |
diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index 81f3b929743f..20699c701412 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/signal.h> | 21 | #include <linux/signal.h> |
| 22 | #include <linux/regset.h> | 22 | #include <linux/regset.h> |
| 23 | #include <linux/elf.h> | 23 | #include <linux/elf.h> |
| 24 | #include <linux/tracehook.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
| 26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
| @@ -450,21 +451,16 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 450 | return ret; | 451 | return ret; |
| 451 | } | 452 | } |
| 452 | 453 | ||
| 453 | asmlinkage void syscall_trace(void) | 454 | asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p) |
| 454 | { | 455 | { |
| 455 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 456 | int ret = 0; |
| 456 | return; | 457 | |
| 457 | if (!(current->ptrace & PT_PTRACED)) | 458 | if (test_thread_flag(TIF_SYSCALL_TRACE)) { |
| 458 | return; | 459 | if (syscall_exit_p) |
| 459 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | 460 | tracehook_report_syscall_exit(regs, 0); |
| 460 | ? 0x80 : 0)); | 461 | else |
| 461 | /* | 462 | ret = tracehook_report_syscall_entry(regs); |
| 462 | * this isn't the same as continuing with a signal, but it will do | ||
| 463 | * for normal use. strace only continues with a signal if the | ||
| 464 | * stopping signal is not SIGTRAP. -brl | ||
| 465 | */ | ||
| 466 | if (current->exit_code) { | ||
| 467 | send_sig (current->exit_code, current, 1); | ||
| 468 | current->exit_code = 0; | ||
| 469 | } | 463 | } |
| 464 | |||
| 465 | return ret; | ||
| 470 | } | 466 | } |
