diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2015-03-24 19:39:47 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2015-03-24 19:39:47 +0100 |
commit | 430143bf8db4808730b490ea538f22a557708f92 (patch) | |
tree | d3b0ae1e397e2f12e634f2ad5281147ea91470c5 | |
parent | ea00900a85ae0dc09d58b73b41309794855811a3 (diff) | |
download | android_external_strace-430143bf8db4808730b490ea538f22a557708f92.tar.gz android_external_strace-430143bf8db4808730b490ea538f22a557708f92.tar.bz2 android_external_strace-430143bf8db4808730b490ea538f22a557708f92.zip |
sparc: fix v4.10-25-g8497b62 fallout
Before:
$ sleep 3 & ./strace -p $!
Process 8703 attached
syscall: unknown syscall trap 1a800003 00025d58
syscall_516(0, 0x40080000, 0, 0xfc000f00, 0x28, 0xefc03b18) = 0
exit_group(0) = ?
+++ exited with 0 +++
After:
$ sleep 3 & ./strace -p $!
Process 8725 attached
restart_syscall(<... resuming interrupted nanosleep ...>) = 0
exit_group(0) = ?
+++ exited with 0 +++
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r-- | linux/sparc/get_scno.c | 49 |
1 files changed, 4 insertions, 45 deletions
diff --git a/linux/sparc/get_scno.c b/linux/sparc/get_scno.c index d083bf47..cde44441 100644 --- a/linux/sparc/get_scno.c +++ b/linux/sparc/get_scno.c @@ -1,20 +1,11 @@ -/* Disassemble the syscall trap. */ +#ifdef SPARC64 /* Retrieve the syscall trap instruction. */ unsigned long trap; - errno = 0; - -#ifdef SPARC64 trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)sparc_regs.tpc, 0); -trap >>= 32; -#else -trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)sparc_regs.pc, 0); -#endif - if (errno) return -1; - -/* Disassemble the trap to see what personality to use. */ +trap >>= 32; switch (trap) { case 0x91d02010: /* Linux/SPARC syscall trap. */ @@ -24,39 +15,7 @@ case 0x91d0206d: /* Linux/SPARC64 syscall trap. */ update_personality(tcp, 2); break; -case 0x91d02000: - /* SunOS syscall trap. (pers 1) */ - fprintf(stderr, "syscall: SunOS no support\n"); - return -1; -case 0x91d02008: - /* Solaris 2.x syscall trap. (per 2) */ - update_personality(tcp, 1); - break; -case 0x91d02009: - /* NetBSD/FreeBSD syscall trap. */ - fprintf(stderr, "syscall: NetBSD/FreeBSD not supported\n"); - return -1; -case 0x91d02027: - /* Solaris 2.x gettimeofday */ - update_personality(tcp, 1); - break; -default: -#ifdef SPARC64 - fprintf(stderr, "syscall: unknown syscall trap %08lx %016lx\n", trap, sparc_regs.tpc); -#else - fprintf(stderr, "syscall: unknown syscall trap %08lx %08lx\n", trap, sparc_regs.pc); -#endif - return -1; -} - -/* Extract the system call number from the registers. */ -if (trap == 0x91d02027) { - scno = 156; -} else { - scno = sparc_regs.u_regs[U_REG_G1]; } +#endif -if (scno == 0) { - scno = sparc_regs.u_regs[U_REG_O0]; - memmove(&sparc_regs.u_regs[U_REG_O0], &sparc_regs.u_regs[U_REG_O1], 7*sizeof(sparc_regs.u_regs[0])); -} +scno = sparc_regs.u_regs[U_REG_G1]; |