1*f59b1460SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2*f59b1460SAndrii Nakryiko /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
3*f59b1460SAndrii Nakryiko 
4*f59b1460SAndrii Nakryiko #include <limits.h>
5*f59b1460SAndrii Nakryiko #include <linux/errno.h>
6*f59b1460SAndrii Nakryiko #include "vmlinux.h"
7*f59b1460SAndrii Nakryiko #include <bpf/bpf_helpers.h>
8*f59b1460SAndrii Nakryiko #include "bpf_misc.h"
9*f59b1460SAndrii Nakryiko 
10*f59b1460SAndrii Nakryiko const volatile __s64 exp_empty_zero = 0 + 1;
11*f59b1460SAndrii Nakryiko __s64 res_empty_zero;
12*f59b1460SAndrii Nakryiko 
13*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_empty_zero(const void * ctx)14*f59b1460SAndrii Nakryiko int num_empty_zero(const void *ctx)
15*f59b1460SAndrii Nakryiko {
16*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
17*f59b1460SAndrii Nakryiko 
18*f59b1460SAndrii Nakryiko 	bpf_for(i, 0, 0) sum += i;
19*f59b1460SAndrii Nakryiko 	res_empty_zero = 1 + sum;
20*f59b1460SAndrii Nakryiko 
21*f59b1460SAndrii Nakryiko 	return 0;
22*f59b1460SAndrii Nakryiko }
23*f59b1460SAndrii Nakryiko 
24*f59b1460SAndrii Nakryiko const volatile __s64 exp_empty_int_min = 0 + 2;
25*f59b1460SAndrii Nakryiko __s64 res_empty_int_min;
26*f59b1460SAndrii Nakryiko 
27*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_empty_int_min(const void * ctx)28*f59b1460SAndrii Nakryiko int num_empty_int_min(const void *ctx)
29*f59b1460SAndrii Nakryiko {
30*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
31*f59b1460SAndrii Nakryiko 
32*f59b1460SAndrii Nakryiko 	bpf_for(i, INT_MIN, INT_MIN) sum += i;
33*f59b1460SAndrii Nakryiko 	res_empty_int_min = 2 + sum;
34*f59b1460SAndrii Nakryiko 
35*f59b1460SAndrii Nakryiko 	return 0;
36*f59b1460SAndrii Nakryiko }
37*f59b1460SAndrii Nakryiko 
38*f59b1460SAndrii Nakryiko const volatile __s64 exp_empty_int_max = 0 + 3;
39*f59b1460SAndrii Nakryiko __s64 res_empty_int_max;
40*f59b1460SAndrii Nakryiko 
41*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_empty_int_max(const void * ctx)42*f59b1460SAndrii Nakryiko int num_empty_int_max(const void *ctx)
43*f59b1460SAndrii Nakryiko {
44*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
45*f59b1460SAndrii Nakryiko 
46*f59b1460SAndrii Nakryiko 	bpf_for(i, INT_MAX, INT_MAX) sum += i;
47*f59b1460SAndrii Nakryiko 	res_empty_int_max = 3 + sum;
48*f59b1460SAndrii Nakryiko 
49*f59b1460SAndrii Nakryiko 	return 0;
50*f59b1460SAndrii Nakryiko }
51*f59b1460SAndrii Nakryiko 
52*f59b1460SAndrii Nakryiko const volatile __s64 exp_empty_minus_one = 0 + 4;
53*f59b1460SAndrii Nakryiko __s64 res_empty_minus_one;
54*f59b1460SAndrii Nakryiko 
55*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_empty_minus_one(const void * ctx)56*f59b1460SAndrii Nakryiko int num_empty_minus_one(const void *ctx)
57*f59b1460SAndrii Nakryiko {
58*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
59*f59b1460SAndrii Nakryiko 
60*f59b1460SAndrii Nakryiko 	bpf_for(i, -1, -1) sum += i;
61*f59b1460SAndrii Nakryiko 	res_empty_minus_one = 4 + sum;
62*f59b1460SAndrii Nakryiko 
63*f59b1460SAndrii Nakryiko 	return 0;
64*f59b1460SAndrii Nakryiko }
65*f59b1460SAndrii Nakryiko 
66*f59b1460SAndrii Nakryiko const volatile __s64 exp_simple_sum = 9 * 10 / 2;
67*f59b1460SAndrii Nakryiko __s64 res_simple_sum;
68*f59b1460SAndrii Nakryiko 
69*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_simple_sum(const void * ctx)70*f59b1460SAndrii Nakryiko int num_simple_sum(const void *ctx)
71*f59b1460SAndrii Nakryiko {
72*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
73*f59b1460SAndrii Nakryiko 
74*f59b1460SAndrii Nakryiko 	bpf_for(i, 0, 10) sum += i;
75*f59b1460SAndrii Nakryiko 	res_simple_sum = sum;
76*f59b1460SAndrii Nakryiko 
77*f59b1460SAndrii Nakryiko 	return 0;
78*f59b1460SAndrii Nakryiko }
79*f59b1460SAndrii Nakryiko 
80*f59b1460SAndrii Nakryiko const volatile __s64 exp_neg_sum = -11 * 10 / 2;
81*f59b1460SAndrii Nakryiko __s64 res_neg_sum;
82*f59b1460SAndrii Nakryiko 
83*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_neg_sum(const void * ctx)84*f59b1460SAndrii Nakryiko int num_neg_sum(const void *ctx)
85*f59b1460SAndrii Nakryiko {
86*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
87*f59b1460SAndrii Nakryiko 
88*f59b1460SAndrii Nakryiko 	bpf_for(i, -10, 0) sum += i;
89*f59b1460SAndrii Nakryiko 	res_neg_sum = sum;
90*f59b1460SAndrii Nakryiko 
91*f59b1460SAndrii Nakryiko 	return 0;
92*f59b1460SAndrii Nakryiko }
93*f59b1460SAndrii Nakryiko 
94*f59b1460SAndrii Nakryiko const volatile __s64 exp_very_neg_sum = INT_MIN + (__s64)(INT_MIN + 1);
95*f59b1460SAndrii Nakryiko __s64 res_very_neg_sum;
96*f59b1460SAndrii Nakryiko 
97*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_very_neg_sum(const void * ctx)98*f59b1460SAndrii Nakryiko int num_very_neg_sum(const void *ctx)
99*f59b1460SAndrii Nakryiko {
100*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
101*f59b1460SAndrii Nakryiko 
102*f59b1460SAndrii Nakryiko 	bpf_for(i, INT_MIN, INT_MIN + 2) sum += i;
103*f59b1460SAndrii Nakryiko 	res_very_neg_sum = sum;
104*f59b1460SAndrii Nakryiko 
105*f59b1460SAndrii Nakryiko 	return 0;
106*f59b1460SAndrii Nakryiko }
107*f59b1460SAndrii Nakryiko 
108*f59b1460SAndrii Nakryiko const volatile __s64 exp_very_big_sum = (__s64)(INT_MAX - 1) + (__s64)(INT_MAX - 2);
109*f59b1460SAndrii Nakryiko __s64 res_very_big_sum;
110*f59b1460SAndrii Nakryiko 
111*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_very_big_sum(const void * ctx)112*f59b1460SAndrii Nakryiko int num_very_big_sum(const void *ctx)
113*f59b1460SAndrii Nakryiko {
114*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
115*f59b1460SAndrii Nakryiko 
116*f59b1460SAndrii Nakryiko 	bpf_for(i, INT_MAX - 2, INT_MAX) sum += i;
117*f59b1460SAndrii Nakryiko 	res_very_big_sum = sum;
118*f59b1460SAndrii Nakryiko 
119*f59b1460SAndrii Nakryiko 	return 0;
120*f59b1460SAndrii Nakryiko }
121*f59b1460SAndrii Nakryiko 
122*f59b1460SAndrii Nakryiko const volatile __s64 exp_neg_pos_sum = -3;
123*f59b1460SAndrii Nakryiko __s64 res_neg_pos_sum;
124*f59b1460SAndrii Nakryiko 
125*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_neg_pos_sum(const void * ctx)126*f59b1460SAndrii Nakryiko int num_neg_pos_sum(const void *ctx)
127*f59b1460SAndrii Nakryiko {
128*f59b1460SAndrii Nakryiko 	__s64 sum = 0, i;
129*f59b1460SAndrii Nakryiko 
130*f59b1460SAndrii Nakryiko 	bpf_for(i, -3, 3) sum += i;
131*f59b1460SAndrii Nakryiko 	res_neg_pos_sum = sum;
132*f59b1460SAndrii Nakryiko 
133*f59b1460SAndrii Nakryiko 	return 0;
134*f59b1460SAndrii Nakryiko }
135*f59b1460SAndrii Nakryiko 
136*f59b1460SAndrii Nakryiko const volatile __s64 exp_invalid_range = -EINVAL;
137*f59b1460SAndrii Nakryiko __s64 res_invalid_range;
138*f59b1460SAndrii Nakryiko 
139*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_invalid_range(const void * ctx)140*f59b1460SAndrii Nakryiko int num_invalid_range(const void *ctx)
141*f59b1460SAndrii Nakryiko {
142*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
143*f59b1460SAndrii Nakryiko 
144*f59b1460SAndrii Nakryiko 	res_invalid_range = bpf_iter_num_new(&it, 1, 0);
145*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
146*f59b1460SAndrii Nakryiko 
147*f59b1460SAndrii Nakryiko 	return 0;
148*f59b1460SAndrii Nakryiko }
149*f59b1460SAndrii Nakryiko 
150*f59b1460SAndrii Nakryiko const volatile __s64 exp_max_range = 0 + 10;
151*f59b1460SAndrii Nakryiko __s64 res_max_range;
152*f59b1460SAndrii Nakryiko 
153*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_max_range(const void * ctx)154*f59b1460SAndrii Nakryiko int num_max_range(const void *ctx)
155*f59b1460SAndrii Nakryiko {
156*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
157*f59b1460SAndrii Nakryiko 
158*f59b1460SAndrii Nakryiko 	res_max_range = 10 + bpf_iter_num_new(&it, 0, BPF_MAX_LOOPS);
159*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
160*f59b1460SAndrii Nakryiko 
161*f59b1460SAndrii Nakryiko 	return 0;
162*f59b1460SAndrii Nakryiko }
163*f59b1460SAndrii Nakryiko 
164*f59b1460SAndrii Nakryiko const volatile __s64 exp_e2big_range = -E2BIG;
165*f59b1460SAndrii Nakryiko __s64 res_e2big_range;
166*f59b1460SAndrii Nakryiko 
167*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_e2big_range(const void * ctx)168*f59b1460SAndrii Nakryiko int num_e2big_range(const void *ctx)
169*f59b1460SAndrii Nakryiko {
170*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
171*f59b1460SAndrii Nakryiko 
172*f59b1460SAndrii Nakryiko 	res_e2big_range = bpf_iter_num_new(&it, -1, BPF_MAX_LOOPS);
173*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
174*f59b1460SAndrii Nakryiko 
175*f59b1460SAndrii Nakryiko 	return 0;
176*f59b1460SAndrii Nakryiko }
177*f59b1460SAndrii Nakryiko 
178*f59b1460SAndrii Nakryiko const volatile __s64 exp_succ_elem_cnt = 10;
179*f59b1460SAndrii Nakryiko __s64 res_succ_elem_cnt;
180*f59b1460SAndrii Nakryiko 
181*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_succ_elem_cnt(const void * ctx)182*f59b1460SAndrii Nakryiko int num_succ_elem_cnt(const void *ctx)
183*f59b1460SAndrii Nakryiko {
184*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
185*f59b1460SAndrii Nakryiko 	int cnt = 0, *v;
186*f59b1460SAndrii Nakryiko 
187*f59b1460SAndrii Nakryiko 	bpf_iter_num_new(&it, 0, 10);
188*f59b1460SAndrii Nakryiko 	while ((v = bpf_iter_num_next(&it))) {
189*f59b1460SAndrii Nakryiko 		cnt++;
190*f59b1460SAndrii Nakryiko 	}
191*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
192*f59b1460SAndrii Nakryiko 
193*f59b1460SAndrii Nakryiko 	res_succ_elem_cnt = cnt;
194*f59b1460SAndrii Nakryiko 
195*f59b1460SAndrii Nakryiko 	return 0;
196*f59b1460SAndrii Nakryiko }
197*f59b1460SAndrii Nakryiko 
198*f59b1460SAndrii Nakryiko const volatile __s64 exp_overfetched_elem_cnt = 5;
199*f59b1460SAndrii Nakryiko __s64 res_overfetched_elem_cnt;
200*f59b1460SAndrii Nakryiko 
201*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_overfetched_elem_cnt(const void * ctx)202*f59b1460SAndrii Nakryiko int num_overfetched_elem_cnt(const void *ctx)
203*f59b1460SAndrii Nakryiko {
204*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
205*f59b1460SAndrii Nakryiko 	int cnt = 0, *v, i;
206*f59b1460SAndrii Nakryiko 
207*f59b1460SAndrii Nakryiko 	bpf_iter_num_new(&it, 0, 5);
208*f59b1460SAndrii Nakryiko 	for (i = 0; i < 10; i++) {
209*f59b1460SAndrii Nakryiko 		v = bpf_iter_num_next(&it);
210*f59b1460SAndrii Nakryiko 		if (v)
211*f59b1460SAndrii Nakryiko 			cnt++;
212*f59b1460SAndrii Nakryiko 	}
213*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
214*f59b1460SAndrii Nakryiko 
215*f59b1460SAndrii Nakryiko 	res_overfetched_elem_cnt = cnt;
216*f59b1460SAndrii Nakryiko 
217*f59b1460SAndrii Nakryiko 	return 0;
218*f59b1460SAndrii Nakryiko }
219*f59b1460SAndrii Nakryiko 
220*f59b1460SAndrii Nakryiko const volatile __s64 exp_fail_elem_cnt = 20 + 0;
221*f59b1460SAndrii Nakryiko __s64 res_fail_elem_cnt;
222*f59b1460SAndrii Nakryiko 
223*f59b1460SAndrii Nakryiko SEC("raw_tp/sys_enter")
num_fail_elem_cnt(const void * ctx)224*f59b1460SAndrii Nakryiko int num_fail_elem_cnt(const void *ctx)
225*f59b1460SAndrii Nakryiko {
226*f59b1460SAndrii Nakryiko 	struct bpf_iter_num it;
227*f59b1460SAndrii Nakryiko 	int cnt = 0, *v, i;
228*f59b1460SAndrii Nakryiko 
229*f59b1460SAndrii Nakryiko 	bpf_iter_num_new(&it, 100, 10);
230*f59b1460SAndrii Nakryiko 	for (i = 0; i < 10; i++) {
231*f59b1460SAndrii Nakryiko 		v = bpf_iter_num_next(&it);
232*f59b1460SAndrii Nakryiko 		if (v)
233*f59b1460SAndrii Nakryiko 			cnt++;
234*f59b1460SAndrii Nakryiko 	}
235*f59b1460SAndrii Nakryiko 	bpf_iter_num_destroy(&it);
236*f59b1460SAndrii Nakryiko 
237*f59b1460SAndrii Nakryiko 	res_fail_elem_cnt = 20 + cnt;
238*f59b1460SAndrii Nakryiko 
239*f59b1460SAndrii Nakryiko 	return 0;
240*f59b1460SAndrii Nakryiko }
241*f59b1460SAndrii Nakryiko 
242*f59b1460SAndrii Nakryiko char _license[] SEC("license") = "GPL";
243