* runtime/linux/compat_unistd.h: Define __NR_move_pages for rhel5 powerpc platform
* tapset/linux/nd_syscalls.stp: Fix types and nesting for 'syscall.{mbind,move_pages,migrate_pages}'.
* tapset/linux/syscalls.stp: Fix types and nesting for 'syscall.{mbind,move_pages,migrate_pages}'.
* testsuite/buildok/nd_syscalls-detailed.stp: Test all convenience variables.
* testsuite/buildok/syscalls-detailed.stp: Test all convenience variables.
* testsuite/systemtap.syscall/numa.c: New testcase.
#ifndef __NR_mmap2
#define __NR_mmap2 (__NR_syscall_max + 1)
#endif
+#ifndef __NR_move_pages
+#define __NR_move_pages (__NR_syscall_max + 1)
+#endif
#ifndef __NR_msgctl
#define __NR_msgctl (__NR_syscall_max + 1)
#endif
# compat_ulong_t maxnode,
# compat_ulong_t flags)
#
-probe nd_syscall.mbind = kprobe.function("compat_sys_mbind") ?,
- kprobe.function("sys_mbind") ?
+probe nd_syscall.mbind = __nd_syscall.mbind ?,
+ kprobe.function("compat_sys_mbind") ?
{
name = "mbind"
asmlinkage()
- start = ulong_arg(1)
- len = long_arg(2)
- mode = ulong_arg(3)
+ start = pointer_arg(1)
+ len = ulong_arg(2)
+ mode = int_arg(3)
+ mode_str = _mempolicy_mode_str(mode)
nmask_uaddr = pointer_arg(4)
maxnode = ulong_arg(5)
flags = uint_arg(6)
- argstr = sprintf("%d, %d, %d, %p, %d, 0x%x", start, len, mode,
- nmask_uaddr, maxnode, flags)
+ flags_str = _mempolicy_flags_str(flags)
+ argstr = sprintf("%p, %u, %s, %p, %u, %s", start, len,
+ mode_str, nmask_uaddr, maxnode, flags_str)
+}
+probe __nd_syscall.mbind = kprobe.function("sys_mbind")
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
}
-probe nd_syscall.mbind.return = kprobe.function("compat_sys_mbind").return ?,
- kprobe.function("sys_mbind").return ?
+probe nd_syscall.mbind.return = __nd_syscall.mbind.return ?,
+ kprobe.function("compat_sys_mbind").return ?
{
name = "mbind"
retstr = returnstr(1)
}
+probe __nd_syscall.mbind.return = kprobe.function("sys_mbind").return
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
# memfd_create _____________________________________________________
# long sys_memfd_create (const char __user* uname, unsigned int flags)
# long sys_migrate_pages(pid_t pid, unsigned long maxnode,
# const unsigned long __user *old_nodes,
# const unsigned long __user *new_nodes)
-probe nd_syscall.migrate_pages = kprobe.function("sys_migrate_pages") ?
+probe nd_syscall.migrate_pages = __nd_syscall.migrate_pages ?,
+ kprobe.function("compat_sys_migrate_pages") ?
{
name = "migrate_pages"
asmlinkage()
- argstr = sprintf("%d, %d, %p, %p", int_arg(1), ulong_arg(2), pointer_arg(3), pointer_arg(4))
+ pid = int_arg(1)
+ maxnode = ulong_arg(2)
+ old_nodes = pointer_arg(3)
+ new_nodes = pointer_arg(4)
+ argstr = sprintf("%d, %u, %p, %p", pid, maxnode, old_nodes, new_nodes)
}
-probe nd_syscall.migrate_pages.return = kprobe.function("sys_migrate_pages").return ?
+probe __nd_syscall.migrate_pages = kprobe.function("sys_migrate_pages")
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
+probe nd_syscall.migrate_pages.return = __nd_syscall.migrate_pages.return ?,
+ kprobe.function("compat_sys_migrate_pages").return ?
{
name = "migrate_pages"
retstr = returnstr(1)
}
+probe __nd_syscall.migrate_pages.return = kprobe.function("sys_migrate_pages").return
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
# mincore ____________________________________________________
# long sys_mincore(unsigned long start, size_t len, unsigned char __user * vec)
# int __user *status,
# int flags)
#
-probe nd_syscall.move_pages = kprobe.function("compat_sys_move_pages") ?,
- kprobe.function("sys_move_pages") ?
+probe nd_syscall.move_pages = __nd_syscall.move_pages ?,
+ kprobe.function("compat_sys_move_pages") ?
{
name = "move_pages"
asmlinkage()
- argstr = sprintf("%d, %d, %p, %p, 0x%x", int_arg(1), ulong_arg(2), pointer_arg(4), pointer_arg(5), int_arg(6))
+ pid = int_arg(1)
+ nr_pages = ulong_arg(2)
+ pages = pointer_arg(3)
+ nodes = pointer_arg(4)
+ status = pointer_arg(5)
+ flags = int_arg(6)
+ flags_str = _mempolicy_flags_str(flags)
+ argstr = sprintf("%d, %u, %p, %p, %p, %s", pid, nr_pages, pages,
+ nodes, status, flags_str)
+}
+probe __nd_syscall.move_pages = kprobe.function("sys_move_pages")
+{
+ @__syscall_gate(%{ __NR_move_pages %})
}
-probe nd_syscall.move_pages.return = kprobe.function("compat_sys_move_pages").return ?,
- kprobe.function("sys_move_pages").return ?
+probe nd_syscall.move_pages.return = __nd_syscall.move_pages.return ?,
+ kprobe.function("compat_sys_move_pages").return ?
{
name = "move_pages"
retstr = returnstr(1)
}
+probe __nd_syscall.move_pages.return = kprobe.function("sys_move_pages").return
+{
+ @__syscall_gate(%{ __NR_move_pages %})
+}
# mount ______________________________________________________
# long sys_mount(char __user * dev_name,
# compat_ulong_t maxnode,
# compat_ulong_t flags)
#
-probe syscall.mbind = kernel.function("compat_sys_mbind").call ?,
- kernel.function("sys_mbind").call ?
+probe syscall.mbind = __syscall.mbind ?,
+ kernel.function("compat_sys_mbind").call ?
{
name = "mbind"
start = $start
- len = $len
- mode = $mode
+ mode = __int32($mode)
+ mode_str = _mempolicy_mode_str(mode)
nmask_uaddr = $nmask
- maxnode = $maxnode
- flags = $flags
- argstr = sprintf("%d, %d, %d, %p, %d, 0x%x", $start, $len, $mode,
- $nmask, $maxnode, $flags)
+ flags = __uint32($flags)
+ flags_str = _mempolicy_flags_str(flags)
+ if (%{ _stp_is_compat_task() %}) {
+ len = __uint32($len)
+ maxnode = __uint32($maxnode)
+ } else {
+ len = $len
+ maxnode = $maxnode
+ }
+ argstr = sprintf("%p, %u, %s, %p, %u, %s", start, len,
+ mode_str, nmask_uaddr, maxnode, flags_str)
+}
+probe __syscall.mbind = kernel.function("sys_mbind").call
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
}
-probe syscall.mbind.return = kernel.function("compat_sys_mbind").return ?,
- kernel.function("sys_mbind").return ?
+probe syscall.mbind.return = __syscall.mbind.return ?,
+ kernel.function("compat_sys_mbind").return ?
{
name = "mbind"
retstr = return_str(1, $return)
}
+probe __syscall.mbind.return = kernel.function("sys_mbind").return
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
# memfd_create _____________________________________________________
# long sys_memfd_create (const char __user* uname, unsigned int flags)
# long sys_migrate_pages(pid_t pid, unsigned long maxnode,
# const unsigned long __user *old_nodes,
# const unsigned long __user *new_nodes)
-probe syscall.migrate_pages = kernel.function("sys_migrate_pages").call ?
+probe syscall.migrate_pages = __syscall.migrate_pages ?,
+ kernel.function("compat_sys_migrate_pages").call ?
{
name = "migrate_pages"
- argstr = sprintf("%d, %d, %p, %p", $pid, $maxnode, $old_nodes, $new_nodes)
+ pid = __int32($pid)
+ old_nodes = $old_nodes
+ new_nodes = $new_nodes
+ if (%{ _stp_is_compat_task() %}) {
+ maxnode = __uint32($maxnode)
+ } else {
+ maxnode = $maxnode
+ }
+ argstr = sprintf("%d, %u, %p, %p", pid, maxnode, old_nodes, new_nodes)
}
-probe syscall.migrate_pages.return = kernel.function("sys_migrate_pages").return ?
+probe __syscall.migrate_pages = kernel.function("sys_migrate_pages").call
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
+probe syscall.migrate_pages.return = __syscall.migrate_pages.return ?,
+ kernel.function("compat_sys_migrate_pages").return ?
{
name = "migrate_pages"
retstr = return_str(1, $return)
}
+probe __syscall.migrate_pages.return = kernel.function("sys_migrate_pages").return
+{
+%( arch == "powerpc" %?
+ @__syscall_gate_compat_simple
+%)
+}
# mincore ____________________________________________________
# long sys_mincore(unsigned long start, size_t len, unsigned char __user * vec)
# int __user *status,
# int flags)
#
-probe syscall.move_pages = kernel.function("compat_sys_move_pages").call ?,
- kernel.function("sys_move_pages").call ?
+probe syscall.move_pages = __syscall.move_pages ?,
+ __syscall.compat_move_pages ?
{
name = "move_pages"
- argstr = sprintf("%d, %d, %p, %p, 0x%x", $pid, $nr_pages, $nodes, $status, $flags)
+ pid = __int32($pid)
+ nodes = $nodes
+ status = $status
+ flags = __int32($flags)
+ flags_str = _mempolicy_flags_str(flags)
+ if (%{ _stp_is_compat_task() %}) {
+ nr_pages = __uint32($nr_pages)
+ } else {
+ nr_pages = $nr_pages
+ }
+ argstr = sprintf("%d, %u, %p, %p, %p, %s", pid, nr_pages, pages,
+ nodes, status, flags_str)
+}
+probe __syscall.move_pages = kernel.function("sys_move_pages").call
+{
+ @__syscall_gate(%{ __NR_move_pages %})
+ pages = $pages
}
-probe syscall.move_pages.return = kernel.function("compat_sys_move_pages").return ?,
- kernel.function("sys_move_pages").return ?
+probe __syscall.compat_move_pages = kernel.function("compat_sys_move_pages").call
+{
+ pages = $pages32
+}
+probe syscall.move_pages.return = __syscall.move_pages.return ?,
+ kernel.function("compat_sys_move_pages").return ?
{
name = "move_pages"
retstr = return_str(1, $return)
}
+probe __syscall.move_pages.return = kernel.function("sys_move_pages").return
+{
+ @__syscall_gate(%{ __NR_move_pages %})
+}
# mount ______________________________________________________
# long sys_mount(char __user * dev_name,
probe nd_syscall.mbind ?
{
printf("%s, %s\n", name, argstr)
- printf("%d, %d, %d, %p, %d, %d\n", start, len, mode, nmask_uaddr,
- maxnode, flags)
+ argstr = sprintf("%p, %u, %d, %s, %p, %u, %u, %s", start, len, mode,
+ mode_str, nmask_uaddr, maxnode, flags, flags_str)
}
probe nd_syscall.mbind.return ?
{
probe nd_syscall.migrate_pages ?
{
printf("%s, %s\n", name, argstr)
+ printf("%d, %u, %p, %p", pid, maxnode, old_nodes, new_nodes)
}
probe nd_syscall.migrate_pages.return ?
{
probe nd_syscall.move_pages ?
{
printf("%s, %s\n", name, argstr)
+ printf("%d, %u, %p, %p, %p, %u, %s", pid, nr_pages, pages, nodes,
+ status, flags, flags_str)
}
probe nd_syscall.move_pages.return ?
{
probe syscall.mbind ?
{
printf("%s, %s\n", name, argstr)
- printf("%d, %d, %d, %p, %d, %d\n", start, len, mode, nmask_uaddr,
- maxnode, flags)
+ printf("%p, %u, %d, %s, %p, %u, %u, %s", start, len, mode,
+ mode_str, nmask_uaddr, maxnode, flags, flags_str)
}
probe syscall.mbind.return ?
{
probe syscall.migrate_pages ?
{
printf("%s, %s\n", name, argstr)
+ printf("%d, %u, %p, %p", pid, maxnode, old_nodes, new_nodes)
}
probe syscall.migrate_pages.return ?
{
probe syscall.move_pages ?
{
printf("%s, %s\n", name, argstr)
+ printf("%d, %u, %p, %p, %p, %u, %s", pid, nr_pages, pages, nodes,
+ status, flags, flags_str)
}
probe syscall.move_pages.return ?
{
--- /dev/null
+/* COVERAGE: mbind migrate_pages move_pages */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <sys/mman.h>
+#include <linux/mempolicy.h>
+#include <sys/types.h>
+#define TEST_PAGES 2
+
+
+#ifdef __NR_mbind
+int __mbind(void *start, unsigned long len, int mode,
+ unsigned long *nmask, unsigned long maxnode, unsigned flags) {
+ return syscall(__NR_mbind, start, len, mode, nmask, maxnode, flags);
+}
+#endif
+
+#ifdef __NR_migrate_pages
+long __migrate_pages(pid_t pid, unsigned long maxnode,
+ const unsigned long *old_nodes,
+ const unsigned long *new_nodes) {
+ return syscall(__NR_migrate_pages, pid, maxnode, old_nodes, new_nodes);
+}
+#endif
+
+#ifdef __NR_move_pages
+long __move_pages(pid_t pid, unsigned long nr_pages, const void **pages,
+ const int *nodes, int *status, int flags) {
+ return syscall(__NR_move_pages, pid, nr_pages, pages, nodes, status, flags);
+}
+#endif
+
+
+int main()
+{
+ unsigned long *p;
+ unsigned long len = 100;
+ const unsigned long node0 = 1;
+ const void *pages[TEST_PAGES] = { 0 };
+ int status[TEST_PAGES];
+
+// ---- normal operation --------------
+
+#ifdef __NR_mbind
+ p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+ __mbind(p, len, MPOL_DEFAULT, NULL, 0, 0);
+ //staptest// [[[[mbind (XXXX, 100, MPOL_DEFAULT, 0x0, 0, 0x0) = 0!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+#ifdef __NR_move_pages
+ __move_pages(0, TEST_PAGES, pages, NULL, status, 0);
+ //staptest// [[[[move_pages (0, 2, XXXX, 0x0, XXXX, 0x0) = 0!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+#ifdef __NR_migrate_pages
+ __migrate_pages(0, 1, &node0, &node0);
+ //staptest// [[[[migrate_pages (0, 1, XXXX, XXXX) = 0!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+
+// ---- ugly calls --------------------
+
+#ifdef __NR_mbind
+ __mbind((void *)-1, 0, 0, NULL, 0, 0);
+ //staptest// [[[[mbind (0x[f]+, 0, MPOL_DEFAULT, 0x0, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __mbind(NULL, -1, 0, NULL, 0, 0);
+#if __WORDSIZE == 64
+ //staptest// [[[[mbind (0x0, 18446744073709551615, MPOL_DEFAULT, 0x0, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#else
+ //staptest// [[[[mbind (0x0, 4294967295, MPOL_DEFAULT, 0x0, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ __mbind(NULL, 0, -1, NULL, 0, 0);
+ //staptest// [[[[mbind (0x0, 0, 0x[f]+, 0x0, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __mbind(NULL, 0, 0, (unsigned long *)-1, 0, 0);
+ //staptest// [[[[mbind (0x0, 0, MPOL_DEFAULT, 0x[f]+, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __mbind(NULL, 0, 0, NULL, -1, 0);
+#if __WORDSIZE == 64
+ //staptest// [[[[mbind (0x0, 0, MPOL_DEFAULT, 0x0, 18446744073709551615, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#else
+ //staptest// [[[[mbind (0x0, 0, MPOL_DEFAULT, 0x0, 4294967295, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ __mbind(NULL, 0, 0, NULL, 0, -1);
+ //staptest// [[[[mbind (0x0, 0, MPOL_DEFAULT, 0x0, 0, MPOL_F_NODE|MPOL_F_ADDR[[[[!!!!|MPOL_F_MEMS_ALLOWED]]]]|XXXX)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+#ifdef MPOL_F_STATIC_NODES
+ __mbind(NULL, 0, MPOL_F_STATIC_NODES|MPOL_PREFERRED, NULL, 0, 0);
+ //staptest// [[[[mbind (0x0, 0, MPOL_F_STATIC_NODES|MPOL_PREFERRED, 0x0, 0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ __mbind(NULL, 0, 0, NULL, 0, MPOL_F_ADDR);
+ //staptest// [[[[mbind (0x0, 0, MPOL_DEFAULT, 0x0, 0, MPOL_F_ADDR)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+#ifdef __NR_move_pages
+ __move_pages(-1, 0, NULL, NULL, NULL, 0);
+ //staptest// [[[[move_pages (-1, 0, 0x0, 0x0, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __move_pages(0, -1, NULL, NULL, NULL, 0);
+#if __WORDSIZE == 64
+ //staptest// [[[[move_pages (0, 18446744073709551615, 0x0, 0x0, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#else
+ //staptest// [[[[move_pages (0, 4294967295, 0x0, 0x0, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ __move_pages(0, 0, (const void **)-1, NULL, NULL, 0);
+ //staptest// [[[[move_pages (0, 0, 0x[f]+, 0x0, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __move_pages(0, 0, NULL, (const int *)-1, NULL, 0);
+ //staptest// [[[[move_pages (0, 0, 0x0, 0x[f]+, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __move_pages(0, 0, NULL, NULL, (int *)-1, 0);
+ //staptest// [[[[move_pages (0, 0, 0x0, 0x0, 0x[f]+, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __move_pages(0, 0, NULL, NULL, NULL, -1);
+ //staptest// [[[[move_pages (0, 0, 0x0, 0x0, 0x0, MPOL_F_NODE|MPOL_F_ADDR[[[[!!!!|MPOL_F_MEMS_ALLOWED]]]]|XXXX)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __move_pages(0, 0, NULL, NULL, NULL, MPOL_F_ADDR);
+ //staptest// [[[[move_pages (0, 0, 0x0, 0x0, 0x0, MPOL_F_ADDR)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+#ifdef __NR_migrate_pages
+ __migrate_pages(-1, 0, NULL, NULL);
+ //staptest// [[[[migrate_pages (-1, 0, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __migrate_pages(0, -1, NULL, NULL);
+#if __WORDSIZE == 64
+ //staptest// [[[[migrate_pages (0, 18446744073709551615, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#else
+ //staptest// [[[[migrate_pages (0, 4294967295, 0x0, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ __migrate_pages(0, 0, (const unsigned long *)-1, NULL);
+ //staptest// [[[[migrate_pages (0, 0, 0x[f]+, 0x0)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+
+ __migrate_pages(0, 0, NULL, (const unsigned long *)-1);
+ //staptest// [[[[migrate_pages (0, 0, 0x0, 0x[f]+)!!!!ni_syscall () = NNNN (ENOSYS)]]]]
+#endif
+
+ return 0;
+
+}