brintos

brintos / linux-shallow public Read only

0
0
Text · 2.8 KiB · e0f34a5 Raw
124 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/bpf.h>3#include <bpf/bpf_helpers.h>4#include <bpf/bpf_tracing.h>5#include <errno.h>6 7char _license[] SEC("license") = "GPL";8 9__u64 test1_result = 0;10SEC("fentry/bpf_fentry_test1")11int BPF_PROG(test1)12{13	__u64 cnt = bpf_get_func_arg_cnt(ctx);14	__u64 a = 0, z = 0, ret = 0;15	__s64 err;16 17	test1_result = cnt == 1;18 19	/* valid arguments */20	err = bpf_get_func_arg(ctx, 0, &a);21 22	/* We need to cast access to traced function argument values with23	 * proper type cast, because trampoline uses type specific instruction24	 * to save it, like for 'int a' with 32-bit mov like:25	 *26	 *   mov %edi,-0x8(%rbp)27	 *28	 * so the upper 4 bytes are not zeroed.29	 */30	test1_result &= err == 0 && ((int) a == 1);31 32	/* not valid argument */33	err = bpf_get_func_arg(ctx, 1, &z);34	test1_result &= err == -EINVAL;35 36	/* return value fails in fentry */37	err = bpf_get_func_ret(ctx, &ret);38	test1_result &= err == -EOPNOTSUPP;39	return 0;40}41 42__u64 test2_result = 0;43SEC("fexit/bpf_fentry_test2")44int BPF_PROG(test2)45{46	__u64 cnt = bpf_get_func_arg_cnt(ctx);47	__u64 a = 0, b = 0, z = 0, ret = 0;48	__s64 err;49 50	test2_result = cnt == 2;51 52	/* valid arguments */53	err = bpf_get_func_arg(ctx, 0, &a);54	test2_result &= err == 0 && (int) a == 2;55 56	err = bpf_get_func_arg(ctx, 1, &b);57	test2_result &= err == 0 && b == 3;58 59	/* not valid argument */60	err = bpf_get_func_arg(ctx, 2, &z);61	test2_result &= err == -EINVAL;62 63	/* return value */64	err = bpf_get_func_ret(ctx, &ret);65	test2_result &= err == 0 && ret == 5;66	return 0;67}68 69__u64 test3_result = 0;70SEC("fmod_ret/bpf_modify_return_test")71int BPF_PROG(fmod_ret_test, int _a, int *_b, int _ret)72{73	__u64 cnt = bpf_get_func_arg_cnt(ctx);74	__u64 a = 0, b = 0, z = 0, ret = 0;75	__s64 err;76 77	test3_result = cnt == 2;78 79	/* valid arguments */80	err = bpf_get_func_arg(ctx, 0, &a);81	test3_result &= err == 0 && ((int) a == 1);82 83	err = bpf_get_func_arg(ctx, 1, &b);84	test3_result &= err == 0 && ((int *) b == _b);85 86	/* not valid argument */87	err = bpf_get_func_arg(ctx, 2, &z);88	test3_result &= err == -EINVAL;89 90	/* return value */91	err = bpf_get_func_ret(ctx, &ret);92	test3_result &= err == 0 && ret == 0;93 94	/* change return value, it's checked in fexit_test program */95	return 1234;96}97 98__u64 test4_result = 0;99SEC("fexit/bpf_modify_return_test")100int BPF_PROG(fexit_test, int _a, int *_b, int _ret)101{102	__u64 cnt = bpf_get_func_arg_cnt(ctx);103	__u64 a = 0, b = 0, z = 0, ret = 0;104	__s64 err;105 106	test4_result = cnt == 2;107 108	/* valid arguments */109	err = bpf_get_func_arg(ctx, 0, &a);110	test4_result &= err == 0 && ((int) a == 1);111 112	err = bpf_get_func_arg(ctx, 1, &b);113	test4_result &= err == 0 && ((int *) b == _b);114 115	/* not valid argument */116	err = bpf_get_func_arg(ctx, 2, &z);117	test4_result &= err == -EINVAL;118 119	/* return value */120	err = bpf_get_func_ret(ctx, &ret);121	test4_result &= err == 0 && ret == 1234;122	return 0;123}124