xref: /linux/tools/testing/selftests/bpf/progs/tracing_multi_check.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
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