12922dd58SJiri Olsa // SPDX-License-Identifier: GPL-2.0 22922dd58SJiri Olsa #include <vmlinux.h> 32922dd58SJiri Olsa #include <bpf/bpf_helpers.h> 42922dd58SJiri Olsa #include <bpf/bpf_tracing.h> 52922dd58SJiri Olsa 62922dd58SJiri Olsa char _license[] SEC("license") = "GPL"; 72922dd58SJiri Olsa 82922dd58SJiri Olsa int pid = 0; 9*1b938f42SJiri Olsa bool test_cookies = false; 102922dd58SJiri Olsa 112922dd58SJiri Olsa /* bpf_fentry_test1 is exported as kfunc via vmlinux.h */ 122922dd58SJiri Olsa extern const void bpf_fentry_test2 __ksym; 132922dd58SJiri Olsa extern const void bpf_fentry_test3 __ksym; 142922dd58SJiri Olsa extern const void bpf_fentry_test4 __ksym; 152922dd58SJiri Olsa extern const void bpf_fentry_test5 __ksym; 162922dd58SJiri Olsa extern const void bpf_fentry_test6 __ksym; 172922dd58SJiri Olsa extern const void bpf_fentry_test7 __ksym; 182922dd58SJiri Olsa extern const void bpf_fentry_test8 __ksym; 192922dd58SJiri Olsa extern const void bpf_fentry_test9 __ksym; 202922dd58SJiri Olsa extern const void bpf_fentry_test10 __ksym; 212922dd58SJiri Olsa 222863f074SJiri Olsa extern const void bpf_testmod_fentry_test1 __ksym; 232863f074SJiri Olsa extern const void bpf_testmod_fentry_test2 __ksym; 242863f074SJiri Olsa extern const void bpf_testmod_fentry_test3 __ksym; 252863f074SJiri Olsa extern const void bpf_testmod_fentry_test7 __ksym; 262863f074SJiri Olsa extern const void bpf_testmod_fentry_test11 __ksym; 272863f074SJiri Olsa 282922dd58SJiri Olsa int tracing_multi_arg_check(__u64 *ctx, __u64 *test_result, bool is_return) 292922dd58SJiri Olsa { 302922dd58SJiri Olsa void *ip = (void *) bpf_get_func_ip(ctx); 31*1b938f42SJiri Olsa __u64 value = 0, ret = 0, cookie = 0; 322922dd58SJiri Olsa long err = 0; 332922dd58SJiri Olsa 342922dd58SJiri Olsa if (bpf_get_current_pid_tgid() >> 32 != pid) 352922dd58SJiri Olsa return 1; 362922dd58SJiri Olsa 372922dd58SJiri Olsa if (is_return) 382922dd58SJiri Olsa err |= bpf_get_func_ret(ctx, &ret); 39*1b938f42SJiri Olsa if (test_cookies) 40*1b938f42SJiri Olsa cookie = bpf_get_attach_cookie(ctx); 412922dd58SJiri Olsa 422922dd58SJiri Olsa if (ip == &bpf_fentry_test1) { 432922dd58SJiri Olsa int a; 442922dd58SJiri Olsa 452922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 462922dd58SJiri Olsa a = (int) value; 472922dd58SJiri Olsa 482922dd58SJiri Olsa err |= is_return ? ret != 2 : 0; 49*1b938f42SJiri Olsa err |= test_cookies ? cookie != 8 : 0; 502922dd58SJiri Olsa 512922dd58SJiri Olsa *test_result += err == 0 && a == 1; 522922dd58SJiri Olsa } else if (ip == &bpf_fentry_test2) { 532922dd58SJiri Olsa __u64 b; 542922dd58SJiri Olsa int a; 552922dd58SJiri Olsa 562922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 572922dd58SJiri Olsa a = (int) value; 582922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 592922dd58SJiri Olsa b = value; 602922dd58SJiri Olsa 612922dd58SJiri Olsa err |= is_return ? ret != 5 : 0; 62*1b938f42SJiri Olsa err |= test_cookies ? cookie != 9 : 0; 632922dd58SJiri Olsa 642922dd58SJiri Olsa *test_result += err == 0 && a == 2 && b == 3; 652922dd58SJiri Olsa } else if (ip == &bpf_fentry_test3) { 662922dd58SJiri Olsa __u64 c; 672922dd58SJiri Olsa char a; 682922dd58SJiri Olsa int b; 692922dd58SJiri Olsa 702922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 712922dd58SJiri Olsa a = (char) value; 722922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 732922dd58SJiri Olsa b = (int) value; 742922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 2, &value); 752922dd58SJiri Olsa c = value; 762922dd58SJiri Olsa 772922dd58SJiri Olsa err |= is_return ? ret != 15 : 0; 78*1b938f42SJiri Olsa err |= test_cookies ? cookie != 7 : 0; 792922dd58SJiri Olsa 802922dd58SJiri Olsa *test_result += err == 0 && a == 4 && b == 5 && c == 6; 812922dd58SJiri Olsa } else if (ip == &bpf_fentry_test4) { 822922dd58SJiri Olsa void *a; 832922dd58SJiri Olsa char b; 842922dd58SJiri Olsa int c; 852922dd58SJiri Olsa __u64 d; 862922dd58SJiri Olsa 872922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 882922dd58SJiri Olsa a = (void *) value; 892922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 902922dd58SJiri Olsa b = (char) value; 912922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 2, &value); 922922dd58SJiri Olsa c = (int) value; 932922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 3, &value); 942922dd58SJiri Olsa d = value; 952922dd58SJiri Olsa 962922dd58SJiri Olsa err |= is_return ? ret != 34 : 0; 97*1b938f42SJiri Olsa err |= test_cookies ? cookie != 5 : 0; 982922dd58SJiri Olsa 992922dd58SJiri Olsa *test_result += err == 0 && a == (void *) 7 && b == 8 && c == 9 && d == 10; 1002922dd58SJiri Olsa } else if (ip == &bpf_fentry_test5) { 1012922dd58SJiri Olsa __u64 a; 1022922dd58SJiri Olsa void *b; 1032922dd58SJiri Olsa short c; 1042922dd58SJiri Olsa int d; 1052922dd58SJiri Olsa __u64 e; 1062922dd58SJiri Olsa 1072922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 1082922dd58SJiri Olsa a = value; 1092922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 1102922dd58SJiri Olsa b = (void *) value; 1112922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 2, &value); 1122922dd58SJiri Olsa c = (short) value; 1132922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 3, &value); 1142922dd58SJiri Olsa d = (int) value; 1152922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 4, &value); 1162922dd58SJiri Olsa e = value; 1172922dd58SJiri Olsa 1182922dd58SJiri Olsa err |= is_return ? ret != 65 : 0; 119*1b938f42SJiri Olsa err |= test_cookies ? cookie != 4 : 0; 1202922dd58SJiri Olsa 1212922dd58SJiri Olsa *test_result += err == 0 && a == 11 && b == (void *) 12 && c == 13 && d == 14 && e == 15; 1222922dd58SJiri Olsa } else if (ip == &bpf_fentry_test6) { 1232922dd58SJiri Olsa __u64 a; 1242922dd58SJiri Olsa void *b; 1252922dd58SJiri Olsa short c; 1262922dd58SJiri Olsa int d; 1272922dd58SJiri Olsa void *e; 1282922dd58SJiri Olsa __u64 f; 1292922dd58SJiri Olsa 1302922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 1312922dd58SJiri Olsa a = value; 1322922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 1332922dd58SJiri Olsa b = (void *) value; 1342922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 2, &value); 1352922dd58SJiri Olsa c = (short) value; 1362922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 3, &value); 1372922dd58SJiri Olsa d = (int) value; 1382922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 4, &value); 1392922dd58SJiri Olsa e = (void *) value; 1402922dd58SJiri Olsa err |= bpf_get_func_arg(ctx, 5, &value); 1412922dd58SJiri Olsa f = value; 1422922dd58SJiri Olsa 1432922dd58SJiri Olsa err |= is_return ? ret != 111 : 0; 144*1b938f42SJiri Olsa err |= test_cookies ? cookie != 2 : 0; 1452922dd58SJiri Olsa 1462922dd58SJiri Olsa *test_result += err == 0 && a == 16 && b == (void *) 17 && c == 18 && d == 19 && e == (void *) 20 && f == 21; 1472922dd58SJiri Olsa } else if (ip == &bpf_fentry_test7) { 1482922dd58SJiri Olsa err |= is_return ? ret != 0 : 0; 149*1b938f42SJiri Olsa err |= test_cookies ? cookie != 3 : 0; 1502922dd58SJiri Olsa 1512922dd58SJiri Olsa *test_result += err == 0 ? 1 : 0; 1522922dd58SJiri Olsa } else if (ip == &bpf_fentry_test8) { 1532922dd58SJiri Olsa err |= is_return ? ret != 0 : 0; 154*1b938f42SJiri Olsa err |= test_cookies ? cookie != 1 : 0; 1552922dd58SJiri Olsa 1562922dd58SJiri Olsa *test_result += err == 0 ? 1 : 0; 1572922dd58SJiri Olsa } else if (ip == &bpf_fentry_test9) { 1582922dd58SJiri Olsa err |= is_return ? ret != 0 : 0; 159*1b938f42SJiri Olsa err |= test_cookies ? cookie != 10 : 0; 1602922dd58SJiri Olsa 1612922dd58SJiri Olsa *test_result += err == 0 ? 1 : 0; 1622922dd58SJiri Olsa } else if (ip == &bpf_fentry_test10) { 1632922dd58SJiri Olsa err |= is_return ? ret != 0 : 0; 164*1b938f42SJiri Olsa err |= test_cookies ? cookie != 6 : 0; 1652922dd58SJiri Olsa 1662922dd58SJiri Olsa *test_result += err == 0 ? 1 : 0; 1672863f074SJiri Olsa } else if (ip == &bpf_testmod_fentry_test1) { 1682863f074SJiri Olsa int a; 1692863f074SJiri Olsa 1702863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 1712863f074SJiri Olsa a = (int) value; 1722863f074SJiri Olsa 1732863f074SJiri Olsa err |= is_return ? ret != 2 : 0; 1742863f074SJiri Olsa 1752863f074SJiri Olsa *test_result += err == 0 && a == 1; 1762863f074SJiri Olsa } else if (ip == &bpf_testmod_fentry_test2) { 1772863f074SJiri Olsa int a; 1782863f074SJiri Olsa __u64 b; 1792863f074SJiri Olsa 1802863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 1812863f074SJiri Olsa a = (int) value; 1822863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 1832863f074SJiri Olsa b = (__u64) value; 1842863f074SJiri Olsa 1852863f074SJiri Olsa err |= is_return ? ret != 5 : 0; 1862863f074SJiri Olsa 1872863f074SJiri Olsa *test_result += err == 0 && a == 2 && b == 3; 1882863f074SJiri Olsa } else if (ip == &bpf_testmod_fentry_test3) { 1892863f074SJiri Olsa char a; 1902863f074SJiri Olsa int b; 1912863f074SJiri Olsa __u64 c; 1922863f074SJiri Olsa 1932863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 0, &value); 1942863f074SJiri Olsa a = (char) value; 1952863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 1, &value); 1962863f074SJiri Olsa b = (int) value; 1972863f074SJiri Olsa err |= bpf_get_func_arg(ctx, 2, &value); 1982863f074SJiri Olsa c = (__u64) value; 1992863f074SJiri Olsa 2002863f074SJiri Olsa err |= is_return ? ret != 15 : 0; 2012863f074SJiri Olsa 2022863f074SJiri Olsa *test_result += err == 0 && a == 4 && b == 5 && c == 6; 2032863f074SJiri Olsa } else if (ip == &bpf_testmod_fentry_test7) { 2042863f074SJiri Olsa err |= is_return ? ret != 133 : 0; 2052863f074SJiri Olsa 2062863f074SJiri Olsa *test_result += err == 0; 2072863f074SJiri Olsa } else if (ip == &bpf_testmod_fentry_test11) { 2082863f074SJiri Olsa err |= is_return ? ret != 231 : 0; 2092863f074SJiri Olsa 2102863f074SJiri Olsa *test_result += err == 0; 2112922dd58SJiri Olsa } 2122922dd58SJiri Olsa 2132922dd58SJiri Olsa return 0; 2142922dd58SJiri Olsa } 215