]> granicus.if.org Git - strace/commitdiff
i386, x32: use upoke() instead of set_regs()
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 5 Dec 2018 18:37:34 +0000 (18:37 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 5 Dec 2018 18:37:34 +0000 (18:37 +0000)
This brings i386 and x32 in line with x86_64
and removes redundant HAVE_GETREGS_OLD checks.
Besides that, use of PTRACE_GET_SYSCALL_INFO would require
an extra get_regs() invocation before set_regs().

* syscall.c (ARCH_MIGHT_USE_SET_REGS): Define to 1.
[HAVE_GETREGS_OLD] (ARCH_MIGHT_USE_SET_REGS): Redefine to 0.
(ptrace_setregset_or_setregs): Check ARCH_MIGHT_USE_SET_REGS instead
of HAVE_GETREGS_OLD.
* linux/i386/arch_regs.c (ARCH_MIGHT_USE_SET_REGS): Redefine to 0.
* linux/powerpc/arch_regs.c: Likewise.
* linux/x86_64/arch_regs.c: Likewise.
* linux/i386/set_error.c (arch_set_error, arch_set_success)
[!HAVE_GETREGS_OLD]: Remove.
* linux/i386/set_scno.c (arch_set_scno) [!HAVE_GETREGS_OLD]: Remove.
* linux/powerpc/set_error.c (arch_set_error, arch_set_success)
[!HAVE_GETREGS_OLD]: Remove.
* linux/powerpc/set_scno.c (arch_set_scno) [!HAVE_GETREGS_OLD]: Remove.
* linux/x86_64/set_error.c [!HAVE_GETREGS_OLD]: Remove.
* linux/x86_64/set_scno.c: Likewise.

linux/i386/arch_regs.c
linux/i386/set_error.c
linux/i386/set_scno.c
linux/powerpc/arch_regs.c
linux/powerpc/set_error.c
linux/powerpc/set_scno.c
linux/x86_64/arch_regs.c
linux/x86_64/set_error.c
linux/x86_64/set_scno.c
syscall.c

index a5cf9e90ba9c932cb89eb1c9b2816ceb3b5a882d..aeaed9cf0aa54aaf7b0e461ff53b5c98f7122d6f 100644 (file)
@@ -3,3 +3,6 @@ static struct user_regs_struct i386_regs;
 #define ARCH_REGS_FOR_GETREGS i386_regs
 #define ARCH_PC_REG i386_regs.eip
 #define ARCH_SP_REG i386_regs.esp
+
+#undef ARCH_MIGHT_USE_SET_REGS
+#define ARCH_MIGHT_USE_SET_REGS 0
index 7d47e28b482d6e95c2141384e7726b7b5364f54c..0e0d7c600707e1b2c1dd6838c3b14b7387b4fbb3 100644 (file)
@@ -2,20 +2,12 @@ static int
 arch_set_error(struct tcb *tcp)
 {
        i386_regs.eax = -tcp->u_error;
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, 4 * EAX, i386_regs.eax);
-#else
-       return set_regs(tcp->pid);
-#endif
 }
 
 static int
 arch_set_success(struct tcb *tcp)
 {
        i386_regs.eax = tcp->u_rval;
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, 4 * EAX, i386_regs.eax);
-#else
-       return set_regs(tcp->pid);
-#endif
 }
index 67736eae48c9052d8a0377cb5eeca77a1c1869d4..9ac551f9406558e7b387151afef5eca76f7e2b98 100644 (file)
@@ -1,10 +1,5 @@
 static int
 arch_set_scno(struct tcb *tcp, kernel_ulong_t scno)
 {
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, 4 * ORIG_EAX, scno);
-#else
-       i386_regs.orig_eax = scno;
-       return set_regs(tcp->pid);
-#endif
 }
index 37cddc5761a49bafc0cacbf2af76827ecececb1f..78c4c3e719abc4df590d31c919d0c4cf695cf0b5 100644 (file)
@@ -3,3 +3,6 @@ static struct pt_regs ppc_regs;
 #define ARCH_REGS_FOR_GETREGS ppc_regs
 #define ARCH_PC_REG ppc_regs.nip
 #define ARCH_SP_REG ppc_regs.gpr[1]
+
+#undef ARCH_MIGHT_USE_SET_REGS
+#define ARCH_MIGHT_USE_SET_REGS 0
index 602ca15e1a1bf73342e1f91ce6b29df2a8e86f28..d22df112cede769ae4b7695cb8ef9a0ce70b9eac 100644 (file)
@@ -3,12 +3,8 @@ arch_set_error(struct tcb *tcp)
 {
        ppc_regs.gpr[3] = tcp->u_error;
        ppc_regs.ccr |= 0x10000000;
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, sizeof(long) * PT_CCR, ppc_regs.ccr) ||
               upoke(tcp, sizeof(long) * (PT_R0 + 3), ppc_regs.gpr[3]);
-#else
-       return set_regs(tcp->pid);
-#endif
 }
 
 static int
@@ -16,10 +12,6 @@ arch_set_success(struct tcb *tcp)
 {
        ppc_regs.gpr[3] = tcp->u_rval;
        ppc_regs.ccr &= ~0x10000000;
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, sizeof(long) * PT_CCR, ppc_regs.ccr) ||
               upoke(tcp, sizeof(long) * (PT_R0 + 3), ppc_regs.gpr[3]);
-#else
-       return set_regs(tcp->pid);
-#endif
 }
index b2f6693409f65c08af5cfa4652bdd8ecab304884..f00ef23817197e67429b3b3fb8250c93f71dd8d7 100644 (file)
@@ -1,10 +1,5 @@
 static int
 arch_set_scno(struct tcb *tcp, kernel_ulong_t scno)
 {
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, sizeof(long) * PT_R0, scno);
-#else
-       ppc_regs.gpr[0] = scno;
-       return set_regs(tcp->pid);
-#endif
 }
index ac719b6b93edf706791eeb542ce2fbdeaca44d5c..5775bcfa6e826151e696eb840cffcb5198b69479 100644 (file)
@@ -40,3 +40,6 @@ static struct iovec x86_io = {
        (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
 #define ARCH_SP_REG \
        (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.esp : x86_64_regs.rsp)
+
+#undef ARCH_MIGHT_USE_SET_REGS
+#define ARCH_MIGHT_USE_SET_REGS 0
index 0c7e188c5173e731cb876262bfcfedc18a2f7285..edcf1855e4fc827f873d3dd6678ce9e89b7aafc6 100644 (file)
@@ -1,49 +1,25 @@
-#ifndef HAVE_GETREGS_OLD
-# define arch_set_error i386_set_error
-# define arch_set_success i386_set_success
-# include "i386/set_error.c"
-# undef arch_set_success
-# undef arch_set_error
-#endif /* !HAVE_GETREGS_OLD */
-
 static int
 arch_set_error(struct tcb *tcp)
 {
-#ifdef HAVE_GETREGS_OLD
-       kernel_ulong_t  rval = -(kernel_long_t) tcp->u_error;
+       kernel_ulong_t  rval = -(long) tcp->u_error;
 
-       if (x86_io.iov_len == sizeof(i386_regs))
+       if (tcp->currpers == 1)
                i386_regs.eax = rval;
        else
                x86_64_regs.rax = rval;
 
        return upoke(tcp, 8 * RAX, rval);
-#else
-       if (x86_io.iov_len == sizeof(i386_regs))
-               return i386_set_error(tcp);
-
-       x86_64_regs.rax = -(kernel_long_t) tcp->u_error;
-       return set_regs(tcp->pid);
-#endif
 }
 
 static int
 arch_set_success(struct tcb *tcp)
 {
-#ifdef HAVE_GETREGS_OLD
        kernel_ulong_t  rval = (kernel_ulong_t) tcp->u_rval;
 
-       if (x86_io.iov_len == sizeof(i386_regs))
+       if (tcp->currpers == 1)
                i386_regs.eax = rval;
        else
                x86_64_regs.rax = rval;
 
        return upoke(tcp, 8 * RAX, rval);
-#else
-       if (x86_io.iov_len == sizeof(i386_regs))
-               return i386_set_success(tcp);
-
-       x86_64_regs.rax = (kernel_ulong_t) tcp->u_rval;
-       return set_regs(tcp->pid);
-#endif
 }
index 3ca402ebb72e9daa69d6da6be7176826a8a7d8ba..0e620af8ef93e152243d84830fbd214359536165 100644 (file)
@@ -1,19 +1,5 @@
-#ifndef HAVE_GETREGS_OLD
-# define arch_set_scno i386_set_scno
-# include "i386/set_scno.c"
-# undef arch_set_scno
-#endif /* !HAVE_GETREGS_OLD */
-
 static int
 arch_set_scno(struct tcb *tcp, kernel_ulong_t scno)
 {
-#ifdef HAVE_GETREGS_OLD
        return upoke(tcp, 8 * ORIG_RAX, scno);
-#else
-       if (x86_io.iov_len == sizeof(i386_regs))
-               return i386_set_scno(tcp, scno);
-
-       x86_64_regs.orig_rax = scno;
-       return set_regs(tcp->pid);
-#endif
 }
index a0902eca22048619bbab41fc3e4e29febcc9b03b..6b118b6198f8f94d97692a5601217fafd1c69710 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -967,6 +967,7 @@ restore_cleared_syserror(struct tcb *tcp)
 # include "xlat/nt_descriptor_types.h"
 #undef XLAT_MACROS_ONLY
 
+#define ARCH_MIGHT_USE_SET_REGS 1
 #include "arch_regs.c"
 
 #if HAVE_ARCH_GETRVAL2
@@ -974,6 +975,11 @@ restore_cleared_syserror(struct tcb *tcp)
 #endif
 
 #include "getregs_old.h"
+#ifdef HAVE_GETREGS_OLD
+/* Either getregs_old() or set_regs() */
+# undef ARCH_MIGHT_USE_SET_REGS
+# define ARCH_MIGHT_USE_SET_REGS 0
+#endif
 
 #undef ptrace_getregset_or_getregs
 #undef ptrace_setregset_or_setregs
@@ -999,7 +1005,7 @@ ptrace_getregset(pid_t pid)
 # endif
 }
 
-# ifndef HAVE_GETREGS_OLD
+# if ARCH_MIGHT_USE_SET_REGS
 #  define ptrace_setregset_or_setregs ptrace_setregset
 static int
 ptrace_setregset(pid_t pid)
@@ -1017,7 +1023,7 @@ ptrace_setregset(pid_t pid)
        return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &io);
 #  endif
 }
-# endif /* !HAVE_GETREGS_OLD */
+# endif /* ARCH_MIGHT_USE_SET_REGS */
 
 #elif defined ARCH_REGS_FOR_GETREGS
 
@@ -1033,7 +1039,7 @@ ptrace_getregs(pid_t pid)
 # endif
 }
 
-# ifndef HAVE_GETREGS_OLD
+# if ARCH_MIGHT_USE_SET_REGS
 #  define ptrace_setregset_or_setregs ptrace_setregs
 static int
 ptrace_setregs(pid_t pid)
@@ -1045,7 +1051,7 @@ ptrace_setregs(pid_t pid)
        return ptrace(PTRACE_SETREGS, pid, NULL, &ARCH_REGS_FOR_GETREGS);
 #  endif
 }
-# endif /* !HAVE_GETREGS_OLD */
+# endif /* ARCH_MIGHT_USE_SET_REGS */
 
 #endif /* ARCH_REGS_FOR_GETREGSET || ARCH_REGS_FOR_GETREGS */