1 // SPDX-License-Identifier: GPL-2.0 2 3 /* 4 * Copyright 2020 Google LLC. 5 */ 6 7 #include <linux/bpf.h> 8 #include <bpf/bpf_helpers.h> 9 #include <bpf/bpf_tracing.h> 10 11 char _license[] SEC("license") = "GPL"; 12 13 static int sequence = 0; 14 __s32 input_retval = 0; 15 16 __u64 fentry_result = 0; 17 SEC("fentry/bpf_modify_return_test") 18 int BPF_PROG(fentry_test, int a, __u64 b) 19 { 20 sequence++; 21 fentry_result = (sequence == 1); 22 return 0; 23 } 24 25 __u64 fmod_ret_result = 0; 26 SEC("fmod_ret/bpf_modify_return_test") 27 int BPF_PROG(fmod_ret_test, int a, int *b, int ret) 28 { 29 sequence++; 30 /* This is the first fmod_ret program, the ret passed should be 0 */ 31 fmod_ret_result = (sequence == 2 && ret == 0); 32 return input_retval; 33 } 34 35 __u64 fexit_result = 0; 36 SEC("fexit/bpf_modify_return_test") 37 int BPF_PROG(fexit_test, int a, __u64 b, int ret) 38 { 39 sequence++; 40 /* If the input_reval is non-zero a successful modification should have 41 * occurred. 42 */ 43 if (input_retval) 44 fexit_result = (sequence == 3 && ret == input_retval); 45 else 46 fexit_result = (sequence == 3 && ret == 4); 47 48 return 0; 49 } 50 51 static int sequence2; 52 53 __u64 fentry_result2 = 0; 54 SEC("fentry/bpf_modify_return_test2") 55 int BPF_PROG(fentry_test2, int a, int *b, short c, int d, void *e, char f, 56 int g) 57 { 58 sequence2++; 59 fentry_result2 = (sequence2 == 1); 60 return 0; 61 } 62 63 __u64 fmod_ret_result2 = 0; 64 SEC("fmod_ret/bpf_modify_return_test2") 65 int BPF_PROG(fmod_ret_test2, int a, int *b, short c, int d, void *e, char f, 66 int g, int ret) 67 { 68 sequence2++; 69 /* This is the first fmod_ret program, the ret passed should be 0 */ 70 fmod_ret_result2 = (sequence2 == 2 && ret == 0); 71 return input_retval; 72 } 73 74 __u64 fexit_result2 = 0; 75 SEC("fexit/bpf_modify_return_test2") 76 int BPF_PROG(fexit_test2, int a, int *b, short c, int d, void *e, char f, 77 int g, int ret) 78 { 79 sequence2++; 80 /* If the input_reval is non-zero a successful modification should have 81 * occurred. 82 */ 83 if (input_retval) 84 fexit_result2 = (sequence2 == 3 && ret == input_retval); 85 else 86 fexit_result2 = (sequence2 == 3 && ret == 29); 87 88 return 0; 89 } 90