* Copyright (c) 2013 Denys Vlasenko <vda.linux@googlemail.com>
* Copyright (c) 2011-2015 Dmitry V. Levin <ldv@altlinux.org>
* Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
+ * Copyright (c) 2015-2018 The strace developers.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include MPERS_DEFS
+#include "nr_prefix.c"
+
#ifndef IN_MPERS
#include "printsiginfo.h"
#endif
printsigval(const siginfo_t *sip)
{
tprintf(", si_value={int=%d, ptr=", sip->si_int);
- printaddr((unsigned long) sip->si_ptr);
+ printaddr(ptr_to_kulong(sip->si_ptr));
tprints("}");
}
}
}
- if (code)
- tprints(code);
- else
- tprintf("%#x", si_code);
+ print_xlat_ex(si_code, code, XLAT_STYLE_DEFAULT);
}
static void
else
printsignal(sip->si_status);
tprintf(", si_utime=%llu, si_stime=%llu",
- widen_to_ull(sip->si_utime),
- widen_to_ull(sip->si_stime));
+ zero_extend_signed_to_ull(sip->si_utime),
+ zero_extend_signed_to_ull(sip->si_stime));
break;
case SIGILL: case SIGFPE:
case SIGSEGV: case SIGBUS:
tprints(", si_addr=");
- printaddr((unsigned long) sip->si_addr);
+ printaddr(ptr_to_kulong(sip->si_addr));
break;
case SIGPOLL:
switch (sip->si_code) {
}
break;
#ifdef HAVE_SIGINFO_T_SI_SYSCALL
- case SIGSYS:
+ case SIGSYS: {
+ /*
+ * Note that we can safely use the personlity set in
+ * current_personality here (and don't have to guess it
+ * based on X32_SYSCALL_BIT and si_arch, for example):
+ * - The signal is delivered as a result of seccomp
+ * filtering to the process executing forbidden
+ * syscall.
+ * - We have set the personality for the tracee during
+ * the syscall entering.
+ * - The current_personality is reliably switched in
+ * the next_event routine, it is set to the
+ * personality of the last call made (the one that
+ * triggered the signal delivery).
+ * - Looks like there are no other cases where SIGSYS
+ * is delivered from the kernel so far.
+ */
+ const char *scname = syscall_name(shuffle_scno(
+ (unsigned) sip->si_syscall));
+
tprints(", si_call_addr=");
- printaddr((unsigned long) sip->si_call_addr);
- tprintf(", si_syscall=__NR_%s, si_arch=",
- syscall_name((unsigned) sip->si_syscall));
+ printaddr(ptr_to_kulong(sip->si_call_addr));
+ tprints(", si_syscall=");
+ if (scname)
+ tprintf("%s%s",
+ nr_prefix(sip->si_syscall), scname);
+ else
+ tprintf("%u", (unsigned) sip->si_syscall);
+ tprints(", si_arch=");
printxval(audit_arch, sip->si_arch, "AUDIT_ARCH_???");
break;
+ }
#endif
default:
if (sip->si_pid || sip->si_uid)
}
MPERS_PRINTER_DECL(void, printsiginfo_at,
- struct tcb *tcp, long addr)
+ struct tcb *const tcp, const kernel_ulong_t addr)
{
siginfo_t si;
return true;
}
-MPERS_PRINTER_DECL(void, print_siginfo_array,
- struct tcb *tcp, unsigned long addr, unsigned long len)
+MPERS_PRINTER_DECL(void, print_siginfo_array, struct tcb *const tcp,
+ const kernel_ulong_t addr, const kernel_ulong_t len)
{
siginfo_t si;
print_array(tcp, addr, len, &si, sizeof(si),
- umoven_or_printaddr, print_siginfo_t, 0);
+ tfetch_mem, print_siginfo_t, 0);
}