Merge branch 'for-linus' into for-next
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / prog_tests / modify_return.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4  * Copyright 2020 Google LLC.
5  */
6
7 #include <test_progs.h>
8 #include "modify_return.skel.h"
9
10 #define LOWER(x) ((x) & 0xffff)
11 #define UPPER(x) ((x) >> 16)
12
13
14 static void run_test(__u32 input_retval, __u16 want_side_effect, __s16 want_ret)
15 {
16         struct modify_return *skel = NULL;
17         int err, prog_fd;
18         __u32 duration = 0, retval;
19         __u16 side_effect;
20         __s16 ret;
21
22         skel = modify_return__open_and_load();
23         if (CHECK(!skel, "skel_load", "modify_return skeleton failed\n"))
24                 goto cleanup;
25
26         err = modify_return__attach(skel);
27         if (CHECK(err, "modify_return", "attach failed: %d\n", err))
28                 goto cleanup;
29
30         skel->bss->input_retval = input_retval;
31         prog_fd = bpf_program__fd(skel->progs.fmod_ret_test);
32         err = bpf_prog_test_run(prog_fd, 1, NULL, 0, NULL, 0,
33                                 &retval, &duration);
34
35         CHECK(err, "test_run", "err %d errno %d\n", err, errno);
36
37         side_effect = UPPER(retval);
38         ret  = LOWER(retval);
39
40         CHECK(ret != want_ret, "test_run",
41               "unexpected ret: %d, expected: %d\n", ret, want_ret);
42         CHECK(side_effect != want_side_effect, "modify_return",
43               "unexpected side_effect: %d\n", side_effect);
44
45         CHECK(skel->bss->fentry_result != 1, "modify_return",
46               "fentry failed\n");
47         CHECK(skel->bss->fexit_result != 1, "modify_return",
48               "fexit failed\n");
49         CHECK(skel->bss->fmod_ret_result != 1, "modify_return",
50               "fmod_ret failed\n");
51
52 cleanup:
53         modify_return__destroy(skel);
54 }
55
56 void test_modify_return(void)
57 {
58         run_test(0 /* input_retval */,
59                  1 /* want_side_effect */,
60                  4 /* want_ret */);
61         run_test(-EINVAL /* input_retval */,
62                  0 /* want_side_effect */,
63                  -EINVAL /* want_ret */);
64 }
65