xref: /dpdk/lib/bpf/bpf_validate.c (revision 3b78aa7b2317fb385ed7fa5f5535f60050ede618)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <string.h>
7 #include <errno.h>
8 #include <stdint.h>
9 #include <inttypes.h>
10 
11 #include <rte_common.h>
12 
13 #include "bpf_impl.h"
14 
15 #define BPF_ARG_PTR_STACK RTE_BPF_ARG_RESERVED
16 
17 struct bpf_reg_val {
18 	struct rte_bpf_arg v;
19 	uint64_t mask;
20 	struct {
21 		int64_t min;
22 		int64_t max;
23 	} s;
24 	struct {
25 		uint64_t min;
26 		uint64_t max;
27 	} u;
28 };
29 
30 struct bpf_eval_state {
31 	struct bpf_reg_val rv[EBPF_REG_NUM];
32 	struct bpf_reg_val sv[MAX_BPF_STACK_SIZE / sizeof(uint64_t)];
33 };
34 
35 /* possible instruction node colour */
36 enum {
37 	WHITE,
38 	GREY,
39 	BLACK,
40 	MAX_NODE_COLOUR
41 };
42 
43 /* possible edge types */
44 enum {
45 	UNKNOWN_EDGE,
46 	TREE_EDGE,
47 	BACK_EDGE,
48 	CROSS_EDGE,
49 	MAX_EDGE_TYPE
50 };
51 
52 #define	MAX_EDGES	2
53 
54 struct inst_node {
55 	uint8_t colour;
56 	uint8_t nb_edge:4;
57 	uint8_t cur_edge:4;
58 	uint8_t edge_type[MAX_EDGES];
59 	uint32_t edge_dest[MAX_EDGES];
60 	uint32_t prev_node;
61 	struct bpf_eval_state *evst;
62 };
63 
64 struct bpf_verifier {
65 	const struct rte_bpf_prm *prm;
66 	struct inst_node *in;
67 	uint64_t stack_sz;
68 	uint32_t nb_nodes;
69 	uint32_t nb_jcc_nodes;
70 	uint32_t nb_ldmb_nodes;
71 	uint32_t node_colour[MAX_NODE_COLOUR];
72 	uint32_t edge_type[MAX_EDGE_TYPE];
73 	struct bpf_eval_state *evst;
74 	struct inst_node *evin;
75 	struct {
76 		uint32_t num;
77 		uint32_t cur;
78 		struct bpf_eval_state *ent;
79 	} evst_pool;
80 };
81 
82 struct bpf_ins_check {
83 	struct {
84 		uint16_t dreg;
85 		uint16_t sreg;
86 	} mask;
87 	struct {
88 		uint16_t min;
89 		uint16_t max;
90 	} off;
91 	struct {
92 		uint32_t min;
93 		uint32_t max;
94 	} imm;
95 	const char * (*check)(const struct ebpf_insn *);
96 	const char * (*eval)(struct bpf_verifier *, const struct ebpf_insn *);
97 };
98 
99 #define	ALL_REGS	RTE_LEN2MASK(EBPF_REG_NUM, uint16_t)
100 #define	WRT_REGS	RTE_LEN2MASK(EBPF_REG_10, uint16_t)
101 #define	ZERO_REG	RTE_LEN2MASK(EBPF_REG_1, uint16_t)
102 
103 /* For LD_IND R6 is an implicit CTX register. */
104 #define	IND_SRC_REGS	(WRT_REGS ^ 1 << EBPF_REG_6)
105 
106 /*
107  * check and evaluate functions for particular instruction types.
108  */
109 
110 static const char *
111 check_alu_bele(const struct ebpf_insn *ins)
112 {
113 	if (ins->imm != 16 && ins->imm != 32 && ins->imm != 64)
114 		return "invalid imm field";
115 	return NULL;
116 }
117 
118 static const char *
119 eval_exit(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
120 {
121 	RTE_SET_USED(ins);
122 	if (bvf->evst->rv[EBPF_REG_0].v.type == RTE_BPF_ARG_UNDEF)
123 		return "undefined return value";
124 	return NULL;
125 }
126 
127 /* setup max possible with this mask bounds */
128 static void
129 eval_umax_bound(struct bpf_reg_val *rv, uint64_t mask)
130 {
131 	rv->u.max = mask;
132 	rv->u.min = 0;
133 }
134 
135 static void
136 eval_smax_bound(struct bpf_reg_val *rv, uint64_t mask)
137 {
138 	rv->s.max = mask >> 1;
139 	rv->s.min = rv->s.max ^ UINT64_MAX;
140 }
141 
142 static void
143 eval_max_bound(struct bpf_reg_val *rv, uint64_t mask)
144 {
145 	eval_umax_bound(rv, mask);
146 	eval_smax_bound(rv, mask);
147 }
148 
149 static void
150 eval_fill_max_bound(struct bpf_reg_val *rv, uint64_t mask)
151 {
152 	eval_max_bound(rv, mask);
153 	rv->v.type = RTE_BPF_ARG_RAW;
154 	rv->mask = mask;
155 }
156 
157 static void
158 eval_fill_imm64(struct bpf_reg_val *rv, uint64_t mask, uint64_t val)
159 {
160 	rv->mask = mask;
161 	rv->s.min = val;
162 	rv->s.max = val;
163 	rv->u.min = val;
164 	rv->u.max = val;
165 }
166 
167 static void
168 eval_fill_imm(struct bpf_reg_val *rv, uint64_t mask, int32_t imm)
169 {
170 	uint64_t v;
171 
172 	v = (uint64_t)imm & mask;
173 
174 	rv->v.type = RTE_BPF_ARG_RAW;
175 	eval_fill_imm64(rv, mask, v);
176 }
177 
178 static const char *
179 eval_ld_imm64(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
180 {
181 	uint32_t i;
182 	uint64_t val;
183 	struct bpf_reg_val *rd;
184 
185 	val = (uint32_t)ins[0].imm | (uint64_t)(uint32_t)ins[1].imm << 32;
186 
187 	rd = bvf->evst->rv + ins->dst_reg;
188 	rd->v.type = RTE_BPF_ARG_RAW;
189 	eval_fill_imm64(rd, UINT64_MAX, val);
190 
191 	for (i = 0; i != bvf->prm->nb_xsym; i++) {
192 
193 		/* load of external variable */
194 		if (bvf->prm->xsym[i].type == RTE_BPF_XTYPE_VAR &&
195 				(uintptr_t)bvf->prm->xsym[i].var.val == val) {
196 			rd->v = bvf->prm->xsym[i].var.desc;
197 			eval_fill_imm64(rd, UINT64_MAX, 0);
198 			break;
199 		}
200 	}
201 
202 	return NULL;
203 }
204 
205 static void
206 eval_apply_mask(struct bpf_reg_val *rv, uint64_t mask)
207 {
208 	struct bpf_reg_val rt;
209 
210 	rt.u.min = rv->u.min & mask;
211 	rt.u.max = rv->u.max & mask;
212 	if (rt.u.min != rv->u.min || rt.u.max != rv->u.max) {
213 		rv->u.max = RTE_MAX(rt.u.max, mask);
214 		rv->u.min = 0;
215 	}
216 
217 	eval_smax_bound(&rt, mask);
218 	rv->s.max = RTE_MIN(rt.s.max, rv->s.max);
219 	rv->s.min = RTE_MAX(rt.s.min, rv->s.min);
220 
221 	rv->mask = mask;
222 }
223 
224 static void
225 eval_add(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, uint64_t msk)
226 {
227 	struct bpf_reg_val rv;
228 
229 	rv.u.min = (rd->u.min + rs->u.min) & msk;
230 	rv.u.max = (rd->u.max + rs->u.max) & msk;
231 	rv.s.min = (rd->s.min + rs->s.min) & msk;
232 	rv.s.max = (rd->s.max + rs->s.max) & msk;
233 
234 	/*
235 	 * if at least one of the operands is not constant,
236 	 * then check for overflow
237 	 */
238 	if ((rd->u.min != rd->u.max || rs->u.min != rs->u.max) &&
239 			(rv.u.min < rd->u.min || rv.u.max < rd->u.max))
240 		eval_umax_bound(&rv, msk);
241 
242 	if ((rd->s.min != rd->s.max || rs->s.min != rs->s.max) &&
243 			(((rs->s.min < 0 && rv.s.min > rd->s.min) ||
244 			rv.s.min < rd->s.min) ||
245 			((rs->s.max < 0 && rv.s.max > rd->s.max) ||
246 				rv.s.max < rd->s.max)))
247 		eval_smax_bound(&rv, msk);
248 
249 	rd->s = rv.s;
250 	rd->u = rv.u;
251 }
252 
253 static void
254 eval_sub(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, uint64_t msk)
255 {
256 	struct bpf_reg_val rv;
257 
258 	rv.u.min = (rd->u.min - rs->u.max) & msk;
259 	rv.u.max = (rd->u.max - rs->u.min) & msk;
260 	rv.s.min = (rd->s.min - rs->s.max) & msk;
261 	rv.s.max = (rd->s.max - rs->s.min) & msk;
262 
263 	/*
264 	 * if at least one of the operands is not constant,
265 	 * then check for overflow
266 	 */
267 	if ((rd->u.min != rd->u.max || rs->u.min != rs->u.max) &&
268 			(rv.u.min > rd->u.min || rv.u.max > rd->u.max))
269 		eval_umax_bound(&rv, msk);
270 
271 	if ((rd->s.min != rd->s.max || rs->s.min != rs->s.max) &&
272 			(((rs->s.min < 0 && rv.s.min < rd->s.min) ||
273 			rv.s.min > rd->s.min) ||
274 			((rs->s.max < 0 && rv.s.max < rd->s.max) ||
275 			rv.s.max > rd->s.max)))
276 		eval_smax_bound(&rv, msk);
277 
278 	rd->s = rv.s;
279 	rd->u = rv.u;
280 }
281 
282 static void
283 eval_lsh(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
284 	uint64_t msk)
285 {
286 	/* check if shift value is less then max result bits */
287 	if (rs->u.max >= opsz) {
288 		eval_max_bound(rd, msk);
289 		return;
290 	}
291 
292 	/* check for overflow */
293 	if (rd->u.max > RTE_LEN2MASK(opsz - rs->u.max, uint64_t))
294 		eval_umax_bound(rd, msk);
295 	else {
296 		rd->u.max <<= rs->u.max;
297 		rd->u.min <<= rs->u.min;
298 	}
299 
300 	/* check that dreg values are and would remain always positive */
301 	if ((uint64_t)rd->s.min >> (opsz - 1) != 0 || rd->s.max >=
302 			RTE_LEN2MASK(opsz - rs->u.max - 1, int64_t))
303 		eval_smax_bound(rd, msk);
304 	else {
305 		rd->s.max <<= rs->u.max;
306 		rd->s.min <<= rs->u.min;
307 	}
308 }
309 
310 static void
311 eval_rsh(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
312 	uint64_t msk)
313 {
314 	/* check if shift value is less then max result bits */
315 	if (rs->u.max >= opsz) {
316 		eval_max_bound(rd, msk);
317 		return;
318 	}
319 
320 	rd->u.max >>= rs->u.min;
321 	rd->u.min >>= rs->u.max;
322 
323 	/* check that dreg values are always positive */
324 	if ((uint64_t)rd->s.min >> (opsz - 1) != 0)
325 		eval_smax_bound(rd, msk);
326 	else {
327 		rd->s.max >>= rs->u.min;
328 		rd->s.min >>= rs->u.max;
329 	}
330 }
331 
332 static void
333 eval_arsh(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
334 	uint64_t msk)
335 {
336 	uint32_t shv;
337 
338 	/* check if shift value is less then max result bits */
339 	if (rs->u.max >= opsz) {
340 		eval_max_bound(rd, msk);
341 		return;
342 	}
343 
344 	rd->u.max = (int64_t)rd->u.max >> rs->u.min;
345 	rd->u.min = (int64_t)rd->u.min >> rs->u.max;
346 
347 	/* if we have 32-bit values - extend them to 64-bit */
348 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
349 		rd->s.min <<= opsz;
350 		rd->s.max <<= opsz;
351 		shv = opsz;
352 	} else
353 		shv = 0;
354 
355 	if (rd->s.min < 0)
356 		rd->s.min = (rd->s.min >> (rs->u.min + shv)) & msk;
357 	else
358 		rd->s.min = (rd->s.min >> (rs->u.max + shv)) & msk;
359 
360 	if (rd->s.max < 0)
361 		rd->s.max = (rd->s.max >> (rs->u.max + shv)) & msk;
362 	else
363 		rd->s.max = (rd->s.max >> (rs->u.min + shv)) & msk;
364 }
365 
366 static uint64_t
367 eval_umax_bits(uint64_t v, size_t opsz)
368 {
369 	if (v == 0)
370 		return 0;
371 
372 	v = __builtin_clzll(v);
373 	return RTE_LEN2MASK(opsz - v, uint64_t);
374 }
375 
376 /* estimate max possible value for (v1 & v2) */
377 static uint64_t
378 eval_uand_max(uint64_t v1, uint64_t v2, size_t opsz)
379 {
380 	v1 = eval_umax_bits(v1, opsz);
381 	v2 = eval_umax_bits(v2, opsz);
382 	return (v1 & v2);
383 }
384 
385 /* estimate max possible value for (v1 | v2) */
386 static uint64_t
387 eval_uor_max(uint64_t v1, uint64_t v2, size_t opsz)
388 {
389 	v1 = eval_umax_bits(v1, opsz);
390 	v2 = eval_umax_bits(v2, opsz);
391 	return (v1 | v2);
392 }
393 
394 static void
395 eval_and(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
396 	uint64_t msk)
397 {
398 	/* both operands are constants */
399 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
400 		rd->u.min &= rs->u.min;
401 		rd->u.max &= rs->u.max;
402 	} else {
403 		rd->u.max = eval_uand_max(rd->u.max, rs->u.max, opsz);
404 		rd->u.min &= rs->u.min;
405 	}
406 
407 	/* both operands are constants */
408 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
409 		rd->s.min &= rs->s.min;
410 		rd->s.max &= rs->s.max;
411 	/* at least one of operand is non-negative */
412 	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
413 		rd->s.max = eval_uand_max(rd->s.max & (msk >> 1),
414 			rs->s.max & (msk >> 1), opsz);
415 		rd->s.min &= rs->s.min;
416 	} else
417 		eval_smax_bound(rd, msk);
418 }
419 
420 static void
421 eval_or(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
422 	uint64_t msk)
423 {
424 	/* both operands are constants */
425 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
426 		rd->u.min |= rs->u.min;
427 		rd->u.max |= rs->u.max;
428 	} else {
429 		rd->u.max = eval_uor_max(rd->u.max, rs->u.max, opsz);
430 		rd->u.min |= rs->u.min;
431 	}
432 
433 	/* both operands are constants */
434 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
435 		rd->s.min |= rs->s.min;
436 		rd->s.max |= rs->s.max;
437 
438 	/* both operands are non-negative */
439 	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
440 		rd->s.max = eval_uor_max(rd->s.max, rs->s.max, opsz);
441 		rd->s.min |= rs->s.min;
442 	} else
443 		eval_smax_bound(rd, msk);
444 }
445 
446 static void
447 eval_xor(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
448 	uint64_t msk)
449 {
450 	/* both operands are constants */
451 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
452 		rd->u.min ^= rs->u.min;
453 		rd->u.max ^= rs->u.max;
454 	} else {
455 		rd->u.max = eval_uor_max(rd->u.max, rs->u.max, opsz);
456 		rd->u.min = 0;
457 	}
458 
459 	/* both operands are constants */
460 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
461 		rd->s.min ^= rs->s.min;
462 		rd->s.max ^= rs->s.max;
463 
464 	/* both operands are non-negative */
465 	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
466 		rd->s.max = eval_uor_max(rd->s.max, rs->s.max, opsz);
467 		rd->s.min = 0;
468 	} else
469 		eval_smax_bound(rd, msk);
470 }
471 
472 static void
473 eval_mul(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
474 	uint64_t msk)
475 {
476 	/* both operands are constants */
477 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
478 		rd->u.min = (rd->u.min * rs->u.min) & msk;
479 		rd->u.max = (rd->u.max * rs->u.max) & msk;
480 	/* check for overflow */
481 	} else if (rd->u.max <= msk >> opsz / 2 && rs->u.max <= msk >> opsz) {
482 		rd->u.max *= rs->u.max;
483 		rd->u.min *= rd->u.min;
484 	} else
485 		eval_umax_bound(rd, msk);
486 
487 	/* both operands are constants */
488 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
489 		rd->s.min = (rd->s.min * rs->s.min) & msk;
490 		rd->s.max = (rd->s.max * rs->s.max) & msk;
491 	/* check that both operands are positive and no overflow */
492 	} else if (rd->s.min >= 0 && rs->s.min >= 0) {
493 		rd->s.max *= rs->s.max;
494 		rd->s.min *= rd->s.min;
495 	} else
496 		eval_smax_bound(rd, msk);
497 }
498 
499 static const char *
500 eval_divmod(uint32_t op, struct bpf_reg_val *rd, struct bpf_reg_val *rs,
501 	size_t opsz, uint64_t msk)
502 {
503 	/* both operands are constants */
504 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
505 		if (rs->u.max == 0)
506 			return "division by 0";
507 		if (op == BPF_DIV) {
508 			rd->u.min /= rs->u.min;
509 			rd->u.max /= rs->u.max;
510 		} else {
511 			rd->u.min %= rs->u.min;
512 			rd->u.max %= rs->u.max;
513 		}
514 	} else {
515 		if (op == BPF_MOD)
516 			rd->u.max = RTE_MIN(rd->u.max, rs->u.max - 1);
517 		else
518 			rd->u.max = rd->u.max;
519 		rd->u.min = 0;
520 	}
521 
522 	/* if we have 32-bit values - extend them to 64-bit */
523 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
524 		rd->s.min = (int32_t)rd->s.min;
525 		rd->s.max = (int32_t)rd->s.max;
526 		rs->s.min = (int32_t)rs->s.min;
527 		rs->s.max = (int32_t)rs->s.max;
528 	}
529 
530 	/* both operands are constants */
531 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
532 		if (rs->s.max == 0)
533 			return "division by 0";
534 		if (op == BPF_DIV) {
535 			rd->s.min /= rs->s.min;
536 			rd->s.max /= rs->s.max;
537 		} else {
538 			rd->s.min %= rs->s.min;
539 			rd->s.max %= rs->s.max;
540 		}
541 	} else if (op == BPF_MOD) {
542 		rd->s.min = RTE_MAX(rd->s.max, 0);
543 		rd->s.min = RTE_MIN(rd->s.min, 0);
544 	} else
545 		eval_smax_bound(rd, msk);
546 
547 	rd->s.max &= msk;
548 	rd->s.min &= msk;
549 
550 	return NULL;
551 }
552 
553 static void
554 eval_neg(struct bpf_reg_val *rd, size_t opsz, uint64_t msk)
555 {
556 	uint64_t ux, uy;
557 	int64_t sx, sy;
558 
559 	/* if we have 32-bit values - extend them to 64-bit */
560 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
561 		rd->u.min = (int32_t)rd->u.min;
562 		rd->u.max = (int32_t)rd->u.max;
563 	}
564 
565 	ux = -(int64_t)rd->u.min & msk;
566 	uy = -(int64_t)rd->u.max & msk;
567 
568 	rd->u.max = RTE_MAX(ux, uy);
569 	rd->u.min = RTE_MIN(ux, uy);
570 
571 	/* if we have 32-bit values - extend them to 64-bit */
572 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
573 		rd->s.min = (int32_t)rd->s.min;
574 		rd->s.max = (int32_t)rd->s.max;
575 	}
576 
577 	sx = -rd->s.min & msk;
578 	sy = -rd->s.max & msk;
579 
580 	rd->s.max = RTE_MAX(sx, sy);
581 	rd->s.min = RTE_MIN(sx, sy);
582 }
583 
584 static const char *
585 eval_ld_mbuf(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
586 {
587 	uint32_t i, mode;
588 	struct bpf_reg_val *rv, ri, rs;
589 
590 	mode = BPF_MODE(ins->code);
591 
592 	/* R6 is an implicit input that must contain pointer to mbuf */
593 	if (bvf->evst->rv[EBPF_REG_6].v.type != RTE_BPF_ARG_PTR_MBUF)
594 		return "invalid type for implicit ctx register";
595 
596 	if (mode == BPF_IND) {
597 		rs = bvf->evst->rv[ins->src_reg];
598 		if (rs.v.type != RTE_BPF_ARG_RAW)
599 			return "unexpected type for src register";
600 
601 		eval_fill_imm(&ri, UINT64_MAX, ins->imm);
602 		eval_add(&rs, &ri, UINT64_MAX);
603 
604 		if (rs.s.max < 0 || rs.u.min > UINT32_MAX)
605 			return "mbuf boundary violation";
606 	}
607 
608 	/* R1-R5 scratch registers */
609 	for (i = EBPF_REG_1; i != EBPF_REG_6; i++)
610 		bvf->evst->rv[i].v.type = RTE_BPF_ARG_UNDEF;
611 
612 	/* R0 is an implicit output, contains data fetched from the packet */
613 	rv = bvf->evst->rv + EBPF_REG_0;
614 	rv->v.size = bpf_size(BPF_SIZE(ins->code));
615 	eval_fill_max_bound(rv, RTE_LEN2MASK(rv->v.size * CHAR_BIT, uint64_t));
616 
617 	return NULL;
618 }
619 
620 /*
621  * check that destination and source operand are in defined state.
622  */
623 static const char *
624 eval_defined(const struct bpf_reg_val *dst, const struct bpf_reg_val *src)
625 {
626 	if (dst != NULL && dst->v.type == RTE_BPF_ARG_UNDEF)
627 		return "dest reg value is undefined";
628 	if (src != NULL && src->v.type == RTE_BPF_ARG_UNDEF)
629 		return "src reg value is undefined";
630 	return NULL;
631 }
632 
633 static const char *
634 eval_alu(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
635 {
636 	uint64_t msk;
637 	uint32_t op;
638 	size_t opsz;
639 	const char *err;
640 	struct bpf_eval_state *st;
641 	struct bpf_reg_val *rd, rs;
642 
643 	opsz = (BPF_CLASS(ins->code) == BPF_ALU) ?
644 		sizeof(uint32_t) : sizeof(uint64_t);
645 	opsz = opsz * CHAR_BIT;
646 	msk = RTE_LEN2MASK(opsz, uint64_t);
647 
648 	st = bvf->evst;
649 	rd = st->rv + ins->dst_reg;
650 
651 	if (BPF_SRC(ins->code) == BPF_X) {
652 		rs = st->rv[ins->src_reg];
653 		eval_apply_mask(&rs, msk);
654 	} else
655 		eval_fill_imm(&rs, msk, ins->imm);
656 
657 	eval_apply_mask(rd, msk);
658 
659 	op = BPF_OP(ins->code);
660 
661 	/* Allow self-xor as way to zero register */
662 	if (op == BPF_XOR && BPF_SRC(ins->code) == BPF_X &&
663 	    ins->src_reg == ins->dst_reg) {
664 		eval_fill_imm(&rs, UINT64_MAX, 0);
665 		eval_fill_imm(rd, UINT64_MAX, 0);
666 	}
667 
668 	err = eval_defined((op != EBPF_MOV) ? rd : NULL,
669 			   (op != BPF_NEG) ? &rs : NULL);
670 	if (err != NULL)
671 		return err;
672 
673 	if (op == BPF_ADD)
674 		eval_add(rd, &rs, msk);
675 	else if (op == BPF_SUB)
676 		eval_sub(rd, &rs, msk);
677 	else if (op == BPF_LSH)
678 		eval_lsh(rd, &rs, opsz, msk);
679 	else if (op == BPF_RSH)
680 		eval_rsh(rd, &rs, opsz, msk);
681 	else if (op == EBPF_ARSH)
682 		eval_arsh(rd, &rs, opsz, msk);
683 	else if (op == BPF_AND)
684 		eval_and(rd, &rs, opsz, msk);
685 	else if (op == BPF_OR)
686 		eval_or(rd, &rs, opsz, msk);
687 	else if (op == BPF_XOR)
688 		eval_xor(rd, &rs, opsz, msk);
689 	else if (op == BPF_MUL)
690 		eval_mul(rd, &rs, opsz, msk);
691 	else if (op == BPF_DIV || op == BPF_MOD)
692 		err = eval_divmod(op, rd, &rs, opsz, msk);
693 	else if (op == BPF_NEG)
694 		eval_neg(rd, opsz, msk);
695 	else if (op == EBPF_MOV)
696 		*rd = rs;
697 	else
698 		eval_max_bound(rd, msk);
699 
700 	return err;
701 }
702 
703 static const char *
704 eval_bele(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
705 {
706 	uint64_t msk;
707 	struct bpf_eval_state *st;
708 	struct bpf_reg_val *rd;
709 	const char *err;
710 
711 	msk = RTE_LEN2MASK(ins->imm, uint64_t);
712 
713 	st = bvf->evst;
714 	rd = st->rv + ins->dst_reg;
715 
716 	err = eval_defined(rd, NULL);
717 	if (err != NULL)
718 		return err;
719 
720 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
721 	if (ins->code == (BPF_ALU | EBPF_END | EBPF_TO_BE))
722 		eval_max_bound(rd, msk);
723 	else
724 		eval_apply_mask(rd, msk);
725 #else
726 	if (ins->code == (BPF_ALU | EBPF_END | EBPF_TO_LE))
727 		eval_max_bound(rd, msk);
728 	else
729 		eval_apply_mask(rd, msk);
730 #endif
731 
732 	return NULL;
733 }
734 
735 static const char *
736 eval_ptr(struct bpf_verifier *bvf, struct bpf_reg_val *rm, uint32_t opsz,
737 	uint32_t align, int16_t off)
738 {
739 	struct bpf_reg_val rv;
740 
741 	/* calculate reg + offset */
742 	eval_fill_imm(&rv, rm->mask, off);
743 	eval_add(rm, &rv, rm->mask);
744 
745 	if (RTE_BPF_ARG_PTR_TYPE(rm->v.type) == 0)
746 		return "destination is not a pointer";
747 
748 	if (rm->mask != UINT64_MAX)
749 		return "pointer truncation";
750 
751 	if (rm->u.max + opsz > rm->v.size ||
752 			(uint64_t)rm->s.max + opsz > rm->v.size ||
753 			rm->s.min < 0)
754 		return "memory boundary violation";
755 
756 	if (rm->u.max % align !=  0)
757 		return "unaligned memory access";
758 
759 	if (rm->v.type == BPF_ARG_PTR_STACK) {
760 
761 		if (rm->u.max != rm->u.min || rm->s.max != rm->s.min ||
762 				rm->u.max != (uint64_t)rm->s.max)
763 			return "stack access with variable offset";
764 
765 		bvf->stack_sz = RTE_MAX(bvf->stack_sz, rm->v.size - rm->u.max);
766 
767 	/* pointer to mbuf */
768 	} else if (rm->v.type == RTE_BPF_ARG_PTR_MBUF) {
769 
770 		if (rm->u.max != rm->u.min || rm->s.max != rm->s.min ||
771 				rm->u.max != (uint64_t)rm->s.max)
772 			return "mbuf access with variable offset";
773 	}
774 
775 	return NULL;
776 }
777 
778 static void
779 eval_max_load(struct bpf_reg_val *rv, uint64_t mask)
780 {
781 	eval_umax_bound(rv, mask);
782 
783 	/* full 64-bit load */
784 	if (mask == UINT64_MAX)
785 		eval_smax_bound(rv, mask);
786 
787 	/* zero-extend load */
788 	rv->s.min = rv->u.min;
789 	rv->s.max = rv->u.max;
790 }
791 
792 
793 static const char *
794 eval_load(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
795 {
796 	uint32_t opsz;
797 	uint64_t msk;
798 	const char *err;
799 	struct bpf_eval_state *st;
800 	struct bpf_reg_val *rd, rs;
801 	const struct bpf_reg_val *sv;
802 
803 	st = bvf->evst;
804 	rd = st->rv + ins->dst_reg;
805 	rs = st->rv[ins->src_reg];
806 	opsz = bpf_size(BPF_SIZE(ins->code));
807 	msk = RTE_LEN2MASK(opsz * CHAR_BIT, uint64_t);
808 
809 	err = eval_ptr(bvf, &rs, opsz, 1, ins->off);
810 	if (err != NULL)
811 		return err;
812 
813 	if (rs.v.type == BPF_ARG_PTR_STACK) {
814 
815 		sv = st->sv + rs.u.max / sizeof(uint64_t);
816 		if (sv->v.type == RTE_BPF_ARG_UNDEF || sv->mask < msk)
817 			return "undefined value on the stack";
818 
819 		*rd = *sv;
820 
821 	/* pointer to mbuf */
822 	} else if (rs.v.type == RTE_BPF_ARG_PTR_MBUF) {
823 
824 		if (rs.u.max == offsetof(struct rte_mbuf, next)) {
825 			eval_fill_imm(rd, msk, 0);
826 			rd->v = rs.v;
827 		} else if (rs.u.max == offsetof(struct rte_mbuf, buf_addr)) {
828 			eval_fill_imm(rd, msk, 0);
829 			rd->v.type = RTE_BPF_ARG_PTR;
830 			rd->v.size = rs.v.buf_size;
831 		} else if (rs.u.max == offsetof(struct rte_mbuf, data_off)) {
832 			eval_fill_imm(rd, msk, RTE_PKTMBUF_HEADROOM);
833 			rd->v.type = RTE_BPF_ARG_RAW;
834 		} else {
835 			eval_max_load(rd, msk);
836 			rd->v.type = RTE_BPF_ARG_RAW;
837 		}
838 
839 	/* pointer to raw data */
840 	} else {
841 		eval_max_load(rd, msk);
842 		rd->v.type = RTE_BPF_ARG_RAW;
843 	}
844 
845 	return NULL;
846 }
847 
848 static const char *
849 eval_mbuf_store(const struct bpf_reg_val *rv, uint32_t opsz)
850 {
851 	uint32_t i;
852 
853 	static const struct {
854 		size_t off;
855 		size_t sz;
856 	} mbuf_ro_fileds[] = {
857 		{ .off = offsetof(struct rte_mbuf, buf_addr), },
858 		{ .off = offsetof(struct rte_mbuf, refcnt), },
859 		{ .off = offsetof(struct rte_mbuf, nb_segs), },
860 		{ .off = offsetof(struct rte_mbuf, buf_len), },
861 		{ .off = offsetof(struct rte_mbuf, pool), },
862 		{ .off = offsetof(struct rte_mbuf, next), },
863 		{ .off = offsetof(struct rte_mbuf, priv_size), },
864 	};
865 
866 	for (i = 0; i != RTE_DIM(mbuf_ro_fileds) &&
867 			(mbuf_ro_fileds[i].off + mbuf_ro_fileds[i].sz <=
868 			rv->u.max || rv->u.max + opsz <= mbuf_ro_fileds[i].off);
869 			i++)
870 		;
871 
872 	if (i != RTE_DIM(mbuf_ro_fileds))
873 		return "store to the read-only mbuf field";
874 
875 	return NULL;
876 
877 }
878 
879 static const char *
880 eval_store(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
881 {
882 	uint32_t opsz;
883 	uint64_t msk;
884 	const char *err;
885 	struct bpf_eval_state *st;
886 	struct bpf_reg_val rd, rs, *sv;
887 
888 	opsz = bpf_size(BPF_SIZE(ins->code));
889 	msk = RTE_LEN2MASK(opsz * CHAR_BIT, uint64_t);
890 
891 	st = bvf->evst;
892 	rd = st->rv[ins->dst_reg];
893 
894 	if (BPF_CLASS(ins->code) == BPF_STX) {
895 		rs = st->rv[ins->src_reg];
896 		eval_apply_mask(&rs, msk);
897 	} else
898 		eval_fill_imm(&rs, msk, ins->imm);
899 
900 	err = eval_defined(NULL, &rs);
901 	if (err != NULL)
902 		return err;
903 
904 	err = eval_ptr(bvf, &rd, opsz, 1, ins->off);
905 	if (err != NULL)
906 		return err;
907 
908 	if (rd.v.type == BPF_ARG_PTR_STACK) {
909 
910 		sv = st->sv + rd.u.max / sizeof(uint64_t);
911 		if (BPF_CLASS(ins->code) == BPF_STX &&
912 				BPF_MODE(ins->code) == EBPF_XADD)
913 			eval_max_bound(sv, msk);
914 		else
915 			*sv = rs;
916 
917 	/* pointer to mbuf */
918 	} else if (rd.v.type == RTE_BPF_ARG_PTR_MBUF) {
919 		err = eval_mbuf_store(&rd, opsz);
920 		if (err != NULL)
921 			return err;
922 	}
923 
924 	return NULL;
925 }
926 
927 static const char *
928 eval_func_arg(struct bpf_verifier *bvf, const struct rte_bpf_arg *arg,
929 	struct bpf_reg_val *rv)
930 {
931 	uint32_t i, n;
932 	struct bpf_eval_state *st;
933 	const char *err;
934 
935 	st = bvf->evst;
936 
937 	if (rv->v.type == RTE_BPF_ARG_UNDEF)
938 		return "Undefined argument type";
939 
940 	if (arg->type != rv->v.type &&
941 			arg->type != RTE_BPF_ARG_RAW &&
942 			(arg->type != RTE_BPF_ARG_PTR ||
943 			RTE_BPF_ARG_PTR_TYPE(rv->v.type) == 0))
944 		return "Invalid argument type";
945 
946 	err = NULL;
947 
948 	/* argument is a pointer */
949 	if (RTE_BPF_ARG_PTR_TYPE(arg->type) != 0) {
950 
951 		err = eval_ptr(bvf, rv, arg->size, 1, 0);
952 
953 		/*
954 		 * pointer to the variable on the stack is passed
955 		 * as an argument, mark stack space it occupies as initialized.
956 		 */
957 		if (err == NULL && rv->v.type == BPF_ARG_PTR_STACK) {
958 
959 			i = rv->u.max / sizeof(uint64_t);
960 			n = i + arg->size / sizeof(uint64_t);
961 			while (i != n) {
962 				eval_fill_max_bound(st->sv + i, UINT64_MAX);
963 				i++;
964 			};
965 		}
966 	}
967 
968 	return err;
969 }
970 
971 static const char *
972 eval_call(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
973 {
974 	uint32_t i, idx;
975 	struct bpf_reg_val *rv;
976 	const struct rte_bpf_xsym *xsym;
977 	const char *err;
978 
979 	idx = ins->imm;
980 
981 	if (idx >= bvf->prm->nb_xsym ||
982 			bvf->prm->xsym[idx].type != RTE_BPF_XTYPE_FUNC)
983 		return "invalid external function index";
984 
985 	/* for now don't support function calls on 32 bit platform */
986 	if (sizeof(uint64_t) != sizeof(uintptr_t))
987 		return "function calls are supported only for 64 bit apps";
988 
989 	xsym = bvf->prm->xsym + idx;
990 
991 	/* evaluate function arguments */
992 	err = NULL;
993 	for (i = 0; i != xsym->func.nb_args && err == NULL; i++) {
994 		err = eval_func_arg(bvf, xsym->func.args + i,
995 			bvf->evst->rv + EBPF_REG_1 + i);
996 	}
997 
998 	/* R1-R5 argument/scratch registers */
999 	for (i = EBPF_REG_1; i != EBPF_REG_6; i++)
1000 		bvf->evst->rv[i].v.type = RTE_BPF_ARG_UNDEF;
1001 
1002 	/* update return value */
1003 
1004 	rv = bvf->evst->rv + EBPF_REG_0;
1005 	rv->v = xsym->func.ret;
1006 	if (rv->v.type == RTE_BPF_ARG_RAW)
1007 		eval_fill_max_bound(rv,
1008 			RTE_LEN2MASK(rv->v.size * CHAR_BIT, uint64_t));
1009 	else if (RTE_BPF_ARG_PTR_TYPE(rv->v.type) != 0)
1010 		eval_fill_imm64(rv, UINTPTR_MAX, 0);
1011 
1012 	return err;
1013 }
1014 
1015 static void
1016 eval_jeq_jne(struct bpf_reg_val *trd, struct bpf_reg_val *trs)
1017 {
1018 	/* sreg is constant */
1019 	if (trs->u.min == trs->u.max) {
1020 		trd->u = trs->u;
1021 	/* dreg is constant */
1022 	} else if (trd->u.min == trd->u.max) {
1023 		trs->u = trd->u;
1024 	} else {
1025 		trd->u.max = RTE_MIN(trd->u.max, trs->u.max);
1026 		trd->u.min = RTE_MAX(trd->u.min, trs->u.min);
1027 		trs->u = trd->u;
1028 	}
1029 
1030 	/* sreg is constant */
1031 	if (trs->s.min == trs->s.max) {
1032 		trd->s = trs->s;
1033 	/* dreg is constant */
1034 	} else if (trd->s.min == trd->s.max) {
1035 		trs->s = trd->s;
1036 	} else {
1037 		trd->s.max = RTE_MIN(trd->s.max, trs->s.max);
1038 		trd->s.min = RTE_MAX(trd->s.min, trs->s.min);
1039 		trs->s = trd->s;
1040 	}
1041 }
1042 
1043 static void
1044 eval_jgt_jle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
1045 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
1046 {
1047 	frd->u.max = RTE_MIN(frd->u.max, frs->u.min);
1048 	trd->u.min = RTE_MAX(trd->u.min, trs->u.min + 1);
1049 }
1050 
1051 static void
1052 eval_jlt_jge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
1053 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
1054 {
1055 	frd->u.min = RTE_MAX(frd->u.min, frs->u.min);
1056 	trd->u.max = RTE_MIN(trd->u.max, trs->u.max - 1);
1057 }
1058 
1059 static void
1060 eval_jsgt_jsle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
1061 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
1062 {
1063 	frd->s.max = RTE_MIN(frd->s.max, frs->s.min);
1064 	trd->s.min = RTE_MAX(trd->s.min, trs->s.min + 1);
1065 }
1066 
1067 static void
1068 eval_jslt_jsge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
1069 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
1070 {
1071 	frd->s.min = RTE_MAX(frd->s.min, frs->s.min);
1072 	trd->s.max = RTE_MIN(trd->s.max, trs->s.max - 1);
1073 }
1074 
1075 static const char *
1076 eval_jcc(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
1077 {
1078 	uint32_t op;
1079 	const char *err;
1080 	struct bpf_eval_state *fst, *tst;
1081 	struct bpf_reg_val *frd, *frs, *trd, *trs;
1082 	struct bpf_reg_val rvf, rvt;
1083 
1084 	tst = bvf->evst;
1085 	fst = bvf->evin->evst;
1086 
1087 	frd = fst->rv + ins->dst_reg;
1088 	trd = tst->rv + ins->dst_reg;
1089 
1090 	if (BPF_SRC(ins->code) == BPF_X) {
1091 		frs = fst->rv + ins->src_reg;
1092 		trs = tst->rv + ins->src_reg;
1093 	} else {
1094 		frs = &rvf;
1095 		trs = &rvt;
1096 		eval_fill_imm(frs, UINT64_MAX, ins->imm);
1097 		eval_fill_imm(trs, UINT64_MAX, ins->imm);
1098 	}
1099 
1100 	err = eval_defined(trd, trs);
1101 	if (err != NULL)
1102 		return err;
1103 
1104 	op = BPF_OP(ins->code);
1105 
1106 	if (op == BPF_JEQ)
1107 		eval_jeq_jne(trd, trs);
1108 	else if (op == EBPF_JNE)
1109 		eval_jeq_jne(frd, frs);
1110 	else if (op == BPF_JGT)
1111 		eval_jgt_jle(trd, trs, frd, frs);
1112 	else if (op == EBPF_JLE)
1113 		eval_jgt_jle(frd, frs, trd, trs);
1114 	else if (op == EBPF_JLT)
1115 		eval_jlt_jge(trd, trs, frd, frs);
1116 	else if (op == BPF_JGE)
1117 		eval_jlt_jge(frd, frs, trd, trs);
1118 	else if (op == EBPF_JSGT)
1119 		eval_jsgt_jsle(trd, trs, frd, frs);
1120 	else if (op == EBPF_JSLE)
1121 		eval_jsgt_jsle(frd, frs, trd, trs);
1122 	else if (op == EBPF_JSLT)
1123 		eval_jslt_jsge(trd, trs, frd, frs);
1124 	else if (op == EBPF_JSGE)
1125 		eval_jslt_jsge(frd, frs, trd, trs);
1126 
1127 	return NULL;
1128 }
1129 
1130 /*
1131  * validate parameters for each instruction type.
1132  */
1133 static const struct bpf_ins_check ins_chk[UINT8_MAX + 1] = {
1134 	/* ALU IMM 32-bit instructions */
1135 	[(BPF_ALU | BPF_ADD | BPF_K)] = {
1136 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1137 		.off = { .min = 0, .max = 0},
1138 		.imm = { .min = 0, .max = UINT32_MAX,},
1139 		.eval = eval_alu,
1140 	},
1141 	[(BPF_ALU | BPF_SUB | BPF_K)] = {
1142 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1143 		.off = { .min = 0, .max = 0},
1144 		.imm = { .min = 0, .max = UINT32_MAX,},
1145 		.eval = eval_alu,
1146 	},
1147 	[(BPF_ALU | BPF_AND | BPF_K)] = {
1148 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1149 		.off = { .min = 0, .max = 0},
1150 		.imm = { .min = 0, .max = UINT32_MAX,},
1151 		.eval = eval_alu,
1152 	},
1153 	[(BPF_ALU | BPF_OR | BPF_K)] = {
1154 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1155 		.off = { .min = 0, .max = 0},
1156 		.imm = { .min = 0, .max = UINT32_MAX,},
1157 		.eval = eval_alu,
1158 	},
1159 	[(BPF_ALU | BPF_LSH | BPF_K)] = {
1160 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1161 		.off = { .min = 0, .max = 0},
1162 		.imm = { .min = 0, .max = UINT32_MAX,},
1163 		.eval = eval_alu,
1164 	},
1165 	[(BPF_ALU | BPF_RSH | BPF_K)] = {
1166 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1167 		.off = { .min = 0, .max = 0},
1168 		.imm = { .min = 0, .max = UINT32_MAX,},
1169 		.eval = eval_alu,
1170 	},
1171 	[(BPF_ALU | BPF_XOR | BPF_K)] = {
1172 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1173 		.off = { .min = 0, .max = 0},
1174 		.imm = { .min = 0, .max = UINT32_MAX,},
1175 		.eval = eval_alu,
1176 	},
1177 	[(BPF_ALU | BPF_MUL | BPF_K)] = {
1178 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1179 		.off = { .min = 0, .max = 0},
1180 		.imm = { .min = 0, .max = UINT32_MAX,},
1181 		.eval = eval_alu,
1182 	},
1183 	[(BPF_ALU | EBPF_MOV | BPF_K)] = {
1184 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1185 		.off = { .min = 0, .max = 0},
1186 		.imm = { .min = 0, .max = UINT32_MAX,},
1187 		.eval = eval_alu,
1188 	},
1189 	[(BPF_ALU | BPF_DIV | BPF_K)] = {
1190 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1191 		.off = { .min = 0, .max = 0},
1192 		.imm = { .min = 1, .max = UINT32_MAX},
1193 		.eval = eval_alu,
1194 	},
1195 	[(BPF_ALU | BPF_MOD | BPF_K)] = {
1196 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1197 		.off = { .min = 0, .max = 0},
1198 		.imm = { .min = 1, .max = UINT32_MAX},
1199 		.eval = eval_alu,
1200 	},
1201 	/* ALU IMM 64-bit instructions */
1202 	[(EBPF_ALU64 | BPF_ADD | BPF_K)] = {
1203 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1204 		.off = { .min = 0, .max = 0},
1205 		.imm = { .min = 0, .max = UINT32_MAX,},
1206 		.eval = eval_alu,
1207 	},
1208 	[(EBPF_ALU64 | BPF_SUB | BPF_K)] = {
1209 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1210 		.off = { .min = 0, .max = 0},
1211 		.imm = { .min = 0, .max = UINT32_MAX,},
1212 		.eval = eval_alu,
1213 	},
1214 	[(EBPF_ALU64 | BPF_AND | BPF_K)] = {
1215 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1216 		.off = { .min = 0, .max = 0},
1217 		.imm = { .min = 0, .max = UINT32_MAX,},
1218 		.eval = eval_alu,
1219 	},
1220 	[(EBPF_ALU64 | BPF_OR | BPF_K)] = {
1221 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1222 		.off = { .min = 0, .max = 0},
1223 		.imm = { .min = 0, .max = UINT32_MAX,},
1224 		.eval = eval_alu,
1225 	},
1226 	[(EBPF_ALU64 | BPF_LSH | BPF_K)] = {
1227 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1228 		.off = { .min = 0, .max = 0},
1229 		.imm = { .min = 0, .max = UINT32_MAX,},
1230 		.eval = eval_alu,
1231 	},
1232 	[(EBPF_ALU64 | BPF_RSH | BPF_K)] = {
1233 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1234 		.off = { .min = 0, .max = 0},
1235 		.imm = { .min = 0, .max = UINT32_MAX,},
1236 		.eval = eval_alu,
1237 	},
1238 	[(EBPF_ALU64 | EBPF_ARSH | BPF_K)] = {
1239 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1240 		.off = { .min = 0, .max = 0},
1241 		.imm = { .min = 0, .max = UINT32_MAX,},
1242 		.eval = eval_alu,
1243 	},
1244 	[(EBPF_ALU64 | BPF_XOR | BPF_K)] = {
1245 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1246 		.off = { .min = 0, .max = 0},
1247 		.imm = { .min = 0, .max = UINT32_MAX,},
1248 		.eval = eval_alu,
1249 	},
1250 	[(EBPF_ALU64 | BPF_MUL | BPF_K)] = {
1251 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1252 		.off = { .min = 0, .max = 0},
1253 		.imm = { .min = 0, .max = UINT32_MAX,},
1254 		.eval = eval_alu,
1255 	},
1256 	[(EBPF_ALU64 | EBPF_MOV | BPF_K)] = {
1257 		.mask = {.dreg = WRT_REGS, .sreg = ZERO_REG},
1258 		.off = { .min = 0, .max = 0},
1259 		.imm = { .min = 0, .max = UINT32_MAX,},
1260 		.eval = eval_alu,
1261 	},
1262 	[(EBPF_ALU64 | BPF_DIV | BPF_K)] = {
1263 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1264 		.off = { .min = 0, .max = 0},
1265 		.imm = { .min = 1, .max = UINT32_MAX},
1266 		.eval = eval_alu,
1267 	},
1268 	[(EBPF_ALU64 | BPF_MOD | BPF_K)] = {
1269 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1270 		.off = { .min = 0, .max = 0},
1271 		.imm = { .min = 1, .max = UINT32_MAX},
1272 		.eval = eval_alu,
1273 	},
1274 	/* ALU REG 32-bit instructions */
1275 	[(BPF_ALU | BPF_ADD | BPF_X)] = {
1276 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1277 		.off = { .min = 0, .max = 0},
1278 		.imm = { .min = 0, .max = 0},
1279 		.eval = eval_alu,
1280 	},
1281 	[(BPF_ALU | BPF_SUB | BPF_X)] = {
1282 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1283 		.off = { .min = 0, .max = 0},
1284 		.imm = { .min = 0, .max = 0},
1285 		.eval = eval_alu,
1286 	},
1287 	[(BPF_ALU | BPF_AND | BPF_X)] = {
1288 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1289 		.off = { .min = 0, .max = 0},
1290 		.imm = { .min = 0, .max = 0},
1291 		.eval = eval_alu,
1292 	},
1293 	[(BPF_ALU | BPF_OR | BPF_X)] = {
1294 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1295 		.off = { .min = 0, .max = 0},
1296 		.imm = { .min = 0, .max = 0},
1297 		.eval = eval_alu,
1298 	},
1299 	[(BPF_ALU | BPF_LSH | BPF_X)] = {
1300 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1301 		.off = { .min = 0, .max = 0},
1302 		.imm = { .min = 0, .max = 0},
1303 		.eval = eval_alu,
1304 	},
1305 	[(BPF_ALU | BPF_RSH | BPF_X)] = {
1306 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1307 		.off = { .min = 0, .max = 0},
1308 		.imm = { .min = 0, .max = 0},
1309 		.eval = eval_alu,
1310 	},
1311 	[(BPF_ALU | BPF_XOR | BPF_X)] = {
1312 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1313 		.off = { .min = 0, .max = 0},
1314 		.imm = { .min = 0, .max = 0},
1315 		.eval = eval_alu,
1316 	},
1317 	[(BPF_ALU | BPF_MUL | BPF_X)] = {
1318 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1319 		.off = { .min = 0, .max = 0},
1320 		.imm = { .min = 0, .max = 0},
1321 		.eval = eval_alu,
1322 	},
1323 	[(BPF_ALU | BPF_DIV | BPF_X)] = {
1324 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1325 		.off = { .min = 0, .max = 0},
1326 		.imm = { .min = 0, .max = 0},
1327 		.eval = eval_alu,
1328 	},
1329 	[(BPF_ALU | BPF_MOD | BPF_X)] = {
1330 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1331 		.off = { .min = 0, .max = 0},
1332 		.imm = { .min = 0, .max = 0},
1333 		.eval = eval_alu,
1334 	},
1335 	[(BPF_ALU | EBPF_MOV | BPF_X)] = {
1336 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1337 		.off = { .min = 0, .max = 0},
1338 		.imm = { .min = 0, .max = 0},
1339 		.eval = eval_alu,
1340 	},
1341 	[(BPF_ALU | BPF_NEG)] = {
1342 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1343 		.off = { .min = 0, .max = 0},
1344 		.imm = { .min = 0, .max = 0},
1345 		.eval = eval_alu,
1346 	},
1347 	[(BPF_ALU | EBPF_END | EBPF_TO_BE)] = {
1348 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1349 		.off = { .min = 0, .max = 0},
1350 		.imm = { .min = 16, .max = 64},
1351 		.check = check_alu_bele,
1352 		.eval = eval_bele,
1353 	},
1354 	[(BPF_ALU | EBPF_END | EBPF_TO_LE)] = {
1355 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1356 		.off = { .min = 0, .max = 0},
1357 		.imm = { .min = 16, .max = 64},
1358 		.check = check_alu_bele,
1359 		.eval = eval_bele,
1360 	},
1361 	/* ALU REG 64-bit instructions */
1362 	[(EBPF_ALU64 | BPF_ADD | BPF_X)] = {
1363 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1364 		.off = { .min = 0, .max = 0},
1365 		.imm = { .min = 0, .max = 0},
1366 		.eval = eval_alu,
1367 	},
1368 	[(EBPF_ALU64 | BPF_SUB | BPF_X)] = {
1369 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1370 		.off = { .min = 0, .max = 0},
1371 		.imm = { .min = 0, .max = 0},
1372 		.eval = eval_alu,
1373 	},
1374 	[(EBPF_ALU64 | BPF_AND | BPF_X)] = {
1375 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1376 		.off = { .min = 0, .max = 0},
1377 		.imm = { .min = 0, .max = 0},
1378 		.eval = eval_alu,
1379 	},
1380 	[(EBPF_ALU64 | BPF_OR | BPF_X)] = {
1381 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1382 		.off = { .min = 0, .max = 0},
1383 		.imm = { .min = 0, .max = 0},
1384 		.eval = eval_alu,
1385 	},
1386 	[(EBPF_ALU64 | BPF_LSH | BPF_X)] = {
1387 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1388 		.off = { .min = 0, .max = 0},
1389 		.imm = { .min = 0, .max = 0},
1390 		.eval = eval_alu,
1391 	},
1392 	[(EBPF_ALU64 | BPF_RSH | BPF_X)] = {
1393 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1394 		.off = { .min = 0, .max = 0},
1395 		.imm = { .min = 0, .max = 0},
1396 		.eval = eval_alu,
1397 	},
1398 	[(EBPF_ALU64 | EBPF_ARSH | BPF_X)] = {
1399 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1400 		.off = { .min = 0, .max = 0},
1401 		.imm = { .min = 0, .max = 0},
1402 		.eval = eval_alu,
1403 	},
1404 	[(EBPF_ALU64 | BPF_XOR | BPF_X)] = {
1405 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1406 		.off = { .min = 0, .max = 0},
1407 		.imm = { .min = 0, .max = 0},
1408 		.eval = eval_alu,
1409 	},
1410 	[(EBPF_ALU64 | BPF_MUL | BPF_X)] = {
1411 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1412 		.off = { .min = 0, .max = 0},
1413 		.imm = { .min = 0, .max = 0},
1414 		.eval = eval_alu,
1415 	},
1416 	[(EBPF_ALU64 | BPF_DIV | BPF_X)] = {
1417 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1418 		.off = { .min = 0, .max = 0},
1419 		.imm = { .min = 0, .max = 0},
1420 		.eval = eval_alu,
1421 	},
1422 	[(EBPF_ALU64 | BPF_MOD | BPF_X)] = {
1423 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1424 		.off = { .min = 0, .max = 0},
1425 		.imm = { .min = 0, .max = 0},
1426 		.eval = eval_alu,
1427 	},
1428 	[(EBPF_ALU64 | EBPF_MOV | BPF_X)] = {
1429 		.mask = { .dreg = WRT_REGS, .sreg = ALL_REGS},
1430 		.off = { .min = 0, .max = 0},
1431 		.imm = { .min = 0, .max = 0},
1432 		.eval = eval_alu,
1433 	},
1434 	[(EBPF_ALU64 | BPF_NEG)] = {
1435 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1436 		.off = { .min = 0, .max = 0},
1437 		.imm = { .min = 0, .max = 0},
1438 		.eval = eval_alu,
1439 	},
1440 	/* load instructions */
1441 	[(BPF_LDX | BPF_MEM | BPF_B)] = {
1442 		.mask = {. dreg = WRT_REGS, .sreg = ALL_REGS},
1443 		.off = { .min = 0, .max = UINT16_MAX},
1444 		.imm = { .min = 0, .max = 0},
1445 		.eval = eval_load,
1446 	},
1447 	[(BPF_LDX | BPF_MEM | BPF_H)] = {
1448 		.mask = {. dreg = WRT_REGS, .sreg = ALL_REGS},
1449 		.off = { .min = 0, .max = UINT16_MAX},
1450 		.imm = { .min = 0, .max = 0},
1451 		.eval = eval_load,
1452 	},
1453 	[(BPF_LDX | BPF_MEM | BPF_W)] = {
1454 		.mask = {. dreg = WRT_REGS, .sreg = ALL_REGS},
1455 		.off = { .min = 0, .max = UINT16_MAX},
1456 		.imm = { .min = 0, .max = 0},
1457 		.eval = eval_load,
1458 	},
1459 	[(BPF_LDX | BPF_MEM | EBPF_DW)] = {
1460 		.mask = {. dreg = WRT_REGS, .sreg = ALL_REGS},
1461 		.off = { .min = 0, .max = UINT16_MAX},
1462 		.imm = { .min = 0, .max = 0},
1463 		.eval = eval_load,
1464 	},
1465 	/* load 64 bit immediate value */
1466 	[(BPF_LD | BPF_IMM | EBPF_DW)] = {
1467 		.mask = { .dreg = WRT_REGS, .sreg = ZERO_REG},
1468 		.off = { .min = 0, .max = 0},
1469 		.imm = { .min = 0, .max = UINT32_MAX},
1470 		.eval = eval_ld_imm64,
1471 	},
1472 	/* load absolute instructions */
1473 	[(BPF_LD | BPF_ABS | BPF_B)] = {
1474 		.mask = {. dreg = ZERO_REG, .sreg = ZERO_REG},
1475 		.off = { .min = 0, .max = 0},
1476 		.imm = { .min = 0, .max = INT32_MAX},
1477 		.eval = eval_ld_mbuf,
1478 	},
1479 	[(BPF_LD | BPF_ABS | BPF_H)] = {
1480 		.mask = {. dreg = ZERO_REG, .sreg = ZERO_REG},
1481 		.off = { .min = 0, .max = 0},
1482 		.imm = { .min = 0, .max = INT32_MAX},
1483 		.eval = eval_ld_mbuf,
1484 	},
1485 	[(BPF_LD | BPF_ABS | BPF_W)] = {
1486 		.mask = {. dreg = ZERO_REG, .sreg = ZERO_REG},
1487 		.off = { .min = 0, .max = 0},
1488 		.imm = { .min = 0, .max = INT32_MAX},
1489 		.eval = eval_ld_mbuf,
1490 	},
1491 	/* load indirect instructions */
1492 	[(BPF_LD | BPF_IND | BPF_B)] = {
1493 		.mask = {. dreg = ZERO_REG, .sreg = IND_SRC_REGS},
1494 		.off = { .min = 0, .max = 0},
1495 		.imm = { .min = 0, .max = UINT32_MAX},
1496 		.eval = eval_ld_mbuf,
1497 	},
1498 	[(BPF_LD | BPF_IND | BPF_H)] = {
1499 		.mask = {. dreg = ZERO_REG, .sreg = IND_SRC_REGS},
1500 		.off = { .min = 0, .max = 0},
1501 		.imm = { .min = 0, .max = UINT32_MAX},
1502 		.eval = eval_ld_mbuf,
1503 	},
1504 	[(BPF_LD | BPF_IND | BPF_W)] = {
1505 		.mask = {. dreg = ZERO_REG, .sreg = IND_SRC_REGS},
1506 		.off = { .min = 0, .max = 0},
1507 		.imm = { .min = 0, .max = UINT32_MAX},
1508 		.eval = eval_ld_mbuf,
1509 	},
1510 	/* store REG instructions */
1511 	[(BPF_STX | BPF_MEM | BPF_B)] = {
1512 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1513 		.off = { .min = 0, .max = UINT16_MAX},
1514 		.imm = { .min = 0, .max = 0},
1515 		.eval = eval_store,
1516 	},
1517 	[(BPF_STX | BPF_MEM | BPF_H)] = {
1518 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1519 		.off = { .min = 0, .max = UINT16_MAX},
1520 		.imm = { .min = 0, .max = 0},
1521 		.eval = eval_store,
1522 	},
1523 	[(BPF_STX | BPF_MEM | BPF_W)] = {
1524 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1525 		.off = { .min = 0, .max = UINT16_MAX},
1526 		.imm = { .min = 0, .max = 0},
1527 		.eval = eval_store,
1528 	},
1529 	[(BPF_STX | BPF_MEM | EBPF_DW)] = {
1530 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1531 		.off = { .min = 0, .max = UINT16_MAX},
1532 		.imm = { .min = 0, .max = 0},
1533 		.eval = eval_store,
1534 	},
1535 	/* atomic add instructions */
1536 	[(BPF_STX | EBPF_XADD | BPF_W)] = {
1537 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1538 		.off = { .min = 0, .max = UINT16_MAX},
1539 		.imm = { .min = 0, .max = 0},
1540 		.eval = eval_store,
1541 	},
1542 	[(BPF_STX | EBPF_XADD | EBPF_DW)] = {
1543 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1544 		.off = { .min = 0, .max = UINT16_MAX},
1545 		.imm = { .min = 0, .max = 0},
1546 		.eval = eval_store,
1547 	},
1548 	/* store IMM instructions */
1549 	[(BPF_ST | BPF_MEM | BPF_B)] = {
1550 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1551 		.off = { .min = 0, .max = UINT16_MAX},
1552 		.imm = { .min = 0, .max = UINT32_MAX},
1553 		.eval = eval_store,
1554 	},
1555 	[(BPF_ST | BPF_MEM | BPF_H)] = {
1556 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1557 		.off = { .min = 0, .max = UINT16_MAX},
1558 		.imm = { .min = 0, .max = UINT32_MAX},
1559 		.eval = eval_store,
1560 	},
1561 	[(BPF_ST | BPF_MEM | BPF_W)] = {
1562 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1563 		.off = { .min = 0, .max = UINT16_MAX},
1564 		.imm = { .min = 0, .max = UINT32_MAX},
1565 		.eval = eval_store,
1566 	},
1567 	[(BPF_ST | BPF_MEM | EBPF_DW)] = {
1568 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1569 		.off = { .min = 0, .max = UINT16_MAX},
1570 		.imm = { .min = 0, .max = UINT32_MAX},
1571 		.eval = eval_store,
1572 	},
1573 	/* jump instruction */
1574 	[(BPF_JMP | BPF_JA)] = {
1575 		.mask = { .dreg = ZERO_REG, .sreg = ZERO_REG},
1576 		.off = { .min = 0, .max = UINT16_MAX},
1577 		.imm = { .min = 0, .max = 0},
1578 	},
1579 	/* jcc IMM instructions */
1580 	[(BPF_JMP | BPF_JEQ | BPF_K)] = {
1581 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1582 		.off = { .min = 0, .max = UINT16_MAX},
1583 		.imm = { .min = 0, .max = UINT32_MAX},
1584 		.eval = eval_jcc,
1585 	},
1586 	[(BPF_JMP | EBPF_JNE | BPF_K)] = {
1587 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1588 		.off = { .min = 0, .max = UINT16_MAX},
1589 		.imm = { .min = 0, .max = UINT32_MAX},
1590 		.eval = eval_jcc,
1591 	},
1592 	[(BPF_JMP | BPF_JGT | BPF_K)] = {
1593 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1594 		.off = { .min = 0, .max = UINT16_MAX},
1595 		.imm = { .min = 0, .max = UINT32_MAX},
1596 		.eval = eval_jcc,
1597 	},
1598 	[(BPF_JMP | EBPF_JLT | BPF_K)] = {
1599 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1600 		.off = { .min = 0, .max = UINT16_MAX},
1601 		.imm = { .min = 0, .max = UINT32_MAX},
1602 		.eval = eval_jcc,
1603 	},
1604 	[(BPF_JMP | BPF_JGE | BPF_K)] = {
1605 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1606 		.off = { .min = 0, .max = UINT16_MAX},
1607 		.imm = { .min = 0, .max = UINT32_MAX},
1608 		.eval = eval_jcc,
1609 	},
1610 	[(BPF_JMP | EBPF_JLE | BPF_K)] = {
1611 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1612 		.off = { .min = 0, .max = UINT16_MAX},
1613 		.imm = { .min = 0, .max = UINT32_MAX},
1614 		.eval = eval_jcc,
1615 	},
1616 	[(BPF_JMP | EBPF_JSGT | BPF_K)] = {
1617 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1618 		.off = { .min = 0, .max = UINT16_MAX},
1619 		.imm = { .min = 0, .max = UINT32_MAX},
1620 		.eval = eval_jcc,
1621 	},
1622 	[(BPF_JMP | EBPF_JSLT | BPF_K)] = {
1623 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1624 		.off = { .min = 0, .max = UINT16_MAX},
1625 		.imm = { .min = 0, .max = UINT32_MAX},
1626 		.eval = eval_jcc,
1627 	},
1628 	[(BPF_JMP | EBPF_JSGE | BPF_K)] = {
1629 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1630 		.off = { .min = 0, .max = UINT16_MAX},
1631 		.imm = { .min = 0, .max = UINT32_MAX},
1632 		.eval = eval_jcc,
1633 	},
1634 	[(BPF_JMP | EBPF_JSLE | BPF_K)] = {
1635 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1636 		.off = { .min = 0, .max = UINT16_MAX},
1637 		.imm = { .min = 0, .max = UINT32_MAX},
1638 		.eval = eval_jcc,
1639 	},
1640 	[(BPF_JMP | BPF_JSET | BPF_K)] = {
1641 		.mask = { .dreg = ALL_REGS, .sreg = ZERO_REG},
1642 		.off = { .min = 0, .max = UINT16_MAX},
1643 		.imm = { .min = 0, .max = UINT32_MAX},
1644 		.eval = eval_jcc,
1645 	},
1646 	/* jcc REG instructions */
1647 	[(BPF_JMP | BPF_JEQ | BPF_X)] = {
1648 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1649 		.off = { .min = 0, .max = UINT16_MAX},
1650 		.imm = { .min = 0, .max = 0},
1651 		.eval = eval_jcc,
1652 	},
1653 	[(BPF_JMP | EBPF_JNE | BPF_X)] = {
1654 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1655 		.off = { .min = 0, .max = UINT16_MAX},
1656 		.imm = { .min = 0, .max = 0},
1657 		.eval = eval_jcc,
1658 	},
1659 	[(BPF_JMP | BPF_JGT | BPF_X)] = {
1660 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1661 		.off = { .min = 0, .max = UINT16_MAX},
1662 		.imm = { .min = 0, .max = 0},
1663 		.eval = eval_jcc,
1664 	},
1665 	[(BPF_JMP | EBPF_JLT | BPF_X)] = {
1666 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1667 		.off = { .min = 0, .max = UINT16_MAX},
1668 		.imm = { .min = 0, .max = 0},
1669 		.eval = eval_jcc,
1670 	},
1671 	[(BPF_JMP | BPF_JGE | BPF_X)] = {
1672 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1673 		.off = { .min = 0, .max = UINT16_MAX},
1674 		.imm = { .min = 0, .max = 0},
1675 		.eval = eval_jcc,
1676 	},
1677 	[(BPF_JMP | EBPF_JLE | BPF_X)] = {
1678 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1679 		.off = { .min = 0, .max = UINT16_MAX},
1680 		.imm = { .min = 0, .max = 0},
1681 		.eval = eval_jcc,
1682 	},
1683 	[(BPF_JMP | EBPF_JSGT | BPF_X)] = {
1684 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1685 		.off = { .min = 0, .max = UINT16_MAX},
1686 		.imm = { .min = 0, .max = 0},
1687 		.eval = eval_jcc,
1688 	},
1689 	[(BPF_JMP | EBPF_JSLT | BPF_X)] = {
1690 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1691 		.off = { .min = 0, .max = UINT16_MAX},
1692 		.imm = { .min = 0, .max = 0},
1693 	},
1694 	[(BPF_JMP | EBPF_JSGE | BPF_X)] = {
1695 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1696 		.off = { .min = 0, .max = UINT16_MAX},
1697 		.imm = { .min = 0, .max = 0},
1698 		.eval = eval_jcc,
1699 	},
1700 	[(BPF_JMP | EBPF_JSLE | BPF_X)] = {
1701 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1702 		.off = { .min = 0, .max = UINT16_MAX},
1703 		.imm = { .min = 0, .max = 0},
1704 		.eval = eval_jcc,
1705 	},
1706 	[(BPF_JMP | BPF_JSET | BPF_X)] = {
1707 		.mask = { .dreg = ALL_REGS, .sreg = ALL_REGS},
1708 		.off = { .min = 0, .max = UINT16_MAX},
1709 		.imm = { .min = 0, .max = 0},
1710 		.eval = eval_jcc,
1711 	},
1712 	/* call instruction */
1713 	[(BPF_JMP | EBPF_CALL)] = {
1714 		.mask = { .dreg = ZERO_REG, .sreg = ZERO_REG},
1715 		.off = { .min = 0, .max = 0},
1716 		.imm = { .min = 0, .max = UINT32_MAX},
1717 		.eval = eval_call,
1718 	},
1719 	/* ret instruction */
1720 	[(BPF_JMP | EBPF_EXIT)] = {
1721 		.mask = { .dreg = ZERO_REG, .sreg = ZERO_REG},
1722 		.off = { .min = 0, .max = 0},
1723 		.imm = { .min = 0, .max = 0},
1724 		.eval = eval_exit,
1725 	},
1726 };
1727 
1728 /*
1729  * make sure that instruction syntax is valid,
1730  * and its fields don't violate particular instruction type restrictions.
1731  */
1732 static const char *
1733 check_syntax(const struct ebpf_insn *ins)
1734 {
1735 
1736 	uint8_t op;
1737 	uint16_t off;
1738 	uint32_t imm;
1739 
1740 	op = ins->code;
1741 
1742 	if (ins_chk[op].mask.dreg == 0)
1743 		return "invalid opcode";
1744 
1745 	if ((ins_chk[op].mask.dreg & 1 << ins->dst_reg) == 0)
1746 		return "invalid dst-reg field";
1747 
1748 	if ((ins_chk[op].mask.sreg & 1 << ins->src_reg) == 0)
1749 		return "invalid src-reg field";
1750 
1751 	off = ins->off;
1752 	if (ins_chk[op].off.min > off || ins_chk[op].off.max < off)
1753 		return "invalid off field";
1754 
1755 	imm = ins->imm;
1756 	if (ins_chk[op].imm.min > imm || ins_chk[op].imm.max < imm)
1757 		return "invalid imm field";
1758 
1759 	if (ins_chk[op].check != NULL)
1760 		return ins_chk[op].check(ins);
1761 
1762 	return NULL;
1763 }
1764 
1765 /*
1766  * helper function, return instruction index for the given node.
1767  */
1768 static uint32_t
1769 get_node_idx(const struct bpf_verifier *bvf, const struct inst_node *node)
1770 {
1771 	return node - bvf->in;
1772 }
1773 
1774 /*
1775  * helper function, used to walk through constructed CFG.
1776  */
1777 static struct inst_node *
1778 get_next_node(struct bpf_verifier *bvf, struct inst_node *node)
1779 {
1780 	uint32_t ce, ne, dst;
1781 
1782 	ne = node->nb_edge;
1783 	ce = node->cur_edge;
1784 	if (ce == ne)
1785 		return NULL;
1786 
1787 	node->cur_edge++;
1788 	dst = node->edge_dest[ce];
1789 	return bvf->in + dst;
1790 }
1791 
1792 static void
1793 set_node_colour(struct bpf_verifier *bvf, struct inst_node *node,
1794 	uint32_t new)
1795 {
1796 	uint32_t prev;
1797 
1798 	prev = node->colour;
1799 	node->colour = new;
1800 
1801 	bvf->node_colour[prev]--;
1802 	bvf->node_colour[new]++;
1803 }
1804 
1805 /*
1806  * helper function, add new edge between two nodes.
1807  */
1808 static int
1809 add_edge(struct bpf_verifier *bvf, struct inst_node *node, uint32_t nidx)
1810 {
1811 	uint32_t ne;
1812 
1813 	if (nidx > bvf->prm->nb_ins) {
1814 		RTE_BPF_LOG(ERR, "%s: program boundary violation at pc: %u, "
1815 			"next pc: %u\n",
1816 			__func__, get_node_idx(bvf, node), nidx);
1817 		return -EINVAL;
1818 	}
1819 
1820 	ne = node->nb_edge;
1821 	if (ne >= RTE_DIM(node->edge_dest)) {
1822 		RTE_BPF_LOG(ERR, "%s: internal error at pc: %u\n",
1823 			__func__, get_node_idx(bvf, node));
1824 		return -EINVAL;
1825 	}
1826 
1827 	node->edge_dest[ne] = nidx;
1828 	node->nb_edge = ne + 1;
1829 	return 0;
1830 }
1831 
1832 /*
1833  * helper function, determine type of edge between two nodes.
1834  */
1835 static void
1836 set_edge_type(struct bpf_verifier *bvf, struct inst_node *node,
1837 	const struct inst_node *next)
1838 {
1839 	uint32_t ce, clr, type;
1840 
1841 	ce = node->cur_edge - 1;
1842 	clr = next->colour;
1843 
1844 	type = UNKNOWN_EDGE;
1845 
1846 	if (clr == WHITE)
1847 		type = TREE_EDGE;
1848 	else if (clr == GREY)
1849 		type = BACK_EDGE;
1850 	else if (clr == BLACK)
1851 		/*
1852 		 * in fact it could be either direct or cross edge,
1853 		 * but for now, we don't need to distinguish between them.
1854 		 */
1855 		type = CROSS_EDGE;
1856 
1857 	node->edge_type[ce] = type;
1858 	bvf->edge_type[type]++;
1859 }
1860 
1861 static struct inst_node *
1862 get_prev_node(struct bpf_verifier *bvf, struct inst_node *node)
1863 {
1864 	return  bvf->in + node->prev_node;
1865 }
1866 
1867 /*
1868  * Depth-First Search (DFS) through previously constructed
1869  * Control Flow Graph (CFG).
1870  * Information collected at this path would be used later
1871  * to determine is there any loops, and/or unreachable instructions.
1872  */
1873 static void
1874 dfs(struct bpf_verifier *bvf)
1875 {
1876 	struct inst_node *next, *node;
1877 
1878 	node = bvf->in;
1879 	while (node != NULL) {
1880 
1881 		if (node->colour == WHITE)
1882 			set_node_colour(bvf, node, GREY);
1883 
1884 		if (node->colour == GREY) {
1885 
1886 			/* find next unprocessed child node */
1887 			do {
1888 				next = get_next_node(bvf, node);
1889 				if (next == NULL)
1890 					break;
1891 				set_edge_type(bvf, node, next);
1892 			} while (next->colour != WHITE);
1893 
1894 			if (next != NULL) {
1895 				/* proceed with next child */
1896 				next->prev_node = get_node_idx(bvf, node);
1897 				node = next;
1898 			} else {
1899 				/*
1900 				 * finished with current node and all it's kids,
1901 				 * proceed with parent
1902 				 */
1903 				set_node_colour(bvf, node, BLACK);
1904 				node->cur_edge = 0;
1905 				node = get_prev_node(bvf, node);
1906 			}
1907 		} else
1908 			node = NULL;
1909 	}
1910 }
1911 
1912 /*
1913  * report unreachable instructions.
1914  */
1915 static void
1916 log_unreachable(const struct bpf_verifier *bvf)
1917 {
1918 	uint32_t i;
1919 	struct inst_node *node;
1920 	const struct ebpf_insn *ins;
1921 
1922 	for (i = 0; i != bvf->prm->nb_ins; i++) {
1923 
1924 		node = bvf->in + i;
1925 		ins = bvf->prm->ins + i;
1926 
1927 		if (node->colour == WHITE &&
1928 				ins->code != (BPF_LD | BPF_IMM | EBPF_DW))
1929 			RTE_BPF_LOG(ERR, "unreachable code at pc: %u;\n", i);
1930 	}
1931 }
1932 
1933 /*
1934  * report loops detected.
1935  */
1936 static void
1937 log_loop(const struct bpf_verifier *bvf)
1938 {
1939 	uint32_t i, j;
1940 	struct inst_node *node;
1941 
1942 	for (i = 0; i != bvf->prm->nb_ins; i++) {
1943 
1944 		node = bvf->in + i;
1945 		if (node->colour != BLACK)
1946 			continue;
1947 
1948 		for (j = 0; j != node->nb_edge; j++) {
1949 			if (node->edge_type[j] == BACK_EDGE)
1950 				RTE_BPF_LOG(ERR,
1951 					"loop at pc:%u --> pc:%u;\n",
1952 					i, node->edge_dest[j]);
1953 		}
1954 	}
1955 }
1956 
1957 /*
1958  * First pass goes though all instructions in the set, checks that each
1959  * instruction is a valid one (correct syntax, valid field values, etc.)
1960  * and constructs control flow graph (CFG).
1961  * Then depth-first search is performed over the constructed graph.
1962  * Programs with unreachable instructions and/or loops will be rejected.
1963  */
1964 static int
1965 validate(struct bpf_verifier *bvf)
1966 {
1967 	int32_t rc;
1968 	uint32_t i;
1969 	struct inst_node *node;
1970 	const struct ebpf_insn *ins;
1971 	const char *err;
1972 
1973 	rc = 0;
1974 	for (i = 0; i < bvf->prm->nb_ins; i++) {
1975 
1976 		ins = bvf->prm->ins + i;
1977 		node = bvf->in + i;
1978 
1979 		err = check_syntax(ins);
1980 		if (err != 0) {
1981 			RTE_BPF_LOG(ERR, "%s: %s at pc: %u\n",
1982 				__func__, err, i);
1983 			rc |= -EINVAL;
1984 		}
1985 
1986 		/*
1987 		 * construct CFG, jcc nodes have to outgoing edges,
1988 		 * 'exit' nodes - none, all other nodes have exactly one
1989 		 * outgoing edge.
1990 		 */
1991 		switch (ins->code) {
1992 		case (BPF_JMP | EBPF_EXIT):
1993 			break;
1994 		case (BPF_JMP | BPF_JEQ | BPF_K):
1995 		case (BPF_JMP | EBPF_JNE | BPF_K):
1996 		case (BPF_JMP | BPF_JGT | BPF_K):
1997 		case (BPF_JMP | EBPF_JLT | BPF_K):
1998 		case (BPF_JMP | BPF_JGE | BPF_K):
1999 		case (BPF_JMP | EBPF_JLE | BPF_K):
2000 		case (BPF_JMP | EBPF_JSGT | BPF_K):
2001 		case (BPF_JMP | EBPF_JSLT | BPF_K):
2002 		case (BPF_JMP | EBPF_JSGE | BPF_K):
2003 		case (BPF_JMP | EBPF_JSLE | BPF_K):
2004 		case (BPF_JMP | BPF_JSET | BPF_K):
2005 		case (BPF_JMP | BPF_JEQ | BPF_X):
2006 		case (BPF_JMP | EBPF_JNE | BPF_X):
2007 		case (BPF_JMP | BPF_JGT | BPF_X):
2008 		case (BPF_JMP | EBPF_JLT | BPF_X):
2009 		case (BPF_JMP | BPF_JGE | BPF_X):
2010 		case (BPF_JMP | EBPF_JLE | BPF_X):
2011 		case (BPF_JMP | EBPF_JSGT | BPF_X):
2012 		case (BPF_JMP | EBPF_JSLT | BPF_X):
2013 		case (BPF_JMP | EBPF_JSGE | BPF_X):
2014 		case (BPF_JMP | EBPF_JSLE | BPF_X):
2015 		case (BPF_JMP | BPF_JSET | BPF_X):
2016 			rc |= add_edge(bvf, node, i + ins->off + 1);
2017 			rc |= add_edge(bvf, node, i + 1);
2018 			bvf->nb_jcc_nodes++;
2019 			break;
2020 		case (BPF_JMP | BPF_JA):
2021 			rc |= add_edge(bvf, node, i + ins->off + 1);
2022 			break;
2023 		/* load 64 bit immediate value */
2024 		case (BPF_LD | BPF_IMM | EBPF_DW):
2025 			rc |= add_edge(bvf, node, i + 2);
2026 			i++;
2027 			break;
2028 		case (BPF_LD | BPF_ABS | BPF_B):
2029 		case (BPF_LD | BPF_ABS | BPF_H):
2030 		case (BPF_LD | BPF_ABS | BPF_W):
2031 		case (BPF_LD | BPF_IND | BPF_B):
2032 		case (BPF_LD | BPF_IND | BPF_H):
2033 		case (BPF_LD | BPF_IND | BPF_W):
2034 			bvf->nb_ldmb_nodes++;
2035 			/* fallthrough */
2036 		default:
2037 			rc |= add_edge(bvf, node, i + 1);
2038 			break;
2039 		}
2040 
2041 		bvf->nb_nodes++;
2042 		bvf->node_colour[WHITE]++;
2043 	}
2044 
2045 	if (rc != 0)
2046 		return rc;
2047 
2048 	dfs(bvf);
2049 
2050 	RTE_BPF_LOG(DEBUG, "%s(%p) stats:\n"
2051 		"nb_nodes=%u;\n"
2052 		"nb_jcc_nodes=%u;\n"
2053 		"node_color={[WHITE]=%u, [GREY]=%u,, [BLACK]=%u};\n"
2054 		"edge_type={[UNKNOWN]=%u, [TREE]=%u, [BACK]=%u, [CROSS]=%u};\n",
2055 		__func__, bvf,
2056 		bvf->nb_nodes,
2057 		bvf->nb_jcc_nodes,
2058 		bvf->node_colour[WHITE], bvf->node_colour[GREY],
2059 			bvf->node_colour[BLACK],
2060 		bvf->edge_type[UNKNOWN_EDGE], bvf->edge_type[TREE_EDGE],
2061 		bvf->edge_type[BACK_EDGE], bvf->edge_type[CROSS_EDGE]);
2062 
2063 	if (bvf->node_colour[BLACK] != bvf->nb_nodes) {
2064 		RTE_BPF_LOG(ERR, "%s(%p) unreachable instructions;\n",
2065 			__func__, bvf);
2066 		log_unreachable(bvf);
2067 		return -EINVAL;
2068 	}
2069 
2070 	if (bvf->node_colour[GREY] != 0 || bvf->node_colour[WHITE] != 0 ||
2071 			bvf->edge_type[UNKNOWN_EDGE] != 0) {
2072 		RTE_BPF_LOG(ERR, "%s(%p) DFS internal error;\n",
2073 			__func__, bvf);
2074 		return -EINVAL;
2075 	}
2076 
2077 	if (bvf->edge_type[BACK_EDGE] != 0) {
2078 		RTE_BPF_LOG(ERR, "%s(%p) loops detected;\n",
2079 			__func__, bvf);
2080 		log_loop(bvf);
2081 		return -EINVAL;
2082 	}
2083 
2084 	return 0;
2085 }
2086 
2087 /*
2088  * helper functions get/free eval states.
2089  */
2090 static struct bpf_eval_state *
2091 pull_eval_state(struct bpf_verifier *bvf)
2092 {
2093 	uint32_t n;
2094 
2095 	n = bvf->evst_pool.cur;
2096 	if (n == bvf->evst_pool.num)
2097 		return NULL;
2098 
2099 	bvf->evst_pool.cur = n + 1;
2100 	return bvf->evst_pool.ent + n;
2101 }
2102 
2103 static void
2104 push_eval_state(struct bpf_verifier *bvf)
2105 {
2106 	bvf->evst_pool.cur--;
2107 }
2108 
2109 static void
2110 evst_pool_fini(struct bpf_verifier *bvf)
2111 {
2112 	bvf->evst = NULL;
2113 	free(bvf->evst_pool.ent);
2114 	memset(&bvf->evst_pool, 0, sizeof(bvf->evst_pool));
2115 }
2116 
2117 static int
2118 evst_pool_init(struct bpf_verifier *bvf)
2119 {
2120 	uint32_t n;
2121 
2122 	n = bvf->nb_jcc_nodes + 1;
2123 
2124 	bvf->evst_pool.ent = calloc(n, sizeof(bvf->evst_pool.ent[0]));
2125 	if (bvf->evst_pool.ent == NULL)
2126 		return -ENOMEM;
2127 
2128 	bvf->evst_pool.num = n;
2129 	bvf->evst_pool.cur = 0;
2130 
2131 	bvf->evst = pull_eval_state(bvf);
2132 	return 0;
2133 }
2134 
2135 /*
2136  * Save current eval state.
2137  */
2138 static int
2139 save_eval_state(struct bpf_verifier *bvf, struct inst_node *node)
2140 {
2141 	struct bpf_eval_state *st;
2142 
2143 	/* get new eval_state for this node */
2144 	st = pull_eval_state(bvf);
2145 	if (st == NULL) {
2146 		RTE_BPF_LOG(ERR,
2147 			"%s: internal error (out of space) at pc: %u\n",
2148 			__func__, get_node_idx(bvf, node));
2149 		return -ENOMEM;
2150 	}
2151 
2152 	/* make a copy of current state */
2153 	memcpy(st, bvf->evst, sizeof(*st));
2154 
2155 	/* swap current state with new one */
2156 	node->evst = bvf->evst;
2157 	bvf->evst = st;
2158 
2159 	RTE_BPF_LOG(DEBUG, "%s(bvf=%p,node=%u) old/new states: %p/%p;\n",
2160 		__func__, bvf, get_node_idx(bvf, node), node->evst, bvf->evst);
2161 
2162 	return 0;
2163 }
2164 
2165 /*
2166  * Restore previous eval state and mark current eval state as free.
2167  */
2168 static void
2169 restore_eval_state(struct bpf_verifier *bvf, struct inst_node *node)
2170 {
2171 	RTE_BPF_LOG(DEBUG, "%s(bvf=%p,node=%u) old/new states: %p/%p;\n",
2172 		__func__, bvf, get_node_idx(bvf, node), bvf->evst, node->evst);
2173 
2174 	bvf->evst = node->evst;
2175 	node->evst = NULL;
2176 	push_eval_state(bvf);
2177 }
2178 
2179 static void
2180 log_eval_state(const struct bpf_verifier *bvf, const struct ebpf_insn *ins,
2181 	uint32_t pc, int32_t loglvl)
2182 {
2183 	const struct bpf_eval_state *st;
2184 	const struct bpf_reg_val *rv;
2185 
2186 	rte_log(loglvl, rte_bpf_logtype, "%s(pc=%u):\n", __func__, pc);
2187 
2188 	st = bvf->evst;
2189 	rv = st->rv + ins->dst_reg;
2190 
2191 	rte_log(loglvl, rte_bpf_logtype,
2192 		"r%u={\n"
2193 		"\tv={type=%u, size=%zu},\n"
2194 		"\tmask=0x%" PRIx64 ",\n"
2195 		"\tu={min=0x%" PRIx64 ", max=0x%" PRIx64 "},\n"
2196 		"\ts={min=%" PRId64 ", max=%" PRId64 "},\n"
2197 		"};\n",
2198 		ins->dst_reg,
2199 		rv->v.type, rv->v.size,
2200 		rv->mask,
2201 		rv->u.min, rv->u.max,
2202 		rv->s.min, rv->s.max);
2203 }
2204 
2205 /*
2206  * Do second pass through CFG and try to evaluate instructions
2207  * via each possible path.
2208  * Right now evaluation functionality is quite limited.
2209  * Still need to add extra checks for:
2210  * - use/return uninitialized registers.
2211  * - use uninitialized data from the stack.
2212  * - memory boundaries violation.
2213  */
2214 static int
2215 evaluate(struct bpf_verifier *bvf)
2216 {
2217 	int32_t rc;
2218 	uint32_t idx, op;
2219 	const char *err;
2220 	const struct ebpf_insn *ins;
2221 	struct inst_node *next, *node;
2222 
2223 	/* initial state of frame pointer */
2224 	static const struct bpf_reg_val rvfp = {
2225 		.v = {
2226 			.type = BPF_ARG_PTR_STACK,
2227 			.size = MAX_BPF_STACK_SIZE,
2228 		},
2229 		.mask = UINT64_MAX,
2230 		.u = {.min = MAX_BPF_STACK_SIZE, .max = MAX_BPF_STACK_SIZE},
2231 		.s = {.min = MAX_BPF_STACK_SIZE, .max = MAX_BPF_STACK_SIZE},
2232 	};
2233 
2234 	bvf->evst->rv[EBPF_REG_1].v = bvf->prm->prog_arg;
2235 	bvf->evst->rv[EBPF_REG_1].mask = UINT64_MAX;
2236 	if (bvf->prm->prog_arg.type == RTE_BPF_ARG_RAW)
2237 		eval_max_bound(bvf->evst->rv + EBPF_REG_1, UINT64_MAX);
2238 
2239 	bvf->evst->rv[EBPF_REG_10] = rvfp;
2240 
2241 	ins = bvf->prm->ins;
2242 	node = bvf->in;
2243 	next = node;
2244 	rc = 0;
2245 
2246 	while (node != NULL && rc == 0) {
2247 
2248 		/*
2249 		 * current node evaluation, make sure we evaluate
2250 		 * each node only once.
2251 		 */
2252 		if (next != NULL) {
2253 
2254 			bvf->evin = node;
2255 			idx = get_node_idx(bvf, node);
2256 			op = ins[idx].code;
2257 
2258 			/* for jcc node make a copy of evaluation state */
2259 			if (node->nb_edge > 1)
2260 				rc |= save_eval_state(bvf, node);
2261 
2262 			if (ins_chk[op].eval != NULL && rc == 0) {
2263 				err = ins_chk[op].eval(bvf, ins + idx);
2264 				if (err != NULL) {
2265 					RTE_BPF_LOG(ERR, "%s: %s at pc: %u\n",
2266 						__func__, err, idx);
2267 					rc = -EINVAL;
2268 				}
2269 			}
2270 
2271 			log_eval_state(bvf, ins + idx, idx, RTE_LOG_DEBUG);
2272 			bvf->evin = NULL;
2273 		}
2274 
2275 		/* proceed through CFG */
2276 		next = get_next_node(bvf, node);
2277 		if (next != NULL) {
2278 
2279 			/* proceed with next child */
2280 			if (node->cur_edge == node->nb_edge &&
2281 					node->evst != NULL)
2282 				restore_eval_state(bvf, node);
2283 
2284 			next->prev_node = get_node_idx(bvf, node);
2285 			node = next;
2286 		} else {
2287 			/*
2288 			 * finished with current node and all it's kids,
2289 			 * proceed with parent
2290 			 */
2291 			node->cur_edge = 0;
2292 			node = get_prev_node(bvf, node);
2293 
2294 			/* finished */
2295 			if (node == bvf->in)
2296 				node = NULL;
2297 		}
2298 	}
2299 
2300 	return rc;
2301 }
2302 
2303 int
2304 bpf_validate(struct rte_bpf *bpf)
2305 {
2306 	int32_t rc;
2307 	struct bpf_verifier bvf;
2308 
2309 	/* check input argument type, don't allow mbuf ptr on 32-bit */
2310 	if (bpf->prm.prog_arg.type != RTE_BPF_ARG_RAW &&
2311 			bpf->prm.prog_arg.type != RTE_BPF_ARG_PTR &&
2312 			(sizeof(uint64_t) != sizeof(uintptr_t) ||
2313 			bpf->prm.prog_arg.type != RTE_BPF_ARG_PTR_MBUF)) {
2314 		RTE_BPF_LOG(ERR, "%s: unsupported argument type\n", __func__);
2315 		return -ENOTSUP;
2316 	}
2317 
2318 	memset(&bvf, 0, sizeof(bvf));
2319 	bvf.prm = &bpf->prm;
2320 	bvf.in = calloc(bpf->prm.nb_ins, sizeof(bvf.in[0]));
2321 	if (bvf.in == NULL)
2322 		return -ENOMEM;
2323 
2324 	rc = validate(&bvf);
2325 
2326 	if (rc == 0) {
2327 		rc = evst_pool_init(&bvf);
2328 		if (rc == 0)
2329 			rc = evaluate(&bvf);
2330 		evst_pool_fini(&bvf);
2331 	}
2332 
2333 	free(bvf.in);
2334 
2335 	/* copy collected info */
2336 	if (rc == 0) {
2337 		bpf->stack_sz = bvf.stack_sz;
2338 
2339 		/* for LD_ABS/LD_IND, we'll need extra space on the stack */
2340 		if (bvf.nb_ldmb_nodes != 0)
2341 			bpf->stack_sz = RTE_ALIGN_CEIL(bpf->stack_sz +
2342 				sizeof(uint64_t), sizeof(uint64_t));
2343 	}
2344 
2345 	return rc;
2346 }
2347