1 // SPDX-License-Identifier: GPL-2.0 2 #include <vmlinux.h> 3 #include <bpf/bpf_helpers.h> 4 #include <bpf/bpf_tracing.h> 5 6 char _license[] SEC("license") = "GPL"; 7 8 int pid = 0; 9 bool test_cookies = false; 10 11 /* bpf_fentry_test1 is exported as kfunc via vmlinux.h */ 12 extern const void bpf_fentry_test2 __ksym; 13 extern const void bpf_fentry_test3 __ksym; 14 extern const void bpf_fentry_test4 __ksym; 15 extern const void bpf_fentry_test5 __ksym; 16 extern const void bpf_fentry_test6 __ksym; 17 extern const void bpf_fentry_test7 __ksym; 18 extern const void bpf_fentry_test8 __ksym; 19 extern const void bpf_fentry_test9 __ksym; 20 extern const void bpf_fentry_test10 __ksym; 21 22 extern const void bpf_testmod_fentry_test1 __ksym; 23 extern const void bpf_testmod_fentry_test2 __ksym; 24 extern const void bpf_testmod_fentry_test3 __ksym; 25 extern const void bpf_testmod_fentry_test7 __ksym; 26 extern const void bpf_testmod_fentry_test11 __ksym; 27 28 int tracing_multi_arg_check(__u64 *ctx, __u64 *test_result, bool is_return) 29 { 30 void *ip = (void *) bpf_get_func_ip(ctx); 31 __u64 value = 0, ret = 0, cookie = 0; 32 long err = 0; 33 34 if (bpf_get_current_pid_tgid() >> 32 != pid) 35 return 1; 36 37 if (is_return) 38 err |= bpf_get_func_ret(ctx, &ret); 39 if (test_cookies) 40 cookie = bpf_get_attach_cookie(ctx); 41 42 if (ip == &bpf_fentry_test1) { 43 int a; 44 45 err |= bpf_get_func_arg(ctx, 0, &value); 46 a = (int) value; 47 48 err |= is_return ? ret != 2 : 0; 49 err |= test_cookies ? cookie != 8 : 0; 50 51 *test_result += err == 0 && a == 1; 52 } else if (ip == &bpf_fentry_test2) { 53 __u64 b; 54 int a; 55 56 err |= bpf_get_func_arg(ctx, 0, &value); 57 a = (int) value; 58 err |= bpf_get_func_arg(ctx, 1, &value); 59 b = value; 60 61 err |= is_return ? ret != 5 : 0; 62 err |= test_cookies ? cookie != 9 : 0; 63 64 *test_result += err == 0 && a == 2 && b == 3; 65 } else if (ip == &bpf_fentry_test3) { 66 __u64 c; 67 char a; 68 int b; 69 70 err |= bpf_get_func_arg(ctx, 0, &value); 71 a = (char) value; 72 err |= bpf_get_func_arg(ctx, 1, &value); 73 b = (int) value; 74 err |= bpf_get_func_arg(ctx, 2, &value); 75 c = value; 76 77 err |= is_return ? ret != 15 : 0; 78 err |= test_cookies ? cookie != 7 : 0; 79 80 *test_result += err == 0 && a == 4 && b == 5 && c == 6; 81 } else if (ip == &bpf_fentry_test4) { 82 void *a; 83 char b; 84 int c; 85 __u64 d; 86 87 err |= bpf_get_func_arg(ctx, 0, &value); 88 a = (void *) value; 89 err |= bpf_get_func_arg(ctx, 1, &value); 90 b = (char) value; 91 err |= bpf_get_func_arg(ctx, 2, &value); 92 c = (int) value; 93 err |= bpf_get_func_arg(ctx, 3, &value); 94 d = value; 95 96 err |= is_return ? ret != 34 : 0; 97 err |= test_cookies ? cookie != 5 : 0; 98 99 *test_result += err == 0 && a == (void *) 7 && b == 8 && c == 9 && d == 10; 100 } else if (ip == &bpf_fentry_test5) { 101 __u64 a; 102 void *b; 103 short c; 104 int d; 105 __u64 e; 106 107 err |= bpf_get_func_arg(ctx, 0, &value); 108 a = value; 109 err |= bpf_get_func_arg(ctx, 1, &value); 110 b = (void *) value; 111 err |= bpf_get_func_arg(ctx, 2, &value); 112 c = (short) value; 113 err |= bpf_get_func_arg(ctx, 3, &value); 114 d = (int) value; 115 err |= bpf_get_func_arg(ctx, 4, &value); 116 e = value; 117 118 err |= is_return ? ret != 65 : 0; 119 err |= test_cookies ? cookie != 4 : 0; 120 121 *test_result += err == 0 && a == 11 && b == (void *) 12 && c == 13 && d == 14 && e == 15; 122 } else if (ip == &bpf_fentry_test6) { 123 __u64 a; 124 void *b; 125 short c; 126 int d; 127 void *e; 128 __u64 f; 129 130 err |= bpf_get_func_arg(ctx, 0, &value); 131 a = value; 132 err |= bpf_get_func_arg(ctx, 1, &value); 133 b = (void *) value; 134 err |= bpf_get_func_arg(ctx, 2, &value); 135 c = (short) value; 136 err |= bpf_get_func_arg(ctx, 3, &value); 137 d = (int) value; 138 err |= bpf_get_func_arg(ctx, 4, &value); 139 e = (void *) value; 140 err |= bpf_get_func_arg(ctx, 5, &value); 141 f = value; 142 143 err |= is_return ? ret != 111 : 0; 144 err |= test_cookies ? cookie != 2 : 0; 145 146 *test_result += err == 0 && a == 16 && b == (void *) 17 && c == 18 && d == 19 && e == (void *) 20 && f == 21; 147 } else if (ip == &bpf_fentry_test7) { 148 err |= is_return ? ret != 0 : 0; 149 err |= test_cookies ? cookie != 3 : 0; 150 151 *test_result += err == 0 ? 1 : 0; 152 } else if (ip == &bpf_fentry_test8) { 153 err |= is_return ? ret != 0 : 0; 154 err |= test_cookies ? cookie != 1 : 0; 155 156 *test_result += err == 0 ? 1 : 0; 157 } else if (ip == &bpf_fentry_test9) { 158 err |= is_return ? ret != 0 : 0; 159 err |= test_cookies ? cookie != 10 : 0; 160 161 *test_result += err == 0 ? 1 : 0; 162 } else if (ip == &bpf_fentry_test10) { 163 err |= is_return ? ret != 0 : 0; 164 err |= test_cookies ? cookie != 6 : 0; 165 166 *test_result += err == 0 ? 1 : 0; 167 } else if (ip == &bpf_testmod_fentry_test1) { 168 int a; 169 170 err |= bpf_get_func_arg(ctx, 0, &value); 171 a = (int) value; 172 173 err |= is_return ? ret != 2 : 0; 174 175 *test_result += err == 0 && a == 1; 176 } else if (ip == &bpf_testmod_fentry_test2) { 177 int a; 178 __u64 b; 179 180 err |= bpf_get_func_arg(ctx, 0, &value); 181 a = (int) value; 182 err |= bpf_get_func_arg(ctx, 1, &value); 183 b = (__u64) value; 184 185 err |= is_return ? ret != 5 : 0; 186 187 *test_result += err == 0 && a == 2 && b == 3; 188 } else if (ip == &bpf_testmod_fentry_test3) { 189 char a; 190 int b; 191 __u64 c; 192 193 err |= bpf_get_func_arg(ctx, 0, &value); 194 a = (char) value; 195 err |= bpf_get_func_arg(ctx, 1, &value); 196 b = (int) value; 197 err |= bpf_get_func_arg(ctx, 2, &value); 198 c = (__u64) value; 199 200 err |= is_return ? ret != 15 : 0; 201 202 *test_result += err == 0 && a == 4 && b == 5 && c == 6; 203 } else if (ip == &bpf_testmod_fentry_test7) { 204 err |= is_return ? ret != 133 : 0; 205 206 *test_result += err == 0; 207 } else if (ip == &bpf_testmod_fentry_test11) { 208 err |= is_return ? ret != 231 : 0; 209 210 *test_result += err == 0; 211 } 212 213 return 0; 214 } 215