Line data Source code
1 : /* interp_jump_table holds the sBPF interpreter jump table. It is an
2 : array where each index is an opcode that can be jumped to be
3 : executed. Invalid opcodes branch to the sigill label. */
4 8223 : #include "../../ballet/sbpf/fd_sbpf_loader.h"
5 1874844 : # define OPCODE(opcode) interp_##opcode
6 4547319 : # define ALL_ILLEGAL(op) [0][op] = &&sigill, [1][op] = &&sigill, [2][op] = &&sigill, [3][op] = &&sigill
7 1874844 : # define ALL_OPCODE( op) [0][op] = &&OPCODE(op), [1][op] = &&OPCODE(op), [2][op] = &&OPCODE(op), [3][op] = &&OPCODE(op)
8 8223 : # define CONDITIONAL(op, C, ltrue, lfalse) \
9 2006412 : [0][op] = C(0) ? (ltrue):(lfalse), \
10 2006412 : [1][op] = C(1) ? (ltrue):(lfalse), \
11 2006412 : [2][op] = C(2) ? (ltrue):(lfalse), \
12 2006412 : [3][op] = C(3) ? (ltrue):(lfalse)
13 :
14 8223 : static void const * const interp_jump_table[ FD_SBPF_VERSION_COUNT ][ 256 ] = {
15 : /* First we start with the opcodes that are the same in all version
16 : of sBPF. We leave gaps for the ones that depend on the version
17 : of sBPF, with the gap numbered based on the order they appear in
18 : the first table and the order in which they appear in the
19 : CONDITIONAL list below. If we get it wrong, the compiler will
20 : complain about initialized fields being overwritten. */
21 :
22 8223 : ALL_ILLEGAL(0x00), ALL_ILLEGAL(0x01), ALL_ILLEGAL(0x02), ALL_ILLEGAL(0x03),
23 8223 : /* 55 : 0 */ ALL_OPCODE (0x05), ALL_ILLEGAL(0x06), ALL_OPCODE (0x07),
24 8223 : ALL_ILLEGAL(0x08), ALL_ILLEGAL(0x09), ALL_ILLEGAL(0x0a), ALL_ILLEGAL(0x0b),
25 8223 : /* 56 : 1 */ ALL_ILLEGAL(0x0d), ALL_ILLEGAL(0x0e), ALL_OPCODE (0x0f),
26 8223 : ALL_ILLEGAL(0x10), ALL_ILLEGAL(0x11), ALL_ILLEGAL(0x12), ALL_ILLEGAL(0x13),
27 8223 : /* 59 : 2 */ ALL_OPCODE (0x15), ALL_ILLEGAL(0x16), /* 60 : 3 */
28 8223 : /* 0 : 4 */ ALL_ILLEGAL(0x19), ALL_ILLEGAL(0x1a), ALL_ILLEGAL(0x1b),
29 8223 : /* 57 : 5 */ ALL_OPCODE (0x1d), ALL_ILLEGAL(0x1e), ALL_OPCODE (0x1f),
30 8223 : ALL_ILLEGAL(0x20), ALL_ILLEGAL(0x21), ALL_ILLEGAL(0x22), ALL_ILLEGAL(0x23),
31 8223 : /* 51 : 6 */ ALL_OPCODE (0x25), ALL_ILLEGAL(0x26), /* 19 : 7 */
32 8223 : ALL_ILLEGAL(0x28), ALL_ILLEGAL(0x29), ALL_ILLEGAL(0x2a), ALL_ILLEGAL(0x2b),
33 8223 : /* 18 : 8 */ ALL_OPCODE (0x2d), ALL_ILLEGAL(0x2e), /* 20 : 9 */
34 8223 : ALL_ILLEGAL(0x30), ALL_ILLEGAL(0x31), ALL_ILLEGAL(0x32), ALL_ILLEGAL(0x33),
35 8223 : /* 52 : 10 */ ALL_OPCODE (0x35), /* 27 : 11 */ /* 13 : 12 */
36 8223 : ALL_ILLEGAL(0x38), ALL_ILLEGAL(0x39), ALL_ILLEGAL(0x3a), ALL_ILLEGAL(0x3b),
37 8223 : /* 12 : 13 */ ALL_OPCODE (0x3d), /* 28 : 14 */ /* 14 : 15 */
38 8223 : ALL_ILLEGAL(0x40), ALL_ILLEGAL(0x41), ALL_ILLEGAL(0x42), ALL_ILLEGAL(0x43),
39 8223 : ALL_OPCODE (0x44), ALL_OPCODE (0x45), /* 29 : 16 */ ALL_OPCODE (0x47),
40 8223 : ALL_ILLEGAL(0x48), ALL_ILLEGAL(0x49), ALL_ILLEGAL(0x4a), ALL_ILLEGAL(0x4b),
41 8223 : ALL_OPCODE (0x4c), ALL_OPCODE (0x4d), /* 30 : 17 */ ALL_OPCODE (0x4f),
42 8223 : ALL_ILLEGAL(0x50), ALL_ILLEGAL(0x51), ALL_ILLEGAL(0x52), ALL_ILLEGAL(0x53),
43 8223 : ALL_OPCODE (0x54), ALL_OPCODE (0x55), /* 31 : 18 */ ALL_OPCODE (0x57),
44 8223 : ALL_ILLEGAL(0x58), ALL_ILLEGAL(0x59), ALL_ILLEGAL(0x5a), ALL_ILLEGAL(0x5b),
45 8223 : ALL_OPCODE (0x5c), ALL_OPCODE (0x5d), /* 32 : 19 */ ALL_OPCODE (0x5f),
46 8223 : ALL_ILLEGAL(0x60), /* 3 : 20 */ /* 4 : 21 */ /* 5 : 22 */
47 8223 : ALL_OPCODE (0x64), ALL_OPCODE (0x65), /* 33 : 23 */ ALL_OPCODE (0x67),
48 8223 : ALL_ILLEGAL(0x68), /* 9 : 24 */ /* 10 : 25 */ /* 11 : 26 */
49 8223 : ALL_OPCODE (0x6c), ALL_OPCODE (0x6d), /* 34 : 27 */ ALL_OPCODE (0x6f),
50 8223 : ALL_ILLEGAL(0x70), /* 15 : 28 */ /* 16 : 29 */ /* 17 : 30 */
51 8223 : ALL_OPCODE (0x74), ALL_OPCODE (0x75), /* 35 : 31 */ ALL_OPCODE (0x77),
52 8223 : ALL_ILLEGAL(0x78), /* 21 : 32 */ /* 22 : 33 */ /* 23 : 34 */
53 8223 : ALL_OPCODE (0x7c), ALL_OPCODE (0x7d), /* 36 : 35 */ ALL_OPCODE (0x7f),
54 8223 : ALL_ILLEGAL(0x80), ALL_ILLEGAL(0x81), ALL_ILLEGAL(0x82), ALL_ILLEGAL(0x83),
55 8223 : /* 54 : 36 */ ALL_OPCODE (0x85), /* 37 : 38 */ /* 7 : 39 */
56 8223 : ALL_ILLEGAL(0x88), ALL_ILLEGAL(0x89), ALL_ILLEGAL(0x8a), ALL_ILLEGAL(0x8b),
57 8223 : /* 6 : 40 */ ALL_OPCODE (0x8d), /* 38 : 42 */ /* 8 : 43 */
58 8223 : ALL_ILLEGAL(0x90), ALL_ILLEGAL(0x91), ALL_ILLEGAL(0x92), ALL_ILLEGAL(0x93),
59 8223 : /* 53 : 44 */ ALL_OPCODE (0x95), /* 39 : 46 */ /* 25 : 47 */
60 8223 : ALL_ILLEGAL(0x98), ALL_ILLEGAL(0x99), ALL_ILLEGAL(0x9a), ALL_ILLEGAL(0x9b),
61 8223 : /* 24 : 48 */ ALL_ILLEGAL(0x9d), /* 40 : 50 */ /* 26 : 51 */
62 8223 : ALL_ILLEGAL(0xa0), ALL_ILLEGAL(0xa1), ALL_ILLEGAL(0xa2), ALL_ILLEGAL(0xa3),
63 8223 : ALL_OPCODE (0xa4), ALL_OPCODE (0xa5), ALL_ILLEGAL(0xa6), ALL_OPCODE (0xa7),
64 8223 : ALL_ILLEGAL(0xa8), ALL_ILLEGAL(0xa9), ALL_ILLEGAL(0xaa), ALL_ILLEGAL(0xab),
65 8223 : ALL_OPCODE (0xac), ALL_OPCODE (0xad), ALL_ILLEGAL(0xae), ALL_OPCODE (0xaf),
66 8223 : ALL_ILLEGAL(0xb0), ALL_ILLEGAL(0xb1), ALL_ILLEGAL(0xb2), ALL_ILLEGAL(0xb3),
67 8223 : ALL_OPCODE (0xb4), ALL_OPCODE (0xb5), /* 41 : 52 */ ALL_OPCODE (0xb7),
68 8223 : ALL_ILLEGAL(0xb8), ALL_ILLEGAL(0xb9), ALL_ILLEGAL(0xba), ALL_ILLEGAL(0xbb),
69 8223 : /* 58 : 53 */ ALL_OPCODE (0xbd), /* 42 : 54 */ ALL_OPCODE (0xbf),
70 8223 : ALL_ILLEGAL(0xc0), ALL_ILLEGAL(0xc1), ALL_ILLEGAL(0xc2), ALL_ILLEGAL(0xc3),
71 8223 : ALL_OPCODE (0xc4), ALL_OPCODE (0xc5), /* 43 : 55 */ ALL_OPCODE (0xc7),
72 8223 : ALL_ILLEGAL(0xc8), ALL_ILLEGAL(0xc9), ALL_ILLEGAL(0xca), ALL_ILLEGAL(0xcb),
73 8223 : ALL_OPCODE (0xcc), ALL_OPCODE (0xcd), /* 44 : 56 */ ALL_OPCODE (0xcf),
74 8223 : ALL_ILLEGAL(0xd0), ALL_ILLEGAL(0xd1), ALL_ILLEGAL(0xd2), ALL_ILLEGAL(0xd3),
75 8223 : /* 2 : 57 */ ALL_OPCODE (0xd5), /* 45 : 58 */ ALL_ILLEGAL(0xd7),
76 8223 : ALL_ILLEGAL(0xd8), ALL_ILLEGAL(0xd9), ALL_ILLEGAL(0xda), ALL_ILLEGAL(0xdb),
77 8223 : ALL_OPCODE (0xdc), ALL_OPCODE (0xdd), /* 46 : 59 */ ALL_ILLEGAL(0xdf),
78 8223 : ALL_ILLEGAL(0xe0), ALL_ILLEGAL(0xe1), ALL_ILLEGAL(0xe2), ALL_ILLEGAL(0xe3),
79 8223 : ALL_ILLEGAL(0xe4), ALL_ILLEGAL(0xe5), /* 47 : 60 */ ALL_ILLEGAL(0xe7),
80 8223 : ALL_ILLEGAL(0xe8), ALL_ILLEGAL(0xe9), ALL_ILLEGAL(0xea), ALL_ILLEGAL(0xeb),
81 8223 : ALL_ILLEGAL(0xec), ALL_ILLEGAL(0xed), /* 48 : 61 */ ALL_ILLEGAL(0xef),
82 8223 : ALL_ILLEGAL(0xf0), ALL_ILLEGAL(0xf1), ALL_ILLEGAL(0xf2), ALL_ILLEGAL(0xf3),
83 8223 : ALL_ILLEGAL(0xf4), ALL_ILLEGAL(0xf5), /* 49 : 62 */ /* 1 : 63 */
84 8223 : ALL_ILLEGAL(0xf8), ALL_ILLEGAL(0xf9), ALL_ILLEGAL(0xfa), ALL_ILLEGAL(0xfb),
85 8223 : ALL_ILLEGAL(0xfc), ALL_ILLEGAL(0xfd), /* 50 : 64 */ ALL_ILLEGAL(0xff),
86 :
87 :
88 : /* SIMD-0173: LDDW */
89 32892 : /* 0: 4 */ CONDITIONAL( 0x18, FD_VM_SBPF_ENABLE_LDDW, &&interp_0x18, &&sigill),
90 32892 : /* 1: 63 */ CONDITIONAL( 0xf7, FD_VM_SBPF_ENABLE_LDDW, &&sigill, &&interp_0xf7),
91 :
92 : /* SIMD-0173: LE */
93 32892 : /* 2: 57 */ CONDITIONAL( 0xd4, FD_VM_SBPF_ENABLE_LE, &&interp_0xd4, &&sigill),
94 :
95 : /* SIMD-0173: LDXW, STW, STXW */
96 32892 : /* 3: 20 */ CONDITIONAL( 0x61, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x8c),
97 32892 : /* 4: 21 */ CONDITIONAL( 0x62, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x87),
98 32892 : /* 5: 22 */ CONDITIONAL( 0x63, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x8f),
99 32892 : /* 6: 40 */ CONDITIONAL( 0x8c, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x8c, &&sigill),
100 32892 : /* 7: 39 */ CONDITIONAL( 0x87, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x87, &&interp_0x87depr),
101 32892 : /* 8: 43 */ CONDITIONAL( 0x8f, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x8f, &&sigill),
102 :
103 : /* SIMD-0173: LDXH, STH, STXH */
104 32892 : /* 9: 24 */ CONDITIONAL( 0x69, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x3c),
105 32892 : /* 10: 25 */ CONDITIONAL( 0x6a, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x37),
106 32892 : /* 11: 26 */ CONDITIONAL( 0x6b, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x3f),
107 32892 : /* 12: 13 */ CONDITIONAL( 0x3c, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x3c, &&interp_0x3cdepr),
108 32892 : /* 13: 12 */ CONDITIONAL( 0x37, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x37, &&interp_0x37depr),
109 32892 : /* 14: 15 */ CONDITIONAL( 0x3f, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x3f, &&interp_0x3fdepr),
110 :
111 : /* SIMD-0173: LDXB, STB, STXB */
112 32892 : /* 15: 28 */ CONDITIONAL( 0x71, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x2c),
113 32892 : /* 16: 29 */ CONDITIONAL( 0x72, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x27),
114 32892 : /* 17: 30 */ CONDITIONAL( 0x73, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x2f),
115 32892 : /* 18: 8 */ CONDITIONAL( 0x2c, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x2c, &&interp_0x2cdepr),
116 32892 : /* 19: 7 */ CONDITIONAL( 0x27, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x27, &&interp_0x27depr),
117 32892 : /* 20: 9 */ CONDITIONAL( 0x2f, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x2f, &&interp_0x2fdepr),
118 :
119 : /* SIMD-0173: LDXDW, STDW, STXDW */
120 32892 : /* 21: 32 */ CONDITIONAL( 0x79, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x9c),
121 32892 : /* 22: 33 */ CONDITIONAL( 0x7a, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x97),
122 32892 : /* 23: 34 */ CONDITIONAL( 0x7b, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&sigill, &&interp_0x9f),
123 32892 : /* 24: 48 */ CONDITIONAL( 0x9c, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x9c, &&interp_0x9cdepr),
124 32892 : /* 25: 47 */ CONDITIONAL( 0x97, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x97, &&interp_0x97depr),
125 32892 : /* 26: 51 */ CONDITIONAL( 0x9f, FD_VM_SBPF_MOVE_MEMORY_IX_CLASSES, &&interp_0x9f, &&interp_0x9fdepr),
126 :
127 : /* SIMD-0174: PQR */
128 32892 : /* 27: 11 */ CONDITIONAL( 0x36, FD_VM_SBPF_ENABLE_PQR, &&interp_0x36, &&sigill),
129 32892 : /* 28: 14 */ CONDITIONAL( 0x3e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x3e, &&sigill),
130 32892 : /* 29: 16 */ CONDITIONAL( 0x46, FD_VM_SBPF_ENABLE_PQR, &&interp_0x46, &&sigill),
131 32892 : /* 30: 17 */ CONDITIONAL( 0x4e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x4e, &&sigill),
132 32892 : /* 31: 18 */ CONDITIONAL( 0x56, FD_VM_SBPF_ENABLE_PQR, &&interp_0x56, &&sigill),
133 32892 : /* 32: 19 */ CONDITIONAL( 0x5e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x5e, &&sigill),
134 32892 : /* 33: 23 */ CONDITIONAL( 0x66, FD_VM_SBPF_ENABLE_PQR, &&interp_0x66, &&sigill),
135 32892 : /* 34: 27 */ CONDITIONAL( 0x6e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x6e, &&sigill),
136 32892 : /* 35: 31 */ CONDITIONAL( 0x76, FD_VM_SBPF_ENABLE_PQR, &&interp_0x76, &&sigill),
137 32892 : /* 36: 35 */ CONDITIONAL( 0x7e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x7e, &&sigill),
138 32892 : /* 37: 38 */ CONDITIONAL( 0x86, FD_VM_SBPF_ENABLE_PQR, &&interp_0x86, &&sigill),
139 32892 : /* 38: 42 */ CONDITIONAL( 0x8e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x8e, &&sigill),
140 32892 : /* 39: 46 */ CONDITIONAL( 0x96, FD_VM_SBPF_ENABLE_PQR, &&interp_0x96, &&sigill),
141 32892 : /* 40: 50 */ CONDITIONAL( 0x9e, FD_VM_SBPF_ENABLE_PQR, &&interp_0x9e, &&sigill),
142 32892 : /* 41: 52 */ CONDITIONAL( 0xb6, FD_VM_SBPF_ENABLE_PQR, &&interp_0xb6, &&sigill),
143 32892 : /* 42: 54 */ CONDITIONAL( 0xbe, FD_VM_SBPF_ENABLE_PQR, &&interp_0xbe, &&sigill),
144 32892 : /* 43: 55 */ CONDITIONAL( 0xc6, FD_VM_SBPF_ENABLE_PQR, &&interp_0xc6, &&sigill),
145 32892 : /* 44: 56 */ CONDITIONAL( 0xce, FD_VM_SBPF_ENABLE_PQR, &&interp_0xce, &&sigill),
146 32892 : /* 45: 58 */ CONDITIONAL( 0xd6, FD_VM_SBPF_ENABLE_PQR, &&interp_0xd6, &&sigill),
147 32892 : /* 46: 59 */ CONDITIONAL( 0xde, FD_VM_SBPF_ENABLE_PQR, &&interp_0xde, &&sigill),
148 32892 : /* 47: 60 */ CONDITIONAL( 0xe6, FD_VM_SBPF_ENABLE_PQR, &&interp_0xe6, &&sigill),
149 32892 : /* 48: 61 */ CONDITIONAL( 0xee, FD_VM_SBPF_ENABLE_PQR, &&interp_0xee, &&sigill),
150 32892 : /* 49: 62 */ CONDITIONAL( 0xf6, FD_VM_SBPF_ENABLE_PQR, &&interp_0xf6, &&sigill),
151 32892 : /* 50: 64 */ CONDITIONAL( 0xfe, FD_VM_SBPF_ENABLE_PQR, &&interp_0xfe, &&sigill),
152 :
153 : /* SIMD-0174: disable MUL, DIV, MOD */
154 32892 : /* 51: 6 */ CONDITIONAL( 0x24, FD_VM_SBPF_ENABLE_PQR, &&sigill, &&interp_0x24),
155 32892 : /* 52: 10 */ CONDITIONAL( 0x34, FD_VM_SBPF_ENABLE_PQR, &&sigill, &&interp_0x34),
156 32892 : /* 53: 44 */ CONDITIONAL( 0x94, FD_VM_SBPF_ENABLE_PQR, &&sigill, &&interp_0x94),
157 :
158 : /* SIMD-0174: NEG */
159 32892 : /* 54: 36 */ CONDITIONAL( 0x84, FD_VM_SBPF_ENABLE_NEG, &&interp_0x84, &&sigill),
160 :
161 : /* SIMD-0174: Explicit Sign Extension + Register Immediate Subtraction.
162 : Note: 0x14 is affected by both. */
163 32892 : /* 55: 0 */ CONDITIONAL( 0x04, FD_VM_SBPF_EXPLICIT_SIGN_EXT, &&interp_0x04, &&interp_0x04depr),
164 32892 : /* 56: 1 */ CONDITIONAL( 0x0c, FD_VM_SBPF_EXPLICIT_SIGN_EXT, &&interp_0x0c, &&interp_0x0cdepr),
165 32892 : /* 57: 5 */ CONDITIONAL( 0x1c, FD_VM_SBPF_EXPLICIT_SIGN_EXT, &&interp_0x1c, &&interp_0x1cdepr),
166 32892 : /* 58: 53 */ CONDITIONAL( 0xbc, FD_VM_SBPF_EXPLICIT_SIGN_EXT, &&interp_0xbc, &&interp_0xbcdepr),
167 32892 : /* 59: 2 */ CONDITIONAL( 0x14, FD_VM_SBPF_SWAP_SUB_REG_IMM_OPERANDS, &&interp_0x14, &&interp_0x14depr),
168 32892 : /* 60: 3 */ CONDITIONAL( 0x17, FD_VM_SBPF_SWAP_SUB_REG_IMM_OPERANDS, &&interp_0x17, &&interp_0x17depr),
169 :
170 8223 : # undef ALL_ILLEGAL
171 8223 : # undef ALL_OPCODE
172 8223 : # undef CONDITIONAL
173 8223 : # undef OPCODE
174 8223 : };
|