extern void clear_regs(void);
extern void get_regs(pid_t pid);
extern int get_scno(struct tcb *tcp);
+extern const char *syscall_name(long scno);
extern int umoven(struct tcb *, long, unsigned int, void *);
#define umove(pid, addr, objp) \
#include "defs.h"
#include <signal.h>
+#include <linux/audit.h>
#include "printsiginfo.h"
+#include "xlat/audit_arch.h"
#include "xlat/sigbus_codes.h"
#include "xlat/sigchld_codes.h"
#include "xlat/sigfpe_codes.h"
break;
#ifdef HAVE_SIGINFO_T_SI_SYSCALL
case SIGSYS:
- tprintf(", si_call_addr=%#lx, si_syscall=%d, si_arch=%u",
+ tprintf(", si_call_addr=%#lx, si_syscall=__NR_%s, si_arch=",
(unsigned long) sip->si_call_addr,
- sip->si_syscall, sip->si_arch);
+ syscall_name(sip->si_syscall));
+ printxval(audit_arch, sip->si_arch, "AUDIT_ARCH_???");
break;
#endif
default:
# define shuffle_scno(scno) ((long)(scno))
#endif
-static char*
-undefined_scno_name(struct tcb *tcp)
+const char *
+syscall_name(long scno)
{
static char buf[sizeof("syscall_%lu") + sizeof(long)*3];
- sprintf(buf, "syscall_%lu", shuffle_scno(tcp->scno));
- return buf;
+ if (SCNO_IS_VALID(scno))
+ return sysent[scno].sys_name;
+ else {
+ sprintf(buf, "syscall_%lu", shuffle_scno(scno));
+ return buf;
+ }
}
static long get_regs_error;
if (scno_good != 1)
tprints("????" /* anti-trigraph gap */ "(");
else if (tcp->qual_flg & UNDEFINED_SCNO)
- tprintf("%s(", undefined_scno_name(tcp));
+ tprintf("%s(", syscall_name(tcp->scno));
else
tprintf("%s(", tcp->s_ent->sys_name);
/*
printleader(tcp);
if (tcp->qual_flg & UNDEFINED_SCNO)
- tprintf("%s(", undefined_scno_name(tcp));
+ tprintf("%s(", syscall_name(tcp->scno));
else
tprintf("%s(", tcp->s_ent->sys_name);
if ((tcp->qual_flg & QUAL_RAW) && SEN_exit != tcp->s_ent->sen)
tcp->flags &= ~TCB_REPRINT;
printleader(tcp);
if (tcp->qual_flg & UNDEFINED_SCNO)
- tprintf("<... %s resumed> ", undefined_scno_name(tcp));
+ tprintf("<... %s resumed> ", syscall_name(tcp->scno));
else
tprintf("<... %s resumed> ", tcp->s_ent->sys_name);
}