From: Martin Cermak Date: Tue, 12 May 2015 05:23:49 +0000 (+0200) Subject: PR18395: New tapset handling {get,set}_robust_list syscalls. X-Git-Tag: release-2.8~69 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=605d156182d0dad992064140e9ae8e218afc24dc;p=systemtap.git PR18395: New tapset handling {get,set}_robust_list syscalls. * tapset/linux/nd_syscalls.stp: New probe nd_syscall.get_robust_list * tapset/linux/nd_syscalls2.stp: New probe nd_syscall.set_robust_list * tapset/linux/syscalls.stp: New probe syscall.get_robust_list * tapset/linux/syscalls2.stp: New probe syscall.set_robust_list * testsuite/buildok/nd_syscalls-detailed.stp: New subtest * testsuite/buildok/nd_syscalls2-detailed.stp: Ditto * testsuite/buildok/syscalls-detailed.stp: Ditto * testsuite/buildok/syscalls2-detailed.stp: Ditto * testsuite/systemtap.syscall/robust_list.c: New testcase --- diff --git a/tapset/linux/nd_syscalls.stp b/tapset/linux/nd_syscalls.stp index c7ad4647e..1a5e48691 100644 --- a/tapset/linux/nd_syscalls.stp +++ b/tapset/linux/nd_syscalls.stp @@ -2469,6 +2469,39 @@ probe __nd_syscall.getrlimit.return = kprobe.function("sys_getrlimit").return @__syscall_gate_compat_simple } +# get_robust_list ____________________________________________ +# SYSCALL_DEFINE3(get_robust_list, int, pid, +# struct robust_list_head __user * __user *, head_ptr, +# size_t __user *, len_ptr) +# COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, +# compat_uptr_t __user *, head_ptr, +# compat_size_t __user *, len_ptr) +probe nd_syscall.get_robust_list = __nd_syscall.get_robust_list ?, + kprobe.function("compat_sys_get_robust_list") ? +{ + name = "get_robust_list" + asmlinkage() + pid = int_arg(1) + list_head_uaddr = pointer_arg(2) + len_uaddr = pointer_arg(3) + argstr = sprintf("%d, %p, %p", pid, list_head_uaddr, len_uaddr) + +} +probe __nd_syscall.get_robust_list = kprobe.function("sys_get_robust_list") +{ + @__syscall_gate_compat_simple +} +probe nd_syscall.get_robust_list.return = __nd_syscall.get_robust_list.return ?, + kprobe.function("compat_sys_get_robust_list").return ? +{ + name = "get_robust_list" + retstr = returnstr(1) +} +probe __nd_syscall.get_robust_list.return = kprobe.function("sys_get_robust_list").return +{ + @__syscall_gate_compat_simple +} + # getrusage __________________________________________________ # long sys_getrusage(int who, struct rusage __user *ru) # COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, diff --git a/tapset/linux/nd_syscalls2.stp b/tapset/linux/nd_syscalls2.stp index 71e90f59f..adc8ba5e7 100644 --- a/tapset/linux/nd_syscalls2.stp +++ b/tapset/linux/nd_syscalls2.stp @@ -3177,6 +3177,39 @@ probe __nd_syscall.setrlimit.return = kprobe.function("sys_setrlimit").return @__syscall_gate(%{ __NR_setrlimit %}) } +# set_robust_list ____________________________________________ +# SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head, +# size_t, len) +# COMPAT_SYSCALL_DEFINE2(set_robust_list, +# struct compat_robust_list_head __user *, head, +# compat_size_t, len) +probe nd_syscall.set_robust_list = + __nd_syscall.set_robust_list ?, + kprobe.function("compat_sys_set_robust_list") ? +{ + name = "set_robust_list" + asmlinkage() + list_head_uaddr = pointer_arg(1) + len = ulong_arg(2) + argstr = sprintf("%p, %u", list_head_uaddr, len) +} +probe __nd_syscall.set_robust_list = kprobe.function("sys_set_robust_list") +{ + @__syscall_gate_compat_simple +} +probe nd_syscall.set_robust_list.return = + __nd_syscall.set_robust_list.return ?, + kprobe.function("compat_sys_set_robust_list").return ? +{ + name = "set_robust_list" + retstr = returnstr(1) +} +probe __nd_syscall.set_robust_list.return = + kprobe.function("sys_set_robust_list").return +{ + @__syscall_gate_compat_simple +} + # setsid _____________________________________________________ # # long sys_setsid(void) diff --git a/tapset/linux/syscalls.stp b/tapset/linux/syscalls.stp index 712a17e7c..1c48f6728 100644 --- a/tapset/linux/syscalls.stp +++ b/tapset/linux/syscalls.stp @@ -2302,6 +2302,38 @@ probe __syscall.getrlimit.return = kernel.function("sys_getrlimit").return @__syscall_gate_compat_simple } +# get_robust_list ____________________________________________ +# SYSCALL_DEFINE3(get_robust_list, int, pid, +# struct robust_list_head __user * __user *, head_ptr, +# size_t __user *, len_ptr) +# COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, +# compat_uptr_t __user *, head_ptr, +# compat_size_t __user *, len_ptr) +probe syscall.get_robust_list = __syscall.get_robust_list ?, + kernel.function("compat_sys_get_robust_list") ? +{ + name = "get_robust_list" + pid = __int32($pid) + list_head_uaddr = @__pointer($head_ptr) + len_uaddr = @__pointer($len_ptr) + argstr = sprintf("%d, %p, %p", pid, list_head_uaddr, len_uaddr) +} +probe __syscall.get_robust_list = kernel.function("sys_get_robust_list") +{ + @__syscall_gate_compat_simple +} +probe syscall.get_robust_list.return = __syscall.get_robust_list.return ?, + kernel.function("compat_sys_get_robust_list").return ? +{ + name = "get_robust_list" + retstr = return_str(1, $return) +} +probe __syscall.get_robust_list.return = + kernel.function("sys_get_robust_list").return +{ + @__syscall_gate_compat_simple +} + # getrusage __________________________________________________ # long sys_getrusage(int who, struct rusage __user *ru) # COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, diff --git a/tapset/linux/syscalls2.stp b/tapset/linux/syscalls2.stp index 1f0f99f78..fa9135a5f 100644 --- a/tapset/linux/syscalls2.stp +++ b/tapset/linux/syscalls2.stp @@ -3059,6 +3059,41 @@ probe __syscall.setrlimit.return = kernel.function("sys_setrlimit").return @__syscall_gate(%{ __NR_setrlimit %}) } +# set_robust_list ____________________________________________ +# SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head, +# size_t, len) +# COMPAT_SYSCALL_DEFINE2(set_robust_list, +# struct compat_robust_list_head __user *, head, +# compat_size_t, len) +probe syscall.set_robust_list = __syscall.set_robust_list ?, + __syscall.compat_set_robust_list ? +{ + name = "set_robust_list" + list_head_uaddr = @__pointer($head) + argstr = sprintf("%p, %u", list_head_uaddr, len) +} +probe __syscall.set_robust_list = kernel.function("sys_set_robust_list") +{ + @__syscall_gate_compat_simple + len = __ulong($len) +} +probe __syscall.compat_set_robust_list = + kernel.function("compat_sys_set_robust_list") +{ + len = __uint32($len) +} +probe syscall.set_robust_list.return = __syscall.set_robust_list.return ?, + kernel.function("compat_sys_set_robust_list").return ? +{ + name = "set_robust_list" + retstr = return_str(1, $return) +} +probe __syscall.set_robust_list.return = + kernel.function("sys_set_robust_list").return +{ + @__syscall_gate_compat_simple +} + # setsid _____________________________________________________ # # long sys_setsid(void) diff --git a/testsuite/buildok/nd_syscalls-detailed.stp b/testsuite/buildok/nd_syscalls-detailed.stp index 487d83c21..0b1c334e7 100755 --- a/testsuite/buildok/nd_syscalls-detailed.stp +++ b/testsuite/buildok/nd_syscalls-detailed.stp @@ -833,6 +833,16 @@ probe nd_syscall.getrlimit.return printf("%s, %s\n", name, retstr) } +probe nd_syscall.get_robust_list +{ + printf("%s, %s\n", name, argstr) + printf("%d, %p, %p", pid, list_head_uaddr, len_uaddr) +} +probe nd_syscall.get_robust_list.return +{ + printf("%s, %s\n", name, retstr) +} + probe nd_syscall.getrusage { printf("%s, %s\n", name, argstr) diff --git a/testsuite/buildok/nd_syscalls2-detailed.stp b/testsuite/buildok/nd_syscalls2-detailed.stp index 3f94ea8cd..4342dcd34 100755 --- a/testsuite/buildok/nd_syscalls2-detailed.stp +++ b/testsuite/buildok/nd_syscalls2-detailed.stp @@ -867,6 +867,16 @@ probe nd_syscall.setrlimit.return printf("%s %s\n", name, retstr) } +probe nd_syscall.set_robust_list +{ + printf("%s(%s)\n", name, argstr) + printf("%p, %u", list_head_uaddr, len) +} +probe nd_syscall.set_robust_list.return +{ + printf("%s %s\n", name, retstr) +} + probe nd_syscall.setsid { printf("%s(%s)\n", name, argstr) diff --git a/testsuite/buildok/syscalls-detailed.stp b/testsuite/buildok/syscalls-detailed.stp index d1da25b6c..28e8b6823 100755 --- a/testsuite/buildok/syscalls-detailed.stp +++ b/testsuite/buildok/syscalls-detailed.stp @@ -831,6 +831,16 @@ probe syscall.getrlimit.return printf("%s, %s\n", name, retstr) } +probe syscall.get_robust_list +{ + printf("%s, %s\n", name, argstr) + printf("%d, %p, %p", pid, list_head_uaddr, len_uaddr) +} +probe syscall.get_robust_list.return +{ + printf("%s, %s\n", name, retstr) +} + probe syscall.getrusage { printf("%s, %s\n", name, argstr) diff --git a/testsuite/buildok/syscalls2-detailed.stp b/testsuite/buildok/syscalls2-detailed.stp index db7083657..4224b966b 100755 --- a/testsuite/buildok/syscalls2-detailed.stp +++ b/testsuite/buildok/syscalls2-detailed.stp @@ -863,6 +863,16 @@ probe syscall.setrlimit.return printf("%s %s\n", name, retstr) } +probe syscall.set_robust_list +{ + printf("%s(%s)\n", name, argstr) + printf("%p, %u", list_head_uaddr, len) +} +probe syscall.set_robust_list.return +{ + printf("%s %s\n", name, retstr) +} + probe syscall.setsid { printf("%s(%s)\n", name, argstr) diff --git a/testsuite/systemtap.syscall/robust_list.c b/testsuite/systemtap.syscall/robust_list.c new file mode 100644 index 000000000..2ae6ce55b --- /dev/null +++ b/testsuite/systemtap.syscall/robust_list.c @@ -0,0 +1,66 @@ +/* COVERAGE: get_robust_list set_robust_list */ + +#define _GNU_SOURCE +#include +#include +#include + +static inline long +__get_robust_list(int pid, struct robust_list_head **lhp, size_t *len) +{ + return syscall(__NR_get_robust_list, pid, lhp, len); +} + +static inline long +__set_robust_list(struct robust_list_head *lhp, size_t len) +{ + return syscall(__NR_set_robust_list, lhp, len); +} + +int main() +{ + int pid; + struct robust_list_head *lhp; + size_t len; + + __get_robust_list(getpid(), &lhp, &len); + //staptest// get_robust_list (NNNN, XXXX, XXXX) = 0 + + __set_robust_list(lhp, len); + //staptest// set_robust_list (XXXX, NNNN) = 0 + + // Limit testing + + __get_robust_list(-1, &lhp, &len); + //staptest// get_robust_list (-1, XXXX, XXXX) = -NNNN + + __get_robust_list(0, (struct robust_list_head **)-1, &len); +#ifdef __s390__ + //staptest// get_robust_list (0, 0x[7]?[f]+, XXXX) = -NNNN +#else + //staptest// get_robust_list (0, 0x[f]+, XXXX) = -NNNN +#endif + + __get_robust_list(0, &lhp, (size_t *)-1); +#ifdef __s390__ + //staptest// get_robust_list (0, XXXX, 0x[7]?[f]+) = -NNNN +#else + //staptest// get_robust_list (0, XXXX, 0x[f]+) = -NNNN +#endif + + __set_robust_list((struct robust_list_head *)-1, 0); +#ifdef __s390__ + //staptest// set_robust_list (0x[7]?[f]+, 0) = -NNNN +#else + //staptest// set_robust_list (0x[f]+, 0) = -NNNN +#endif + + __set_robust_list(0, -1); +#if __WORDSIZE == 64 + //staptest// set_robust_list (0x0, 18446744073709551615) = -NNNN +#else + //staptest// set_robust_list (0x0, 4294967295) = -NNNN +#endif + + return 0; +}