xref: /dpdk/lib/bpf/bpf_def.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 1982, 1986, 1990, 1993
3  *      The Regents of the University of California.
4  * Copyright(c) 2018 Intel Corporation.
5  */
6 
7 #ifndef _RTE_BPF_DEF_H_
8 #define _RTE_BPF_DEF_H_
9 
10 /**
11  * @file
12  *
13  * classic BPF (cBPF) and extended BPF (eBPF) related defines.
14  * For more information regarding cBPF and eBPF ISA and their differences,
15  * please refer to:
16  * https://www.kernel.org/doc/Documentation/networking/filter.txt.
17  * As a rule of thumb for that file:
18  * all definitions used by both cBPF and eBPF start with bpf(BPF)_ prefix,
19  * while eBPF only ones start with ebpf(EBPF)) prefix.
20  */
21 
22 #include <stdint.h>
23 
24 
25 /*
26  * The instruction encodings.
27  */
28 
29 /* Instruction classes */
30 #define BPF_CLASS(code) ((code) & 0x07)
31 #define	BPF_LD		0x00
32 #define	BPF_LDX		0x01
33 #define	BPF_ST		0x02
34 #define	BPF_STX		0x03
35 #define	BPF_ALU		0x04
36 #define	BPF_JMP		0x05
37 #define	BPF_RET		0x06
38 #define	BPF_MISC        0x07
39 
40 #define EBPF_ALU64	0x07
41 
42 /* ld/ldx fields */
43 #define BPF_SIZE(code)  ((code) & 0x18)
44 #define	BPF_W		0x00
45 #define	BPF_H		0x08
46 #define	BPF_B		0x10
47 #define	EBPF_DW		0x18
48 
49 #define BPF_MODE(code)  ((code) & 0xe0)
50 #define	BPF_IMM		0x00
51 #define	BPF_ABS		0x20
52 #define	BPF_IND		0x40
53 #define	BPF_MEM		0x60
54 #define	BPF_LEN		0x80
55 #define	BPF_MSH		0xa0
56 
57 #define EBPF_XADD	0xc0
58 
59 /* alu/jmp fields */
60 #define BPF_OP(code)    ((code) & 0xf0)
61 #define	BPF_ADD		0x00
62 #define	BPF_SUB		0x10
63 #define	BPF_MUL		0x20
64 #define	BPF_DIV		0x30
65 #define	BPF_OR		0x40
66 #define	BPF_AND		0x50
67 #define	BPF_LSH		0x60
68 #define	BPF_RSH		0x70
69 #define	BPF_NEG		0x80
70 #define	BPF_MOD		0x90
71 #define	BPF_XOR		0xa0
72 
73 #define EBPF_MOV	0xb0
74 #define EBPF_ARSH	0xc0
75 #define EBPF_END	0xd0
76 
77 #define	BPF_JA		0x00
78 #define	BPF_JEQ		0x10
79 #define	BPF_JGT		0x20
80 #define	BPF_JGE		0x30
81 #define	BPF_JSET        0x40
82 
83 #define EBPF_JNE	0x50
84 #define EBPF_JSGT	0x60
85 #define EBPF_JSGE	0x70
86 #define EBPF_CALL	0x80
87 #define EBPF_EXIT	0x90
88 #define EBPF_JLT	0xa0
89 #define EBPF_JLE	0xb0
90 #define EBPF_JSLT	0xc0
91 #define EBPF_JSLE	0xd0
92 
93 #define BPF_SRC(code)   ((code) & 0x08)
94 #define	BPF_K		0x00
95 #define	BPF_X		0x08
96 
97 /* if BPF_OP(code) == EBPF_END */
98 #define EBPF_TO_LE	0x00  /* convert to little-endian */
99 #define EBPF_TO_BE	0x08  /* convert to big-endian */
100 
101 /*
102  * eBPF registers
103  */
104 enum {
105 	EBPF_REG_0,  /* return value from internal function/for eBPF program */
106 	EBPF_REG_1,  /* 0-th argument to internal function */
107 	EBPF_REG_2,  /* 1-th argument to internal function */
108 	EBPF_REG_3,  /* 2-th argument to internal function */
109 	EBPF_REG_4,  /* 3-th argument to internal function */
110 	EBPF_REG_5,  /* 4-th argument to internal function */
111 	EBPF_REG_6,  /* callee saved register */
112 	EBPF_REG_7,  /* callee saved register */
113 	EBPF_REG_8,  /* callee saved register */
114 	EBPF_REG_9,  /* callee saved register */
115 	EBPF_REG_10, /* stack pointer (read-only) */
116 	EBPF_REG_NUM,
117 };
118 
119 /*
120  * When EBPF_CALL instruction has src_reg == EBPF_PSEUDO_CALL,
121  * it should be treated as pseudo-call instruction, where
122  * imm value contains pc-relative offset to another EBPF function.
123  * Right now DPDK EBPF library doesn't support it.
124  */
125 #define	EBPF_PSEUDO_CALL	EBPF_REG_1
126 
127 /*
128  * eBPF instruction format
129  */
130 struct ebpf_insn {
131 	uint8_t code;
132 	uint8_t dst_reg:4;
133 	uint8_t src_reg:4;
134 	int16_t off;
135 	int32_t imm;
136 };
137 
138 /*
139  * eBPF allows functions with R1-R5 as arguments.
140  */
141 #define	EBPF_FUNC_MAX_ARGS	(EBPF_REG_6 - EBPF_REG_1)
142 
143 #endif /* RTE_BPF_DEF_H_ */
144