]> granicus.if.org Git - strace/commitdiff
x86_64, x32: implement rt_sigreturn decoding
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Mar 2015 12:19:55 +0000 (12:19 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Mar 2015 17:54:25 +0000 (17:54 +0000)
* syscall.c [X86_64 || X32] (x86_64_rsp_ptr): New variable.
* linux/x86_64/arch_regs.h (x86_64_rsp_ptr): New declaration.
* linux/x86_64/syscallent.h (15): Use sys_sigreturn for rt_sigreturn
decoding.
* linux/x32/syscallent.h (513): Likewise.
* signal.c (sys_sigreturn) [X86_64 || X32]: Print signal mask
for non-i386 personalities.

linux/x32/syscallent.h
linux/x86_64/arch_regs.h
linux/x86_64/syscallent.h
signal.c
syscall.c

index e991807189e84b493eb992a386a161c67b2622bb..3996b4250e7103f1b7ae381fb262f2ac4993e16c 100644 (file)
  * for native 64-bit operation.
  */
 [512] = { 4,   TS,             sys_rt_sigaction,               "rt_sigaction"          },
-[513] = { 0,   TS,             sys_rt_sigreturn,               "rt_sigreturn"          },
+[513] = { 0,   TS,             sys_sigreturn,                  "rt_sigreturn"          },
 [514] = { 3,   TD,             sys_ioctl,                      "ioctl"                 },
 [515] = { 3,   TD,             sys_readv,                      "readv"                 },
 [516] = { 3,   TD,             sys_writev,                     "writev"                },
index eeb4ebea868c468139747908a44567120efc05fd..c2ccee671d4f1f8908b68ba210ea3745c389fb2b 100644 (file)
@@ -1 +1,2 @@
 extern uint32_t *const i386_esp_ptr;
+extern uint64_t *const x86_64_rsp_ptr;
index c1fedea25db2adf1dd76617f049cd119d86a565f..f48440258fd693ef5f193cbbba648a1a1fe65bc2 100644 (file)
@@ -13,7 +13,7 @@
 [ 12] = { 1,   TM|SI,          sys_brk,                        "brk"                   },
 [ 13] = { 4,   TS,             sys_rt_sigaction,               "rt_sigaction"          },
 [ 14] = { 4,   TS,             sys_rt_sigprocmask,             "rt_sigprocmask"        },
-[ 15] = { 0,   TS,             sys_rt_sigreturn,               "rt_sigreturn"          },
+[ 15] = { 0,   TS,             sys_sigreturn,                  "rt_sigreturn"          },
 [ 16] = { 3,   TD,             sys_ioctl,                      "ioctl"                 },
 [ 17] = { 4,   TD,             sys_pread,                      "pread"                 },
 [ 18] = { 4,   TD,             sys_pwrite,                     "pwrite"                },
index d34fd725b2a00709a5c462e96bd39eac5c293889..f084772a4c74339168595c54a57e4988fdc14a0e 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -747,12 +747,17 @@ sys_sigreturn(struct tcb *tcp)
                tprintsigmask_addr(") (mask ", sc.oldmask);
        }
 #elif defined I386 || defined X86_64 || defined X32
+       if (entering(tcp)) {
 # ifndef I386
-       /* sys_sigreturn is i386 personality only */
-       if (current_personality != 1)
-               return 0;
+               if (current_personality != 1) {
+                       const unsigned long addr =
+                               (unsigned long) *x86_64_rsp_ptr +
+                               offsetof(struct ucontext, uc_sigmask);
+                       tprints(") (mask ");
+                       print_sigset_addr_len(tcp, addr, NSIG / 8);
+                       return 0;
+               }
 # endif
-       if (entering(tcp)) {
                struct i386_sigcontext_struct {
                        uint16_t gs, __gsh;
                        uint16_t fs, __fsh;
index 228536b479a7f51ac8dd4cb98fd69939c73e8f5a..cfedc9f16380d7e3297c2593f75acb5d4261a35b 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -695,6 +695,7 @@ static union {
 # define x86_64_regs x86_regs_union.x86_64_r
 # define i386_regs   x86_regs_union.i386_r
 uint32_t *const i386_esp_ptr = &i386_regs.esp;
+uint64_t *const x86_64_rsp_ptr = (uint64_t *) &x86_64_regs.rsp;
 static struct iovec x86_io = {
        .iov_base = &x86_regs_union
 };