]> granicus.if.org Git - strace/commitdiff
sparc: fix v4.10-25-g8497b62 fallout
authorDenys Vlasenko <dvlasenk@redhat.com>
Tue, 24 Mar 2015 18:39:47 +0000 (19:39 +0100)
committerDenys Vlasenko <dvlasenk@redhat.com>
Tue, 24 Mar 2015 18:39:47 +0000 (19:39 +0100)
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>
linux/sparc/get_scno.c

index d083bf477a0772d3b594998e0a445499b5800349..cde4444188b7fca0b802eb6a50152bd97af8edc7 100644 (file)
@@ -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];