1 // SPDX-License-Identifier: GPL-2.0 2 3 /* 4 * Copyright 2020 Google LLC. 5 */ 6 7 #include <test_progs.h> 8 #include <unistd.h> 9 #include "modify_return.skel.h" 10 11 #define LOWER(x) ((x) & 0xffff) 12 #define UPPER(x) ((x) >> 16) 13 14 15 static void run_test(__u32 input_retval, __u16 want_side_effect, __s16 want_ret) 16 { 17 struct modify_return *skel = NULL; 18 int err, prog_fd; 19 __u16 side_effect; 20 __s16 ret; 21 LIBBPF_OPTS(bpf_test_run_opts, topts); 22 23 skel = modify_return__open_and_load(); 24 if (!ASSERT_OK_PTR(skel, "skel_load")) 25 goto cleanup; 26 27 skel->bss->input_retval = input_retval; 28 skel->bss->test_pid = getpid(); 29 30 err = modify_return__attach(skel); 31 if (!ASSERT_OK(err, "modify_return__attach failed")) 32 goto cleanup; 33 34 prog_fd = bpf_program__fd(skel->progs.fmod_ret_test); 35 err = bpf_prog_test_run_opts(prog_fd, &topts); 36 ASSERT_OK(err, "test_run"); 37 38 side_effect = UPPER(topts.retval); 39 ret = LOWER(topts.retval); 40 41 ASSERT_EQ(ret, want_ret, "test_run ret"); 42 ASSERT_EQ(side_effect, want_side_effect, "modify_return side_effect"); 43 ASSERT_EQ(skel->bss->fentry_result, 1, "modify_return fentry_result"); 44 ASSERT_EQ(skel->bss->fexit_result, 1, "modify_return fexit_result"); 45 ASSERT_EQ(skel->bss->fmod_ret_result, 1, "modify_return fmod_ret_result"); 46 47 ASSERT_EQ(skel->bss->fentry_result2, 1, "modify_return fentry_result2"); 48 ASSERT_EQ(skel->bss->fexit_result2, 1, "modify_return fexit_result2"); 49 ASSERT_EQ(skel->bss->fmod_ret_result2, 1, "modify_return fmod_ret_result2"); 50 51 cleanup: 52 modify_return__destroy(skel); 53 } 54 55 void test_modify_return(void) 56 { 57 run_test(0 /* input_retval */, 58 2 /* want_side_effect */, 59 33 /* want_ret */); 60 run_test(-EINVAL /* input_retval */, 61 0 /* want_side_effect */, 62 -EINVAL * 2 /* want_ret */); 63 } 64