From: Denys Vlasenko Date: Tue, 24 Mar 2015 18:39:47 +0000 (+0100) Subject: sparc: fix v4.10-25-g8497b62 fallout X-Git-Tag: v4.11~543 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=430143bf8db4808730b490ea538f22a557708f92;p=strace 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 --- 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];