Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright 2022 Sony Group Corporation */
0003 #include <sys/prctl.h>
0004 #include <test_progs.h>
0005 #include "bpf_syscall_macro.skel.h"
0006 
0007 void test_bpf_syscall_macro(void)
0008 {
0009     struct bpf_syscall_macro *skel = NULL;
0010     int err;
0011     int exp_arg1 = 1001;
0012     unsigned long exp_arg2 = 12;
0013     unsigned long exp_arg3 = 13;
0014     unsigned long exp_arg4 = 14;
0015     unsigned long exp_arg5 = 15;
0016 
0017     /* check whether it can open program */
0018     skel = bpf_syscall_macro__open();
0019     if (!ASSERT_OK_PTR(skel, "bpf_syscall_macro__open"))
0020         return;
0021 
0022     skel->rodata->filter_pid = getpid();
0023 
0024     /* check whether it can load program */
0025     err = bpf_syscall_macro__load(skel);
0026     if (!ASSERT_OK(err, "bpf_syscall_macro__load"))
0027         goto cleanup;
0028 
0029     /* check whether it can attach kprobe */
0030     err = bpf_syscall_macro__attach(skel);
0031     if (!ASSERT_OK(err, "bpf_syscall_macro__attach"))
0032         goto cleanup;
0033 
0034     /* check whether args of syscall are copied correctly */
0035     prctl(exp_arg1, exp_arg2, exp_arg3, exp_arg4, exp_arg5);
0036 #if defined(__aarch64__) || defined(__s390__)
0037     ASSERT_NEQ(skel->bss->arg1, exp_arg1, "syscall_arg1");
0038 #else
0039     ASSERT_EQ(skel->bss->arg1, exp_arg1, "syscall_arg1");
0040 #endif
0041     ASSERT_EQ(skel->bss->arg2, exp_arg2, "syscall_arg2");
0042     ASSERT_EQ(skel->bss->arg3, exp_arg3, "syscall_arg3");
0043     /* it cannot copy arg4 when uses PT_REGS_PARM4 on x86_64 */
0044 #ifdef __x86_64__
0045     ASSERT_NEQ(skel->bss->arg4_cx, exp_arg4, "syscall_arg4_from_cx");
0046 #else
0047     ASSERT_EQ(skel->bss->arg4_cx, exp_arg4, "syscall_arg4_from_cx");
0048 #endif
0049     ASSERT_EQ(skel->bss->arg4, exp_arg4, "syscall_arg4");
0050     ASSERT_EQ(skel->bss->arg5, exp_arg5, "syscall_arg5");
0051 
0052     /* check whether args of syscall are copied correctly for CORE variants */
0053     ASSERT_EQ(skel->bss->arg1_core, exp_arg1, "syscall_arg1_core_variant");
0054     ASSERT_EQ(skel->bss->arg2_core, exp_arg2, "syscall_arg2_core_variant");
0055     ASSERT_EQ(skel->bss->arg3_core, exp_arg3, "syscall_arg3_core_variant");
0056     /* it cannot copy arg4 when uses PT_REGS_PARM4_CORE on x86_64 */
0057 #ifdef __x86_64__
0058     ASSERT_NEQ(skel->bss->arg4_core_cx, exp_arg4, "syscall_arg4_from_cx_core_variant");
0059 #else
0060     ASSERT_EQ(skel->bss->arg4_core_cx, exp_arg4, "syscall_arg4_from_cx_core_variant");
0061 #endif
0062     ASSERT_EQ(skel->bss->arg4_core, exp_arg4, "syscall_arg4_core_variant");
0063     ASSERT_EQ(skel->bss->arg5_core, exp_arg5, "syscall_arg5_core_variant");
0064 
0065     ASSERT_EQ(skel->bss->option_syscall, exp_arg1, "BPF_KPROBE_SYSCALL_option");
0066     ASSERT_EQ(skel->bss->arg2_syscall, exp_arg2, "BPF_KPROBE_SYSCALL_arg2");
0067     ASSERT_EQ(skel->bss->arg3_syscall, exp_arg3, "BPF_KPROBE_SYSCALL_arg3");
0068     ASSERT_EQ(skel->bss->arg4_syscall, exp_arg4, "BPF_KPROBE_SYSCALL_arg4");
0069     ASSERT_EQ(skel->bss->arg5_syscall, exp_arg5, "BPF_KPROBE_SYSCALL_arg5");
0070 
0071 cleanup:
0072     bpf_syscall_macro__destroy(skel);
0073 }