From 581f84210af35fda78e88f4226909dad0576df89 Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 2 Jun 2014 12:43:14 -0500 Subject: [PATCH] PR16716 partial fix: Fix types in syscall.epoll_{create,ctl,pwait,wait}. * tapset/linux/syscalls.stp (syscall.epoll_create): Fix types. (syscall.epoll_ctl): Ditto. (syscall.epoll_wait): Ditto. (syscall.epoll_pwait): Add convenience variables. * tapset/linux/nd_syscalls.stp: Ditto. * tapset/linux/aux_syscalls.stp (_opoll_op_str): Updated and improved. (_epoll_create1_flag_str): Ditto. * runtime/linux/compat_unistd.h: Added __NR_compat_epoll_wait. * testsuite/buildok/syscalls-detailed.stp: Add test for new epoll_pwait convenience variables. * testsuite/buildok/nd_syscalls-detailed.stp: Ditto. * testsuite/systemtap.syscall/poll.c: Add more error testing. --- runtime/linux/compat_unistd.h | 5 ++ tapset/linux/aux_syscalls.stp | 25 +++++-- tapset/linux/nd_syscalls.stp | 19 ++++- tapset/linux/syscalls.stp | 31 +++++--- testsuite/buildok/nd_syscalls-detailed.stp | 2 + testsuite/buildok/syscalls-detailed.stp | 2 + testsuite/systemtap.syscall/poll.c | 86 ++++++++++++++++++++-- 7 files changed, 141 insertions(+), 29 deletions(-) diff --git a/runtime/linux/compat_unistd.h b/runtime/linux/compat_unistd.h index f8075ba44..26f729cde 100644 --- a/runtime/linux/compat_unistd.h +++ b/runtime/linux/compat_unistd.h @@ -63,6 +63,9 @@ #ifndef __NR_ia32_dup3 #define __NR_ia32_dup3 330 #endif +#ifndef __NR_ia32_epoll_wait +#define __NR_ia32_epoll_wait 256 +#endif #ifndef __NR_ia32_faccessat #define __NR_ia32_faccessat 307 #endif @@ -118,6 +121,7 @@ #define __NR_compat_clone __NR_ia32_clone #define __NR_compat_close __NR_ia32_close #define __NR_compat_dup3 __NR_ia32_dup3 +#define __NR_compat_epoll_wait __NR_ia32_epoll_wait #define __NR_compat_faccessat __NR_ia32_faccessat #define __NR_compat_fchmodat __NR_ia32_fchmodat #define __NR_compat_fchownat __NR_ia32_fchownat @@ -149,6 +153,7 @@ #define __NR_compat_clone __NR_clone #define __NR_compat_close __NR_close #define __NR_compat_dup3 __NR_dup3 +#define __NR_compat_epoll_wait __NR_epoll_wait #define __NR_compat_faccessat __NR_faccessat #define __NR_compat_fchmodat __NR_fchmodat #define __NR_compat_fchownat __NR_fchownat diff --git a/tapset/linux/aux_syscalls.stp b/tapset/linux/aux_syscalls.stp index 91f39b94b..06b9fa599 100644 --- a/tapset/linux/aux_syscalls.stp +++ b/tapset/linux/aux_syscalls.stp @@ -2177,12 +2177,17 @@ function _sock_protocol_str:string(family:long, protocol:long) { return sprintf("%d", protocol) } -function _opoll_op_str(o) { - if(o==1) return "EPOLL_CTL_ADD" - if(o==3) return "EPOLL_CTL_MOD" - if(o==2) return "EPOLL_CTL_DEL" - return sprintf("UNKNOWN VALUE: %d", o) -} +function _opoll_op_str:string(o:long) +%{ /* pure */ + static const _stp_val_array const opoll_op_list[] = { + V(EPOLL_CTL_ADD), + V(EPOLL_CTL_MOD), + V(EPOLL_CTL_DEL), + {0, NULL} + }; + _stp_lookup_str(opoll_op_list, (unsigned int)STAP_ARG_o, + STAP_RETVALUE, MAXSTRINGLEN); +%} function _epoll_events_str(e) { if(e==1) return "EPOLLIN" @@ -2468,10 +2473,14 @@ function _at_flag_str:string(f:long) %} function _epoll_create1_flag_str:string(f:long) %{ /* pure */ + static const _stp_val_array const epoll_create1_flags_list[] = { #ifdef EPOLL_CLOEXEC - if (STAP_ARG_f == EPOLL_CLOEXEC) - strlcpy (STAP_RETVALUE, "EPOLL_CLOEXEC", MAXSTRINGLEN); + V(EPOLL_CLOEXEC), #endif + {0, NULL} + }; + _stp_lookup_or_str(epoll_create1_flags_list, (unsigned int)STAP_ARG_f, + STAP_RETVALUE, MAXSTRINGLEN); %} %{ diff --git a/tapset/linux/nd_syscalls.stp b/tapset/linux/nd_syscalls.stp index 5697080c5..23d3a83cc 100644 --- a/tapset/linux/nd_syscalls.stp +++ b/tapset/linux/nd_syscalls.stp @@ -943,11 +943,18 @@ probe nd_syscall.epoll_pwait = kprobe.function("compat_sys_epoll_pwait") ?, { name = "epoll_pwait" asmlinkage() - argstr = sprintf("%d, %p, %d, %d, %p, %d", - int_arg(1), pointer_arg(2), int_arg(3), int_arg(4), pointer_arg(5), ulong_arg(6)) + epfd = int_arg(1) + events_uaddr = pointer_arg(2) + maxevents = int_arg(3) + timeout = int_arg(4) + sigmask_uaddr = pointer_arg(5) + sigsetsize = ulong_arg(6) + argstr = sprintf("%d, %p, %d, %d, %p, %d", epfd, events_uaddr, + maxevents, timeout, sigmask_uaddr, sigsetsize) } -probe nd_syscall.epoll_pwait.return = kprobe.function("compat_sys_epoll_pwait").return ?, - kprobe.function("sys_epoll_pwait").return ? +probe nd_syscall.epoll_pwait.return = + kprobe.function("compat_sys_epoll_pwait").return ?, + kprobe.function("sys_epoll_pwait").return ? { name = "epoll_pwait" retstr = returnstr(1) @@ -964,6 +971,8 @@ probe nd_syscall.epoll_pwait.return = kprobe.function("compat_sys_epoll_pwait"). probe nd_syscall.epoll_wait = kprobe.function("compat_sys_epoll_wait") ?, kprobe.function("sys_epoll_wait") ? { + @__syscall_compat_gate(%{ __NR_epoll_wait %}, + %{ __NR_compat_epoll_wait %}) name = "epoll_wait" asmlinkage() epfd = int_arg(1) @@ -975,6 +984,8 @@ probe nd_syscall.epoll_wait = kprobe.function("compat_sys_epoll_wait") ?, probe nd_syscall.epoll_wait.return = kprobe.function("compat_sys_epoll_wait").return ?, kprobe.function("sys_epoll_wait").return ? { + @__syscall_compat_gate(%{ __NR_epoll_wait %}, + %{ __NR_compat_epoll_wait %}) name = "epoll_wait" retstr = returnstr(1) } diff --git a/tapset/linux/syscalls.stp b/tapset/linux/syscalls.stp index 095e8018c..63325001e 100644 --- a/tapset/linux/syscalls.stp +++ b/tapset/linux/syscalls.stp @@ -793,7 +793,7 @@ probe syscall.epoll_create = kernel.function("sys_epoll_create1").call !, kernel.function("sys_epoll_create").call ? { size = @choose_defined($size, 0); - flags = @choose_defined($flags, 0); + flags = __int32(@choose_defined($flags, 0)); if (flags == 0) { name = "epoll_create"; argstr = sprint(size); @@ -805,7 +805,7 @@ probe syscall.epoll_create = kernel.function("sys_epoll_create1").call !, probe syscall.epoll_create.return = kernel.function("sys_epoll_create1").return !, kernel.function("sys_epoll_create").return ? { - flags = @choose_defined($flags, 0); + flags = __int32(@choose_defined($flags, 0)); name = (flags == 0) ? "epoll_create" : "epoll_create1"; retstr = return_str(1, $return) } @@ -820,12 +820,12 @@ probe syscall.epoll_ctl = kernel.function("compat_sys_epoll_ctl").call ?, kernel.function("sys_epoll_ctl").call ? { name = "epoll_ctl" - epfd = $epfd + epfd = __int32($epfd) op = $op op_str = _opoll_op_str($op) - fd = $fd + fd = __int32($fd) event_uaddr = $event - argstr = sprintf("%d, %s, %d, %p", $epfd, _opoll_op_str($op), $fd, $event) + argstr = sprintf("%d, %s, %d, %p", epfd, _opoll_op_str($op), fd, $event) } probe syscall.epoll_ctl.return = kernel.function("compat_sys_epoll_ctl").return ?, kernel.function("sys_epoll_ctl").return ? @@ -849,8 +849,15 @@ probe syscall.epoll_pwait = kernel.function("compat_sys_epoll_pwait").call ?, kernel.function("sys_epoll_pwait").call ? { name = "epoll_pwait" + epfd = __int32($epfd) + events_uaddr = $events + maxevents = __int32($maxevents) + timeout = __int32($timeout) + sigmask_uaddr = $sigmask + sigsetsize = $sigsetsize argstr = sprintf("%d, %p, %d, %d, %p, %d", - $epfd, $events, $maxevents, $timeout, $sigmask, $sigsetsize) + __int32($epfd), $events, __int32($maxevents), + __int32($timeout), $sigmask, $sigsetsize) } probe syscall.epoll_pwait.return = kernel.function("compat_sys_epoll_pwait").return ?, kernel.function("sys_epoll_pwait").return ? @@ -870,16 +877,20 @@ probe syscall.epoll_pwait.return = kernel.function("compat_sys_epoll_pwait").ret probe syscall.epoll_wait = kernel.function("compat_sys_epoll_wait").call ?, kernel.function("sys_epoll_wait").call ? { + @__syscall_compat_gate(%{ __NR_epoll_wait %}, + %{ __NR_compat_epoll_wait %}) name = "epoll_wait" - epfd = $epfd + epfd = __int32($epfd) events_uaddr = $events - maxevents = $maxevents - timeout = $timeout - argstr = sprintf("%d, %p, %d, %d", $epfd, $events, $maxevents, $timeout) + maxevents = __int32($maxevents) + timeout = __int32($timeout) + argstr = sprintf("%d, %p, %d, %d", epfd, $events, maxevents, timeout) } probe syscall.epoll_wait.return = kernel.function("compat_sys_epoll_wait").return ?, kernel.function("sys_epoll_wait").return ? { + @__syscall_compat_gate(%{ __NR_epoll_wait %}, + %{ __NR_compat_epoll_wait %}) name = "epoll_wait" retstr = return_str(1, $return) } diff --git a/testsuite/buildok/nd_syscalls-detailed.stp b/testsuite/buildok/nd_syscalls-detailed.stp index 0a28eb300..5c35663b7 100755 --- a/testsuite/buildok/nd_syscalls-detailed.stp +++ b/testsuite/buildok/nd_syscalls-detailed.stp @@ -304,6 +304,8 @@ probe nd_syscall.epoll_ctl.return ? probe nd_syscall.epoll_pwait ? { printf("%s, %s\n", name, argstr) + printf("%d, %p, %d, %d\n", epfd, events_uaddr, maxevents, timeout) + printf("%p, %d\n", sigmask_uaddr, sigsetsize) } probe nd_syscall.epoll_pwait.return ? { diff --git a/testsuite/buildok/syscalls-detailed.stp b/testsuite/buildok/syscalls-detailed.stp index a35fe1ebd..fb5e5e164 100755 --- a/testsuite/buildok/syscalls-detailed.stp +++ b/testsuite/buildok/syscalls-detailed.stp @@ -304,6 +304,8 @@ probe syscall.epoll_ctl.return ? probe syscall.epoll_pwait ? { printf("%s, %s\n", name, argstr) + printf("%d, %p, %d, %d\n", epfd, events_uaddr, maxevents, timeout) + printf("%p, %d\n", sigmask_uaddr, sigsetsize) } probe syscall.epoll_pwait.return ? { diff --git a/testsuite/systemtap.syscall/poll.c b/testsuite/systemtap.syscall/poll.c index c34277b8c..02fa11d45 100644 --- a/testsuite/systemtap.syscall/poll.c +++ b/testsuite/systemtap.syscall/poll.c @@ -1,5 +1,6 @@ -/* COVERAGE: epoll_create epoll_ctl epoll_wait poll ppoll */ +/* COVERAGE: epoll_create epoll_ctl epoll_wait epoll_pwait poll ppoll */ #define _GNU_SOURCE +#include #include #include #include @@ -7,7 +8,7 @@ int main() { - struct epoll_event ev; + struct epoll_event ev, events[17]; struct pollfd pfd = {7, 0x23, 0}; int fd; struct timespec tim = {.tv_sec=0, .tv_nsec=200000000}; @@ -18,18 +19,89 @@ int main() #ifdef EPOLL_CLOEXEC fd = epoll_create1(EPOLL_CLOEXEC); - //staptest// epoll_create1 (EPOLL_CLOEXEC) + //staptest// epoll_create1 (EPOLL_CLOEXEC) = NNNN + + epoll_create1(-1); + //staptest// epoll_create1 (EPOLL_CLOEXEC|0xfff7ffff) = -NNNN (EINVAL) #else fd = epoll_create(32); - //staptest// epoll_create (32) + //staptest// epoll_create (32) = NNNN + + epoll_create(-1); + //staptest// epoll_create (-1) = -NNNN (EINVAL) #endif epoll_ctl(fd, EPOLL_CTL_ADD, 13, &ev); - //staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, 13, XXXX) + //staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, 13, XXXX) = -NNNN (EBADF) + + epoll_ctl(-1, EPOLL_CTL_ADD, 13, &ev); + //staptest// epoll_ctl (-1, EPOLL_CTL_ADD, 13, XXXX) = -NNNN (EBADF) + + epoll_ctl(fd, -1, 13, &ev); + //staptest// epoll_ctl (NNNN, 0xffffffff, 13, XXXX) = -NNNN (EBADF) + + epoll_ctl(fd, EPOLL_CTL_ADD, -1, &ev); + //staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, -1, XXXX) = -NNNN (EBADF) + + epoll_ctl(fd, EPOLL_CTL_ADD, 13, (struct epoll_event *)-1); +#ifdef __s390__ + //staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, 13, 0x[7]?[f]+) = -NNNN (EFAULT) +#else + //staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, 13, 0x[f]+) = -NNNN (EFAULT) +#endif + + epoll_wait(fd, events, 17, 0); + //staptest// epoll_wait (NNNN, XXXX, 17, 0) = 0 + + epoll_wait(-1, events, 17, 0); + //staptest// epoll_wait (-1, XXXX, 17, 0) = -NNNN (EBADF) + + epoll_wait(fd, (struct epoll_event *)-1, 17, 0); +#ifdef __s390__ + //staptest// epoll_wait (NNNN, 0x[7]?[f]+, 17, 0) = +#else + //staptest// epoll_wait (NNNN, 0x[f]+, 17, 0) = +#endif + + epoll_wait(fd, events, -1, 0); + //staptest// epoll_wait (NNNN, XXXX, -1, 0) = -NNNN (EINVAL) + + epoll_wait(-1, events, 17, -1); + //staptest// epoll_wait (-1, XXXX, 17, -1) = -NNNN (EBADF) + +#ifdef SYS_epoll_pwait + epoll_pwait(fd, events, 17, 0, NULL); + //staptest// epoll_pwait (NNNN, XXXX, 17, 0, 0x0, NNNN) = 0 + + epoll_pwait(fd, events, 17, 0, &sigs); + //staptest// epoll_pwait (NNNN, XXXX, 17, 0, XXXX, NNNN) = 0 + + epoll_pwait(-1, events, 17, 0, &sigs); + //staptest// epoll_pwait (-1, XXXX, 17, 0, XXXX, NNNN) = -NNNN (EBADF) + + epoll_pwait(fd, (struct epoll_event *)-1, 17, 0, &sigs); +#ifdef __s390__ + //staptest// epoll_pwait (NNNN, 0x[7]?[f]+, 17, 0, XXXX, NNNN) = +#else + //staptest// epoll_pwait (NNNN, 0x[f]+, 17, 0, XXXX, NNNN) = +#endif + + epoll_pwait(fd, events, -1, 0, &sigs); + //staptest// epoll_pwait (NNNN, XXXX, -1, 0, XXXX, NNNN) = -NNNN (EINVAL) + + epoll_pwait(-1, events, 17, -1, &sigs); + //staptest// epoll_pwait (-1, XXXX, 17, -1, XXXX, NNNN) = -NNNN (EBADF) + + epoll_pwait(fd, events, 17, 0, (sigset_t *)-1); +#ifdef __s390__ + //staptest// epoll_pwait (NNNN, XXXX, 17, 0, 0x[7]?[f]+, NNNN) = -NNNN (EFAULT) +#else + //staptest// epoll_pwait (NNNN, XXXX, 17, 0, 0x[f]+, NNNN) = -NNNN (EFAULT) +#endif +#endif - epoll_wait(fd, &ev, 17,0); - //staptest// epoll_wait (NNNN, XXXX, 17, 0) close(fd); + //staptest// close (NNNN) = 0 poll(&pfd, 1, 0); //staptest// poll (XXXX, 1, 0) -- 2.43.5