selftests/ptrace/get_syscall_info: fix for MIPS n32
PATCH v3 1/1 selftests/ptrace/get_syscall_info: fix for MIPS n32
MIPS n32 is one of two ILP32 architectures supported by the kernel that have 64-bit syscall arguments (another one is x32).
When this test passed 32-bit arguments to syscall(), they were sign-extended in libc, PTRACE_GET_SYSCALL_INFO reported these sign-extended 64-bit values, and the test complained about the mismatch.
Fix this by passing arguments of the appropriate type to syscall(), which is "unsigned long long" on MIPS n32, and __kernel_ulong_t on other architectures, the same way as selftests/ptrace/set_syscall_info already does.
As a side effect, this also extends the test on all 64-bit architectures by choosing constants that don't fit into 32-bit integers.
---
v3: Added Acked-by:
https://lore.kernel.org/all/[email protected]/
v2: Fixed MIPS #ifdef:
https://lore.kernel.org/all/[email protected]/
.../selftests/ptrace/get_syscall_info.c | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-)
tools/testing/selftests/ptrace/get_syscall_info.c +32 -21
@@ -11,8 +11,19 @@#include <err.h> #include <signal.h> #include <asm/unistd.h> +#include <linux/types.h> #include "linux/ptrace.h" +#if defined(_MIPS_SIM) && _MIPS_SIM == _MIPS_SIM_NABI32 +/* +* MIPS N32 is the only architecture where __kernel_ulong_t +* does not match the bitness of syscall arguments. +*/ +typedef unsigned long long kernel_ulong_t ; +#else +typedef __kernel_ulong_t kernel_ulong_t ; +#endif +static int kill_tracee (pid_t pid) {
@@ -42,37 +53,37 @@ sys_ptrace(int request, pid_t pid, unsigned long addr, unsigned long data)TEST (get_syscall_info) { -static const unsigned long args[][7 ] = { +const kernel_ulong_t args[][7 ] = {/* a sequence of architecture-agnostic syscalls */ { __NR_chdir, - (unsigned long )"" , -0xbad1fed1 , -0xbad2fed2 , -0xbad3fed3 , -0xbad4fed4 , -0xbad5fed5 + (uintptr_t )"" , + (kernel_ulong_t )0xdad1bef1bad1fed1ULL , + (kernel_ulong_t )0xdad2bef2bad2fed2ULL , + (kernel_ulong_t )0xdad3bef3bad3fed3ULL , + (kernel_ulong_t )0xdad4bef4bad4fed4ULL , + (kernel_ulong_t )0xdad5bef5bad5fed5ULL }, { __NR_gettid, -0xcaf0bea0 , -0xcaf1bea1 , -0xcaf2bea2 , -0xcaf3bea3 , -0xcaf4bea4 , -0xcaf5bea5 + (kernel_ulong_t )0xdad0bef0caf0bea0ULL , + (kernel_ulong_t )0xdad1bef1caf1bea1ULL , + (kernel_ulong_t )0xdad2bef2caf2bea2ULL , + (kernel_ulong_t )0xdad3bef3caf3bea3ULL , + (kernel_ulong_t )0xdad4bef4caf4bea4ULL , + (kernel_ulong_t )0xdad5bef5caf5bea5ULL }, { __NR_exit_group,0 , -0xfac1c0d1 , -0xfac2c0d2 , -0xfac3c0d3 , -0xfac4c0d4 , -0xfac5c0d5 + (kernel_ulong_t )0xdad1bef1fac1c0d1ULL , + (kernel_ulong_t )0xdad2bef2fac2c0d2ULL , + (kernel_ulong_t )0xdad3bef3fac3c0d3ULL , + (kernel_ulong_t )0xdad4bef4fac4c0d4ULL , + (kernel_ulong_t )0xdad5bef5fac5c0d5ULL } }; -const unsigned long *exp_args; +const kernel_ulong_t *exp_args;pid_t pid =fork ();
@@ -154,7 +165,7 @@ TEST(get_syscall_info) }ASSERT_LT (0 , (rc =sys_ptrace (PTRACE_GET_SYSCALL_INFO , pid, size, - (unsigned long) &info))) { + (uintptr_t) &info))) {LOG_KILL_TRACEE ("PTRACE_GET_SYSCALL_INFO: %m" ); } ASSERT_EQ(expected_none_size, rc) {
@@ -177,7 +188,7 @@ TEST(get_syscall_info)case SIGTRAP |0x80 :ASSERT_LT (0 , (rc =sys_ptrace (PTRACE_GET_SYSCALL_INFO , pid, size, - (unsigned long) &info))) { + (uintptr_t) &info))) {LOG_KILL_TRACEE ("PTRACE_GET_SYSCALL_INFO: %m" ); }switch (ptrace_stop) {
Signature · 1 line
ldv