2003-03-30 Roland McGrath <roland@redhat.com>
* time.c [LINUX]: Handle new Linux 2.5 clock/timer syscalls. * linux/syscall.h, linux/syscallent.h, linux/dummy.h: Likewise. From Ulrich Drepper <drepper@redhat.com>.
This commit is contained in:
parent
e9a188d51e
commit
1e35679bbb
@ -68,6 +68,7 @@
|
||||
#define sys_fdatasync sys_close
|
||||
#define sys_mlock sys_munmap
|
||||
#define sys_munlock sys_munmap
|
||||
#define sys_clock_getres sys_clock_gettime
|
||||
|
||||
/* printargs does the right thing */
|
||||
#define sys_setup printargs
|
||||
@ -85,6 +86,8 @@
|
||||
#define sys_idle printargs
|
||||
#define sys_getpgid printargs
|
||||
#define sys_munlockall printargs
|
||||
#define sys_timer_getoverrun printargs
|
||||
#define sys_timer_delete printargs
|
||||
|
||||
/* subcall entry points */
|
||||
#define sys_socketcall printargs
|
||||
|
@ -89,6 +89,9 @@ int sys_setxattr(), sys_fsetxattr(), sys_getxattr(), sys_fgetxattr();
|
||||
int sys_listxattr(), sys_flistxattr(), sys_removexattr(), sys_fremovexattr();
|
||||
int sys_sched_setaffinity(), sys_sched_getaffinity(), sys_futex();
|
||||
int sys_set_thread_area(), sys_get_thread_area(), sys_remap_file_pages();
|
||||
int sys_timer_create(), sys_timer_delete(), sys_timer_getoverrun();
|
||||
int sys_timer_gettime(), sys_timer_settime(), sys_clock_settime();
|
||||
int sys_clock_gettime(), sys_clock_getres(), sys_clock_nanosleep();
|
||||
|
||||
|
||||
/* sys_socketcall subcalls */
|
||||
|
139
time.c
139
time.c
@ -358,5 +358,144 @@ struct tcb *tcp;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xlat clockflags[] = {
|
||||
{ TIMER_ABSTIME, "TIMER_ABSTIME" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
int
|
||||
sys_clock_settime(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
printtv(tcp, tcp->u_arg[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sys_clock_gettime(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
} else {
|
||||
if (syserror(tcp))
|
||||
tprintf("%#lx", tcp->u_arg[1]);
|
||||
else
|
||||
printtv(tcp, tcp->u_arg[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sys_clock_nanosleep(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
printflags(clockflags, tcp->u_arg[1]);
|
||||
tprintf(", ");
|
||||
printtv(tcp, tcp->u_arg[2]);
|
||||
tprintf(", ");
|
||||
} else {
|
||||
if (syserror(tcp))
|
||||
tprintf("%#lx", tcp->u_arg[3]);
|
||||
else
|
||||
printtv(tcp, tcp->u_arg[3]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef SIGEV_THREAD_ID
|
||||
# define SIGEV_THREAD_ID 4
|
||||
#endif
|
||||
static struct xlat sigev_value[] = {
|
||||
{ SIGEV_SIGNAL+1, "SIGEV_SIGNAL" },
|
||||
{ SIGEV_NONE+1, "SIGEV_NONE" },
|
||||
{ SIGEV_THREAD+1, "SIGEV_THREAD" },
|
||||
{ SIGEV_THREAD_ID+1, "SIGEV_THREAD_ID" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
void
|
||||
printsigevent(tcp, arg)
|
||||
struct tcb *tcp;
|
||||
long arg;
|
||||
{
|
||||
struct sigevent sev;
|
||||
if (umove (tcp, arg, &sev) < 0)
|
||||
tprintf("{...}");
|
||||
else {
|
||||
tprintf("{%p, %u, ", sev.sigev_value.sival_ptr,
|
||||
sev.sigev_signo);
|
||||
printxval(sigev_value, sev.sigev_notify+1, "SIGEV_???");
|
||||
tprintf(", ");
|
||||
if (sev.sigev_notify == SIGEV_THREAD_ID)
|
||||
/* _pad[0] is the _tid field which might not be
|
||||
present in the userlevel definition of the
|
||||
struct. */
|
||||
tprintf("{%d}", sev._sigev_un._pad[0]);
|
||||
else
|
||||
tprintf("{...}");
|
||||
tprintf("}");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sys_timer_create(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
printsigevent(tcp, tcp->u_arg[1]);
|
||||
tprintf(", ");
|
||||
} else {
|
||||
if (syserror(tcp))
|
||||
tprintf("%#lx", tcp->u_arg[2]);
|
||||
else {
|
||||
void *p;
|
||||
umove(tcp, tcp->u_arg[2], &p);
|
||||
tprintf("{%p}", p);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sys_timer_settime(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
printflags(clockflags, tcp->u_arg[1]);
|
||||
tprintf(", ");
|
||||
printitv(tcp, tcp->u_arg[2]);
|
||||
tprintf(", ");
|
||||
} else {
|
||||
if (syserror(tcp))
|
||||
tprintf("%#lx", tcp->u_arg[3]);
|
||||
else
|
||||
printitv(tcp, tcp->u_arg[3]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sys_timer_gettime(tcp)
|
||||
struct tcb *tcp;
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%#lx, ", tcp->u_arg[0]);
|
||||
} else {
|
||||
if (syserror(tcp))
|
||||
tprintf("%#lx", tcp->u_arg[1]);
|
||||
else
|
||||
printitv(tcp, tcp->u_arg[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* LINUX */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user