From: Roland McGrath Date: Sun, 30 Mar 2003 23:52:28 +0000 (+0000) Subject: 2003-03-30 Roland McGrath X-Git-Tag: v4.5.18~782 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e35679bbb8c840bd0b107c68cb187feeb3e3282;p=strace 2003-03-30 Roland McGrath * time.c [LINUX]: Handle new Linux 2.5 clock/timer syscalls. * linux/syscall.h, linux/syscallent.h, linux/dummy.h: Likewise. From Ulrich Drepper . --- diff --git a/linux/dummy.h b/linux/dummy.h index 7cc6985f..ba331627 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -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 diff --git a/linux/syscall.h b/linux/syscall.h index f9266ed9..df2310d9 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -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 */ diff --git a/time.c b/time.c index c9cbc8ee..12d00f24 100644 --- a/time.c +++ b/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 */