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