sigreturn: print signal mask as a syscall argument
Although sigreturn takes signal mask via frame pointer,
it's more convenient to display signal mask as a syscall argument
rather than an outstanding object of unknown nature:
Before this change:
sigreturn() (mask [USR2 CHLD RT_2 RT_3 RT_4 RT_31 RT_32]) = 0
After this change:
sigreturn({mask=[USR2 CHLD RT_2 RT_3 RT_4 RT_31 RT_32]}) = 0
* signal.c (sys_sigreturn): Display signal mask as a syscall argument.
diff --git a/signal.c b/signal.c
index 1d52f73..e9ce465 100644
--- a/signal.c
+++ b/signal.c
@@ -703,8 +703,9 @@
# endif
(*arm_sp_ptr +
OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
- tprints(") (mask ");
+ tprints("{mask=");
print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(S390) || defined(S390X)
if (entering(tcp)) {
@@ -712,14 +713,19 @@
long mask[NSIG / 8 / sizeof(long)];
if (upeek(tcp->pid, PT_GPR15, &usp) < 0)
return 0;
- if (umove(tcp, usp + __SIGNAL_FRAMESIZE, &mask) < 0)
- return 0;
+ tprints("{mask=");
+ const long addr = usp + __SIGNAL_FRAMESIZE;
+ if (umove(tcp, addr, &mask) < 0) {
+ tprintf("%#lx", addr);
+ } else {
# ifdef S390
- usp = mask[0];
- mask[0] = mask[1];
- mask[1] = usp;
+ usp = mask[0];
+ mask[0] = mask[1];
+ mask[1] = usp;
# endif
- tprintsigmask_addr(") (mask ", mask);
+ tprintsigmask_addr("", mask);
+ }
+ tprints("}");
}
#elif defined I386 || defined X86_64 || defined X32
if (entering(tcp)) {
@@ -728,8 +734,9 @@
const unsigned long addr =
(unsigned long) *x86_64_rsp_ptr +
offsetof(struct ucontext, uc_sigmask);
- tprints(") (mask ");
+ tprints("{mask=");
print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
return 0;
}
# endif
@@ -785,12 +792,16 @@
* and after it an additional u32 extramask[1] which holds
* upper half of the mask.
*/
- uint32_t sigmask[2];
- if (umove(tcp, *i386_esp_ptr, &signal_stack) < 0)
- return 0;
- sigmask[0] = signal_stack.sc.oldmask;
- sigmask[1] = signal_stack.extramask[0];
- tprintsigmask_addr(") (mask ", sigmask);
+ tprints("{mask=");
+ if (umove(tcp, *i386_esp_ptr, &signal_stack) < 0) {
+ tprintf("%#lx", (unsigned long) *i386_esp_ptr);
+ } else {
+ uint32_t sigmask[2];
+ sigmask[0] = signal_stack.sc.oldmask;
+ sigmask[1] = signal_stack.extramask[0];
+ tprintsigmask_addr("", sigmask);
+ }
+ tprints("}");
}
#elif defined(IA64)
if (entering(tcp)) {
@@ -801,8 +812,9 @@
# define OFFSETOF_STRUCT_SIGFRAME_SC 0xA0
addr += 16 + OFFSETOF_STRUCT_SIGFRAME_SC +
offsetof(struct sigcontext, sc_mask);
- tprints(") (mask ");
+ tprints("{mask=");
print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(POWERPC)
if (entering(tcp)) {
@@ -817,7 +829,7 @@
#endif
esp += 64;
- tprints(") (mask ");
+ tprints("{mask=");
if (umove(tcp, esp, &sc) < 0) {
tprintf("%#lx", esp);
} else {
@@ -833,26 +845,27 @@
}
tprintsigmask_val("", mask);
}
+ tprints("}");
}
#elif defined(M68K)
if (entering(tcp)) {
- long usp;
- struct sigcontext sc;
- if (upeek(tcp->pid, 4*PT_USP, &usp) < 0)
+ long addr;
+ if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
return 0;
- if (umove(tcp, usp, &sc) < 0)
- return 0;
- tprintsigmask_val(") (mask ", sc.sc_mask);
+ addr += offsetof(struct sigcontext, sc_mask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(ALPHA)
if (entering(tcp)) {
- long fp;
- struct sigcontext sc;
- if (upeek(tcp->pid, REG_FP, &fp) < 0)
+ long addr;
+ if (upeek(tcp->pid, REG_FP, &addr) < 0)
return 0;
- if (umove(tcp, fp, &sc) < 0)
- return 0;
- tprintsigmask_val(") (mask ", sc.sc_mask);
+ addr += offsetof(struct sigcontext, sc_mask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(SPARC) || defined(SPARC64)
if (entering(tcp)) {
@@ -864,7 +877,7 @@
unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
} frame;
- tprints(") (mask ");
+ tprints("{mask=");
if (umove(tcp, fp, &frame) < 0) {
tprintf("%#lx", fp);
} else {
@@ -874,6 +887,7 @@
memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
tprintsigmask_val("", mask);
}
+ tprints("}");
}
#elif defined MIPS
if (entering(tcp)) {
@@ -895,42 +909,44 @@
const long addr = mips_REG_SP + 6 * 4 + 128 +
offsetof(struct ucontext, uc_sigmask);
# endif
- tprints(") (mask ");
+ tprints("{mask=");
print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(CRISV10) || defined(CRISV32)
if (entering(tcp)) {
- struct sigcontext sc;
long regs[PT_MAX+1];
if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
perror_msg("sigreturn: PTRACE_GETREGS");
return 0;
}
- if (umove(tcp, regs[PT_USP], &sc) < 0)
- return 0;
- tprintsigmask_val(") (mask ", sc.oldmask);
+ const long addr = regs[PT_USP] +
+ offsetof(struct sigcontext, oldmask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(TILE)
if (entering(tcp)) {
- struct ucontext uc;
-
/* offset of ucontext in the kernel's sigframe structure */
-# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
- if (umove(tcp, tile_regs.sp + SIGFRAME_UC_OFFSET, &uc) < 0)
- return 0;
- tprintsigmask_val(") (mask ", uc.uc_sigmask);
+# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
+ const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
+ offsetof(struct ucontext, uc_sigmask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#elif defined(MICROBLAZE)
/* TODO: Verify that this is correct... */
if (entering(tcp)) {
- struct sigcontext sc;
- long sp;
+ long addr;
/* Read r1, the stack pointer. */
- if (upeek(tcp->pid, 1 * 4, &sp) < 0)
+ if (upeek(tcp->pid, 1 * 4, &addr) < 0)
return 0;
- if (umove(tcp, sp, &sc) < 0)
- return 0;
- tprintsigmask_val(") (mask ", sc.oldmask);
+ addr += offsetof(struct sigcontext, oldmask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
}
#else
# warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture