Implement sys_rt_tgsigqueueinfo syscall decoder

* linux/dummy.h (sys_rt_tgsigqueueinfo): Remove.
* linux/syscall.h (sys_rt_tgsigqueueinfo): New prototype.
* signal.c (print_sigqueueinfo): New function, based on
sys_rt_sigqueueinfo.
(sys_rt_sigqueueinfo): Use print_sigqueueinfo.
(sys_rt_tgsigqueueinfo): New function.
This commit is contained in:
2012-03-13 15:51:13 +00:00
parent ee3c22ce55
commit 297632be5c
3 changed files with 25 additions and 8 deletions

View File

@ -44,7 +44,6 @@
#define sys_perf_event_open printargs
#define sys_prlimit64 printargs
#define sys_request_key printargs
#define sys_rt_tgsigqueueinfo printargs
#define sys_sync_file_range printargs
#define sys_sysfs printargs
#define sys_vm86old printargs

View File

@ -204,6 +204,7 @@ int sys_rt_sigprocmask();
int sys_rt_sigqueueinfo();
int sys_rt_sigsuspend();
int sys_rt_sigtimedwait();
int sys_rt_tgsigqueueinfo();
int sys_sched_get_priority_min();
int sys_sched_getaffinity();
int sys_sched_getparam();

View File

@ -1437,18 +1437,35 @@ sys_rt_sigsuspend(struct tcb *tcp)
return 0;
}
static void
print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo)
{
siginfo_t si;
printsignal(sig);
tprints(", ");
if (umove(tcp, uinfo, &si) < 0)
tprintf("%#lx", uinfo);
else
printsiginfo(&si, verbose(tcp));
}
int
sys_rt_sigqueueinfo(struct tcb *tcp)
{
if (entering(tcp)) {
siginfo_t si;
tprintf("%lu, ", tcp->u_arg[0]);
printsignal(tcp->u_arg[1]);
tprints(", ");
if (umove(tcp, tcp->u_arg[2], &si) < 0)
tprintf("%#lx", tcp->u_arg[2]);
else
printsiginfo(&si, verbose(tcp));
print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
}
return 0;
}
int
sys_rt_tgsigqueueinfo(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
}
return 0;
}