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