0001
0002
0003 #include <test_progs.h>
0004 #include "dummy_st_ops.skel.h"
0005 #include "trace_dummy_st_ops.skel.h"
0006
0007
0008 struct bpf_dummy_ops_state {
0009 int val;
0010 };
0011
0012 static void test_dummy_st_ops_attach(void)
0013 {
0014 struct dummy_st_ops *skel;
0015 struct bpf_link *link;
0016
0017 skel = dummy_st_ops__open_and_load();
0018 if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load"))
0019 return;
0020
0021 link = bpf_map__attach_struct_ops(skel->maps.dummy_1);
0022 ASSERT_EQ(libbpf_get_error(link), -EOPNOTSUPP, "dummy_st_ops_attach");
0023
0024 dummy_st_ops__destroy(skel);
0025 }
0026
0027 static void test_dummy_init_ret_value(void)
0028 {
0029 __u64 args[1] = {0};
0030 LIBBPF_OPTS(bpf_test_run_opts, attr,
0031 .ctx_in = args,
0032 .ctx_size_in = sizeof(args),
0033 );
0034 struct dummy_st_ops *skel;
0035 int fd, err;
0036
0037 skel = dummy_st_ops__open_and_load();
0038 if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load"))
0039 return;
0040
0041 fd = bpf_program__fd(skel->progs.test_1);
0042 err = bpf_prog_test_run_opts(fd, &attr);
0043 ASSERT_OK(err, "test_run");
0044 ASSERT_EQ(attr.retval, 0xf2f3f4f5, "test_ret");
0045
0046 dummy_st_ops__destroy(skel);
0047 }
0048
0049 static void test_dummy_init_ptr_arg(void)
0050 {
0051 int exp_retval = 0xbeef;
0052 struct bpf_dummy_ops_state in_state = {
0053 .val = exp_retval,
0054 };
0055 __u64 args[1] = {(unsigned long)&in_state};
0056 LIBBPF_OPTS(bpf_test_run_opts, attr,
0057 .ctx_in = args,
0058 .ctx_size_in = sizeof(args),
0059 );
0060 struct trace_dummy_st_ops *trace_skel;
0061 struct dummy_st_ops *skel;
0062 int fd, err;
0063
0064 skel = dummy_st_ops__open_and_load();
0065 if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load"))
0066 return;
0067
0068 fd = bpf_program__fd(skel->progs.test_1);
0069
0070 trace_skel = trace_dummy_st_ops__open();
0071 if (!ASSERT_OK_PTR(trace_skel, "trace_dummy_st_ops__open"))
0072 goto done;
0073
0074 err = bpf_program__set_attach_target(trace_skel->progs.fentry_test_1,
0075 fd, "test_1");
0076 if (!ASSERT_OK(err, "set_attach_target(fentry_test_1)"))
0077 goto done;
0078
0079 err = trace_dummy_st_ops__load(trace_skel);
0080 if (!ASSERT_OK(err, "load(trace_skel)"))
0081 goto done;
0082
0083 err = trace_dummy_st_ops__attach(trace_skel);
0084 if (!ASSERT_OK(err, "attach(trace_skel)"))
0085 goto done;
0086
0087 err = bpf_prog_test_run_opts(fd, &attr);
0088 ASSERT_OK(err, "test_run");
0089 ASSERT_EQ(in_state.val, 0x5a, "test_ptr_ret");
0090 ASSERT_EQ(attr.retval, exp_retval, "test_ret");
0091 ASSERT_EQ(trace_skel->bss->val, exp_retval, "fentry_val");
0092
0093 done:
0094 dummy_st_ops__destroy(skel);
0095 trace_dummy_st_ops__destroy(trace_skel);
0096 }
0097
0098 static void test_dummy_multiple_args(void)
0099 {
0100 __u64 args[5] = {0, -100, 0x8a5f, 'c', 0x1234567887654321ULL};
0101 LIBBPF_OPTS(bpf_test_run_opts, attr,
0102 .ctx_in = args,
0103 .ctx_size_in = sizeof(args),
0104 );
0105 struct dummy_st_ops *skel;
0106 int fd, err;
0107 size_t i;
0108 char name[8];
0109
0110 skel = dummy_st_ops__open_and_load();
0111 if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load"))
0112 return;
0113
0114 fd = bpf_program__fd(skel->progs.test_2);
0115 err = bpf_prog_test_run_opts(fd, &attr);
0116 ASSERT_OK(err, "test_run");
0117 for (i = 0; i < ARRAY_SIZE(args); i++) {
0118 snprintf(name, sizeof(name), "arg %zu", i);
0119 ASSERT_EQ(skel->bss->test_2_args[i], args[i], name);
0120 }
0121
0122 dummy_st_ops__destroy(skel);
0123 }
0124
0125 void test_dummy_st_ops(void)
0126 {
0127 if (test__start_subtest("dummy_st_ops_attach"))
0128 test_dummy_st_ops_attach();
0129 if (test__start_subtest("dummy_init_ret_value"))
0130 test_dummy_init_ret_value();
0131 if (test__start_subtest("dummy_init_ptr_arg"))
0132 test_dummy_init_ptr_arg();
0133 if (test__start_subtest("dummy_multiple_args"))
0134 test_dummy_multiple_args();
0135 }