New upstream version 18.08
[deb_dpdk.git] / lib / librte_bpf / bpf_def.h
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 #ifdef __cplusplus
26 extern "C" {
27 #endif
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  * eBPF instruction format
125  */
126 struct ebpf_insn {
127         uint8_t code;
128         uint8_t dst_reg:4;
129         uint8_t src_reg:4;
130         int16_t off;
131         int32_t imm;
132 };
133
134 /*
135  * eBPF allows functions with R1-R5 as arguments.
136  */
137 #define EBPF_FUNC_MAX_ARGS      (EBPF_REG_6 - EBPF_REG_1)
138
139 #ifdef __cplusplus
140 }
141 #endif
142
143 #endif /* RTE_BPF_DEF_H_ */