Skip to content

Commit 63a2168

Browse files
committed
selftests/bpf: Improve portability of bpf_syscall_macro test
Part of the test does non-CORE param reads using bpf_probe_read_kernel() and fixed 8-bytes reads, which breaks on 32-bit arm: root@qemu-armhf:/usr/libexec/kselftests-bpf# ./test_progs -v -w 0 -a bpf_syscall_macro bpf_testmod.ko is already unloaded. Loading bpf_testmod.ko... Successfully loaded bpf_testmod.ko. test_bpf_syscall_macro:PASS:bpf_syscall_macro__open 0 nsec test_bpf_syscall_macro:PASS:bpf_syscall_macro__load 0 nsec test_bpf_syscall_macro:PASS:bpf_syscall_macro__attach 0 nsec test_bpf_syscall_macro:FAIL:syscall_arg1 unexpected syscall_arg1: actual 0 != expected 1001 test_bpf_syscall_macro:FAIL:syscall_arg2 unexpected syscall_arg2: actual 0 != expected 12 test_bpf_syscall_macro:FAIL:syscall_arg3 unexpected syscall_arg3: actual 0 != expected 13 test_bpf_syscall_macro:FAIL:syscall_arg4_from_cx unexpected syscall_arg4_from_cx: actual 0 != expected 14 test_bpf_syscall_macro:FAIL:syscall_arg4 unexpected syscall_arg4: actual 0 != expected 14 test_bpf_syscall_macro:FAIL:syscall_arg5 unexpected syscall_arg5: actual 0 != expected 15 test_bpf_syscall_macro:FAIL:syscall_arg1_core_variant unexpected syscall_arg1_core_variant: actual 0 != expected 1001 test_bpf_syscall_macro:FAIL:syscall_arg2_core_variant unexpected syscall_arg2_core_variant: actual 0 != expected 12 test_bpf_syscall_macro:FAIL:syscall_arg3_core_variant unexpected syscall_arg3_core_variant: actual 0 != expected 13 test_bpf_syscall_macro:FAIL:syscall_arg4_from_cx_core_variant unexpected syscall_arg4_from_cx_core_variant: actual 0 != expected 14 test_bpf_syscall_macro:FAIL:syscall_arg4_core_variant unexpected syscall_arg4_core_variant: actual 0 != expected 14 test_bpf_syscall_macro:FAIL:syscall_arg5_core_variant unexpected syscall_arg5_core_variant: actual 0 != expected 15 test_bpf_syscall_macro:PASS:BPF_KPROBE_SYSCALL_option 0 nsec test_bpf_syscall_macro:PASS:BPF_KPROBE_SYSCALL_arg2 0 nsec test_bpf_syscall_macro:PASS:BPF_KPROBE_SYSCALL_arg3 0 nsec test_bpf_syscall_macro:PASS:BPF_KPROBE_SYSCALL_arg4 0 nsec test_bpf_syscall_macro:PASS:BPF_KPROBE_SYSCALL_arg5 0 nsec test_bpf_syscall_macro:PASS:splice_res 0 nsec test_bpf_syscall_macro:PASS:splice_err 0 nsec test_bpf_syscall_macro:PASS:splice_arg1 0 nsec test_bpf_syscall_macro:PASS:splice_arg2 0 nsec test_bpf_syscall_macro:PASS:splice_arg3 0 nsec test_bpf_syscall_macro:PASS:splice_arg4 0 nsec test_bpf_syscall_macro:PASS:splice_arg5 0 nsec test_bpf_syscall_macro:PASS:splice_arg6 0 nsec torvalds#26 bpf_syscall_macro:FAIL Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED Fix non-CORE reads by sizing data based on a struct pt_regs elem. FIXME: the CORE read errors are fixed by previous patch to bpf_tracing.h which fixes unselected ARCH_HAS_SYSCALL_WRAPPER. Signed-off-by: Tony Ambardar <[email protected]>
1 parent 893db2e commit 63a2168

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

tools/testing/selftests/bpf/progs/bpf_syscall_macro.c

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,33 @@ const volatile pid_t filter_pid = 0;
3232
SEC("kprobe/" SYS_PREFIX "sys_prctl")
3333
int BPF_KPROBE(handle_sys_prctl)
3434
{
35-
struct pt_regs *real_regs;
36-
pid_t pid = bpf_get_current_pid_tgid() >> 32;
37-
unsigned long tmp = 0;
38-
35+
struct pt_regs *real_regs = PT_REGS_SYSCALL_REGS(ctx);
36+
/* Declare tmp vars of pt_regs elem type w/o const qualifier. Blech.*/
37+
typeof(__builtin_choose_expr(
38+
__builtin_types_compatible_p(
39+
typeof(PT_REGS_PARM1(real_regs)),
40+
__u32),
41+
(__u32)0,
42+
(__u64)0)) tmp1, tmp2, tmp3, tmp4, tmp4_cx, tmp5;
43+
pid_t pid;
44+
45+
pid = bpf_get_current_pid_tgid() >> 32;
3946
if (pid != filter_pid)
4047
return 0;
4148

42-
real_regs = PT_REGS_SYSCALL_REGS(ctx);
43-
4449
/* test for PT_REGS_PARM */
45-
46-
bpf_probe_read_kernel(&tmp, sizeof(tmp), &PT_REGS_PARM1_SYSCALL(real_regs));
47-
arg1 = tmp;
48-
bpf_probe_read_kernel(&arg2, sizeof(arg2), &PT_REGS_PARM2_SYSCALL(real_regs));
49-
bpf_probe_read_kernel(&arg3, sizeof(arg3), &PT_REGS_PARM3_SYSCALL(real_regs));
50-
bpf_probe_read_kernel(&arg4_cx, sizeof(arg4_cx), &PT_REGS_PARM4(real_regs));
51-
bpf_probe_read_kernel(&arg4, sizeof(arg4), &PT_REGS_PARM4_SYSCALL(real_regs));
52-
bpf_probe_read_kernel(&arg5, sizeof(arg5), &PT_REGS_PARM5_SYSCALL(real_regs));
50+
bpf_probe_read_kernel(&tmp1, sizeof(tmp1),&PT_REGS_PARM1_SYSCALL(real_regs));
51+
bpf_probe_read_kernel(&tmp2, sizeof(tmp2), &PT_REGS_PARM2_SYSCALL(real_regs));
52+
bpf_probe_read_kernel(&tmp3, sizeof(tmp3), &PT_REGS_PARM3_SYSCALL(real_regs));
53+
bpf_probe_read_kernel(&tmp4_cx, sizeof(tmp4_cx), &PT_REGS_PARM4(real_regs));
54+
bpf_probe_read_kernel(&tmp4, sizeof(tmp4), &PT_REGS_PARM4_SYSCALL(real_regs));
55+
bpf_probe_read_kernel(&tmp5, sizeof(tmp5), &PT_REGS_PARM5_SYSCALL(real_regs));
56+
arg1 = tmp1;
57+
arg2 = tmp2;
58+
arg3 = tmp3;
59+
arg4 = tmp4;
60+
arg4_cx = tmp4_cx;
61+
arg5 = tmp5;
5362

5463
/* test for the CORE variant of PT_REGS_PARM */
5564
arg1_core = PT_REGS_PARM1_CORE_SYSCALL(real_regs);

0 commit comments

Comments
 (0)