diff options
-rw-r--r-- | linux/os.h | 6 | ||||
-rw-r--r-- | sctrace.c | 6 |
2 files changed, 9 insertions, 3 deletions
@@ -30,3 +30,9 @@ #else # error "This program is only implemented for x86-64 on Linux" #endif + +#if defined(__sparc__) +# define REGARGS(a, b) b, a +#else +# define REGARGS(a, b) a, b +#endif @@ -22,7 +22,7 @@ handle_syscall(struct process *proc) switch ((int)proc->state) { default: /* Get system call arguments */ - if (ptrace(PTRACE_GETREGS, proc->pid, NULL, ®s)) + if (ptrace(PTRACE_GETREGS, proc->pid, REGARGS(NULL, ®s))) eprintf("ptrace PTRACE_GETREGS %ju NULL <buffer>:", (uintmax_t)proc->pid); proc->scall = regs.SYSCALL_NUM_REG; #ifdef CHECK_ARCHITECTURE @@ -45,7 +45,7 @@ handle_syscall(struct process *proc) case CloneParent: case ForkParent: /* Get system call result */ - if (ptrace(PTRACE_GETREGS, proc->pid, NULL, ®s)) + if (ptrace(PTRACE_GETREGS, proc->pid, REGARGS(NULL, ®s))) eprintf("ptrace PTRACE_GETREGS %ju NULL <buffer>:", (uintmax_t)proc->pid); /* Get or set return */ @@ -53,7 +53,7 @@ handle_syscall(struct process *proc) proc->ret = regs.SYSCALL_RET_REG; } else { regs.SYSCALL_RET_REG = proc->ret; - if (ptrace(PTRACE_SETREGS, proc->pid, NULL, ®s)) + if (ptrace(PTRACE_SETREGS, proc->pid, REGARGS(NULL, ®s))) eprintf("ptrace PTRACE_SETREGS %ju NULL <buffer>:", (uintmax_t)proc->pid); if (ptrace(PTRACE_SYSCALL, proc->pid, NULL, 0)) eprintf("ptrace PTRACE_SYSCALL %ju NULL 0:", (uintmax_t)proc->pid); |