@__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 *,
@__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)
@__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 *,
@__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)
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)
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)
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)
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)
--- /dev/null
+/* COVERAGE: get_robust_list set_robust_list */
+
+#define _GNU_SOURCE
+#include <linux/futex.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+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;
+}