diff options
author | Avi Kivity <avi@redhat.com> | 2010-07-29 08:11:53 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:50:25 -0400 |
commit | 73fba5f4fe3e08bd7acb18a65b53643445c8f028 (patch) | |
tree | 88a1332c4888379c42d5d983deff2614962e3cbf | |
parent | dde7e6d12a9ef9f727d05ce824f4fe75ca2a5b3a (diff) |
KVM: x86 emulator: move decode tables downwards
So they can reference execution functions.
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | arch/x86/kvm/emulate.c | 472 |
1 files changed, 236 insertions, 236 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index c6f435917538..70a7cb49ff88 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -117,242 +117,6 @@ struct group_dual { | |||
117 | struct opcode mod3[8]; | 117 | struct opcode mod3[8]; |
118 | }; | 118 | }; |
119 | 119 | ||
120 | #define D(_y) { .flags = (_y) } | ||
121 | #define N D(0) | ||
122 | #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) } | ||
123 | #define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) } | ||
124 | #define I(_f, _e) { .flags = (_f), .u.execute = (_e) } | ||
125 | |||
126 | static struct opcode group1[] = { | ||
127 | X7(D(Lock)), N | ||
128 | }; | ||
129 | |||
130 | static struct opcode group1A[] = { | ||
131 | D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N, | ||
132 | }; | ||
133 | |||
134 | static struct opcode group3[] = { | ||
135 | D(DstMem | SrcImm | ModRM), D(DstMem | SrcImm | ModRM), | ||
136 | D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock), | ||
137 | X4(D(Undefined)), | ||
138 | }; | ||
139 | |||
140 | static struct opcode group4[] = { | ||
141 | D(ByteOp | DstMem | SrcNone | ModRM | Lock), D(ByteOp | DstMem | SrcNone | ModRM | Lock), | ||
142 | N, N, N, N, N, N, | ||
143 | }; | ||
144 | |||
145 | static struct opcode group5[] = { | ||
146 | D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock), | ||
147 | D(SrcMem | ModRM | Stack), N, | ||
148 | D(SrcMem | ModRM | Stack), D(SrcMemFAddr | ModRM | ImplicitOps), | ||
149 | D(SrcMem | ModRM | Stack), N, | ||
150 | }; | ||
151 | |||
152 | static struct group_dual group7 = { { | ||
153 | N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv), | ||
154 | D(SrcNone | ModRM | DstMem | Mov), N, | ||
155 | D(SrcMem16 | ModRM | Mov | Priv), D(SrcMem | ModRM | ByteOp | Priv), | ||
156 | }, { | ||
157 | D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv), | ||
158 | D(SrcNone | ModRM | DstMem | Mov), N, | ||
159 | D(SrcMem16 | ModRM | Mov | Priv), N, | ||
160 | } }; | ||
161 | |||
162 | static struct opcode group8[] = { | ||
163 | N, N, N, N, | ||
164 | D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock), | ||
165 | D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock), | ||
166 | }; | ||
167 | |||
168 | static struct group_dual group9 = { { | ||
169 | N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N, | ||
170 | }, { | ||
171 | N, N, N, N, N, N, N, N, | ||
172 | } }; | ||
173 | |||
174 | static struct opcode opcode_table[256] = { | ||
175 | /* 0x00 - 0x07 */ | ||
176 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
177 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
178 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
179 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
180 | /* 0x08 - 0x0F */ | ||
181 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
182 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
183 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
184 | D(ImplicitOps | Stack | No64), N, | ||
185 | /* 0x10 - 0x17 */ | ||
186 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
187 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
188 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
189 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
190 | /* 0x18 - 0x1F */ | ||
191 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
192 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
193 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
194 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
195 | /* 0x20 - 0x27 */ | ||
196 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
197 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
198 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
199 | /* 0x28 - 0x2F */ | ||
200 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
201 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
202 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
203 | /* 0x30 - 0x37 */ | ||
204 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
205 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
206 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
207 | /* 0x38 - 0x3F */ | ||
208 | D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM), | ||
209 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
210 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
211 | N, N, | ||
212 | /* 0x40 - 0x4F */ | ||
213 | X16(D(DstReg)), | ||
214 | /* 0x50 - 0x57 */ | ||
215 | X8(D(SrcReg | Stack)), | ||
216 | /* 0x58 - 0x5F */ | ||
217 | X8(D(DstReg | Stack)), | ||
218 | /* 0x60 - 0x67 */ | ||
219 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
220 | N, D(DstReg | SrcMem32 | ModRM | Mov) /* movsxd (x86/64) */ , | ||
221 | N, N, N, N, | ||
222 | /* 0x68 - 0x6F */ | ||
223 | D(SrcImm | Mov | Stack), N, D(SrcImmByte | Mov | Stack), N, | ||
224 | D(DstDI | ByteOp | Mov | String), D(DstDI | Mov | String), /* insb, insw/insd */ | ||
225 | D(SrcSI | ByteOp | ImplicitOps | String), D(SrcSI | ImplicitOps | String), /* outsb, outsw/outsd */ | ||
226 | /* 0x70 - 0x7F */ | ||
227 | X16(D(SrcImmByte)), | ||
228 | /* 0x80 - 0x87 */ | ||
229 | G(ByteOp | DstMem | SrcImm | ModRM | Group, group1), | ||
230 | G(DstMem | SrcImm | ModRM | Group, group1), | ||
231 | G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1), | ||
232 | G(DstMem | SrcImmByte | ModRM | Group, group1), | ||
233 | D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM), | ||
234 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
235 | /* 0x88 - 0x8F */ | ||
236 | D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov), | ||
237 | D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov), | ||
238 | D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg), | ||
239 | D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), | ||
240 | /* 0x90 - 0x97 */ | ||
241 | D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), | ||
242 | /* 0x98 - 0x9F */ | ||
243 | N, N, D(SrcImmFAddr | No64), N, | ||
244 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N, | ||
245 | /* 0xA0 - 0xA7 */ | ||
246 | D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs), | ||
247 | D(ByteOp | DstMem | SrcAcc | Mov | MemAbs), D(DstMem | SrcAcc | Mov | MemAbs), | ||
248 | D(ByteOp | SrcSI | DstDI | Mov | String), D(SrcSI | DstDI | Mov | String), | ||
249 | D(ByteOp | SrcSI | DstDI | String), D(SrcSI | DstDI | String), | ||
250 | /* 0xA8 - 0xAF */ | ||
251 | D(DstAcc | SrcImmByte | ByteOp), D(DstAcc | SrcImm), D(ByteOp | DstDI | Mov | String), D(DstDI | Mov | String), | ||
252 | D(ByteOp | SrcSI | DstAcc | Mov | String), D(SrcSI | DstAcc | Mov | String), | ||
253 | D(ByteOp | DstDI | String), D(DstDI | String), | ||
254 | /* 0xB0 - 0xB7 */ | ||
255 | X8(D(ByteOp | DstReg | SrcImm | Mov)), | ||
256 | /* 0xB8 - 0xBF */ | ||
257 | X8(D(DstReg | SrcImm | Mov)), | ||
258 | /* 0xC0 - 0xC7 */ | ||
259 | D(ByteOp | DstMem | SrcImm | ModRM), D(DstMem | SrcImmByte | ModRM), | ||
260 | N, D(ImplicitOps | Stack), N, N, | ||
261 | D(ByteOp | DstMem | SrcImm | ModRM | Mov), D(DstMem | SrcImm | ModRM | Mov), | ||
262 | /* 0xC8 - 0xCF */ | ||
263 | N, N, N, D(ImplicitOps | Stack), | ||
264 | D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps), | ||
265 | /* 0xD0 - 0xD7 */ | ||
266 | D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM), | ||
267 | D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM), | ||
268 | N, N, N, N, | ||
269 | /* 0xD8 - 0xDF */ | ||
270 | N, N, N, N, N, N, N, N, | ||
271 | /* 0xE0 - 0xE7 */ | ||
272 | N, N, N, N, | ||
273 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), | ||
274 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), | ||
275 | /* 0xE8 - 0xEF */ | ||
276 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), | ||
277 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), | ||
278 | D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc), | ||
279 | D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc), | ||
280 | /* 0xF0 - 0xF7 */ | ||
281 | N, N, N, N, | ||
282 | D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3), | ||
283 | /* 0xF8 - 0xFF */ | ||
284 | D(ImplicitOps), N, D(ImplicitOps), D(ImplicitOps), | ||
285 | D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5), | ||
286 | }; | ||
287 | |||
288 | static struct opcode twobyte_table[256] = { | ||
289 | /* 0x00 - 0x0F */ | ||
290 | N, GD(0, &group7), N, N, | ||
291 | N, D(ImplicitOps), D(ImplicitOps | Priv), N, | ||
292 | D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N, | ||
293 | N, D(ImplicitOps | ModRM), N, N, | ||
294 | /* 0x10 - 0x1F */ | ||
295 | N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, | ||
296 | /* 0x20 - 0x2F */ | ||
297 | D(ModRM | ImplicitOps | Priv), D(ModRM | Priv), | ||
298 | D(ModRM | ImplicitOps | Priv), D(ModRM | Priv), | ||
299 | N, N, N, N, | ||
300 | N, N, N, N, N, N, N, N, | ||
301 | /* 0x30 - 0x3F */ | ||
302 | D(ImplicitOps | Priv), N, D(ImplicitOps | Priv), N, | ||
303 | D(ImplicitOps), D(ImplicitOps | Priv), N, N, | ||
304 | N, N, N, N, N, N, N, N, | ||
305 | /* 0x40 - 0x4F */ | ||
306 | X16(D(DstReg | SrcMem | ModRM | Mov)), | ||
307 | /* 0x50 - 0x5F */ | ||
308 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
309 | /* 0x60 - 0x6F */ | ||
310 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
311 | /* 0x70 - 0x7F */ | ||
312 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
313 | /* 0x80 - 0x8F */ | ||
314 | X16(D(SrcImm)), | ||
315 | /* 0x90 - 0x9F */ | ||
316 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
317 | /* 0xA0 - 0xA7 */ | ||
318 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), | ||
319 | N, D(DstMem | SrcReg | ModRM | BitOp), | ||
320 | D(DstMem | SrcReg | Src2ImmByte | ModRM), | ||
321 | D(DstMem | SrcReg | Src2CL | ModRM), N, N, | ||
322 | /* 0xA8 - 0xAF */ | ||
323 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), | ||
324 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
325 | D(DstMem | SrcReg | Src2ImmByte | ModRM), | ||
326 | D(DstMem | SrcReg | Src2CL | ModRM), | ||
327 | D(ModRM), N, | ||
328 | /* 0xB0 - 0xB7 */ | ||
329 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
330 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
331 | N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov), | ||
332 | D(DstReg | SrcMem16 | ModRM | Mov), | ||
333 | /* 0xB8 - 0xBF */ | ||
334 | N, N, | ||
335 | G(0, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
336 | N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov), | ||
337 | D(DstReg | SrcMem16 | ModRM | Mov), | ||
338 | /* 0xC0 - 0xCF */ | ||
339 | N, N, N, D(DstMem | SrcReg | ModRM | Mov), | ||
340 | N, N, N, GD(0, &group9), | ||
341 | N, N, N, N, N, N, N, N, | ||
342 | /* 0xD0 - 0xDF */ | ||
343 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
344 | /* 0xE0 - 0xEF */ | ||
345 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
346 | /* 0xF0 - 0xFF */ | ||
347 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N | ||
348 | }; | ||
349 | |||
350 | #undef D | ||
351 | #undef N | ||
352 | #undef G | ||
353 | #undef GD | ||
354 | #undef I | ||
355 | |||
356 | /* EFLAGS bit definitions. */ | 120 | /* EFLAGS bit definitions. */ |
357 | #define EFLG_ID (1<<21) | 121 | #define EFLG_ID (1<<21) |
358 | #define EFLG_VIP (1<<20) | 122 | #define EFLG_VIP (1<<20) |
@@ -2252,6 +2016,242 @@ static void string_addr_inc(struct x86_emulate_ctxt *ctxt, unsigned long base, | |||
2252 | op->ptr = (unsigned long *)register_address(c, base, c->regs[reg]); | 2016 | op->ptr = (unsigned long *)register_address(c, base, c->regs[reg]); |
2253 | } | 2017 | } |
2254 | 2018 | ||
2019 | #define D(_y) { .flags = (_y) } | ||
2020 | #define N D(0) | ||
2021 | #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) } | ||
2022 | #define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) } | ||
2023 | #define I(_f, _e) { .flags = (_f), .u.execute = (_e) } | ||
2024 | |||
2025 | static struct opcode group1[] = { | ||
2026 | X7(D(Lock)), N | ||
2027 | }; | ||
2028 | |||
2029 | static struct opcode group1A[] = { | ||
2030 | D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N, | ||
2031 | }; | ||
2032 | |||
2033 | static struct opcode group3[] = { | ||
2034 | D(DstMem | SrcImm | ModRM), D(DstMem | SrcImm | ModRM), | ||
2035 | D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock), | ||
2036 | X4(D(Undefined)), | ||
2037 | }; | ||
2038 | |||
2039 | static struct opcode group4[] = { | ||
2040 | D(ByteOp | DstMem | SrcNone | ModRM | Lock), D(ByteOp | DstMem | SrcNone | ModRM | Lock), | ||
2041 | N, N, N, N, N, N, | ||
2042 | }; | ||
2043 | |||
2044 | static struct opcode group5[] = { | ||
2045 | D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock), | ||
2046 | D(SrcMem | ModRM | Stack), N, | ||
2047 | D(SrcMem | ModRM | Stack), D(SrcMemFAddr | ModRM | ImplicitOps), | ||
2048 | D(SrcMem | ModRM | Stack), N, | ||
2049 | }; | ||
2050 | |||
2051 | static struct group_dual group7 = { { | ||
2052 | N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv), | ||
2053 | D(SrcNone | ModRM | DstMem | Mov), N, | ||
2054 | D(SrcMem16 | ModRM | Mov | Priv), D(SrcMem | ModRM | ByteOp | Priv), | ||
2055 | }, { | ||
2056 | D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv), | ||
2057 | D(SrcNone | ModRM | DstMem | Mov), N, | ||
2058 | D(SrcMem16 | ModRM | Mov | Priv), N, | ||
2059 | } }; | ||
2060 | |||
2061 | static struct opcode group8[] = { | ||
2062 | N, N, N, N, | ||
2063 | D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock), | ||
2064 | D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock), | ||
2065 | }; | ||
2066 | |||
2067 | static struct group_dual group9 = { { | ||
2068 | N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N, | ||
2069 | }, { | ||
2070 | N, N, N, N, N, N, N, N, | ||
2071 | } }; | ||
2072 | |||
2073 | static struct opcode opcode_table[256] = { | ||
2074 | /* 0x00 - 0x07 */ | ||
2075 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2076 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2077 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
2078 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
2079 | /* 0x08 - 0x0F */ | ||
2080 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2081 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2082 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
2083 | D(ImplicitOps | Stack | No64), N, | ||
2084 | /* 0x10 - 0x17 */ | ||
2085 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2086 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2087 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
2088 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
2089 | /* 0x18 - 0x1F */ | ||
2090 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2091 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2092 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
2093 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
2094 | /* 0x20 - 0x27 */ | ||
2095 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2096 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2097 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
2098 | /* 0x28 - 0x2F */ | ||
2099 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2100 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2101 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
2102 | /* 0x30 - 0x37 */ | ||
2103 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2104 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2105 | D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N, | ||
2106 | /* 0x38 - 0x3F */ | ||
2107 | D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM), | ||
2108 | D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), | ||
2109 | D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm), | ||
2110 | N, N, | ||
2111 | /* 0x40 - 0x4F */ | ||
2112 | X16(D(DstReg)), | ||
2113 | /* 0x50 - 0x57 */ | ||
2114 | X8(D(SrcReg | Stack)), | ||
2115 | /* 0x58 - 0x5F */ | ||
2116 | X8(D(DstReg | Stack)), | ||
2117 | /* 0x60 - 0x67 */ | ||
2118 | D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64), | ||
2119 | N, D(DstReg | SrcMem32 | ModRM | Mov) /* movsxd (x86/64) */ , | ||
2120 | N, N, N, N, | ||
2121 | /* 0x68 - 0x6F */ | ||
2122 | D(SrcImm | Mov | Stack), N, D(SrcImmByte | Mov | Stack), N, | ||
2123 | D(DstDI | ByteOp | Mov | String), D(DstDI | Mov | String), /* insb, insw/insd */ | ||
2124 | D(SrcSI | ByteOp | ImplicitOps | String), D(SrcSI | ImplicitOps | String), /* outsb, outsw/outsd */ | ||
2125 | /* 0x70 - 0x7F */ | ||
2126 | X16(D(SrcImmByte)), | ||
2127 | /* 0x80 - 0x87 */ | ||
2128 | G(ByteOp | DstMem | SrcImm | ModRM | Group, group1), | ||
2129 | G(DstMem | SrcImm | ModRM | Group, group1), | ||
2130 | G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1), | ||
2131 | G(DstMem | SrcImmByte | ModRM | Group, group1), | ||
2132 | D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM), | ||
2133 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2134 | /* 0x88 - 0x8F */ | ||
2135 | D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov), | ||
2136 | D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov), | ||
2137 | D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg), | ||
2138 | D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), | ||
2139 | /* 0x90 - 0x97 */ | ||
2140 | D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), | ||
2141 | /* 0x98 - 0x9F */ | ||
2142 | N, N, D(SrcImmFAddr | No64), N, | ||
2143 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N, | ||
2144 | /* 0xA0 - 0xA7 */ | ||
2145 | D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs), | ||
2146 | D(ByteOp | DstMem | SrcAcc | Mov | MemAbs), D(DstMem | SrcAcc | Mov | MemAbs), | ||
2147 | D(ByteOp | SrcSI | DstDI | Mov | String), D(SrcSI | DstDI | Mov | String), | ||
2148 | D(ByteOp | SrcSI | DstDI | String), D(SrcSI | DstDI | String), | ||
2149 | /* 0xA8 - 0xAF */ | ||
2150 | D(DstAcc | SrcImmByte | ByteOp), D(DstAcc | SrcImm), D(ByteOp | DstDI | Mov | String), D(DstDI | Mov | String), | ||
2151 | D(ByteOp | SrcSI | DstAcc | Mov | String), D(SrcSI | DstAcc | Mov | String), | ||
2152 | D(ByteOp | DstDI | String), D(DstDI | String), | ||
2153 | /* 0xB0 - 0xB7 */ | ||
2154 | X8(D(ByteOp | DstReg | SrcImm | Mov)), | ||
2155 | /* 0xB8 - 0xBF */ | ||
2156 | X8(D(DstReg | SrcImm | Mov)), | ||
2157 | /* 0xC0 - 0xC7 */ | ||
2158 | D(ByteOp | DstMem | SrcImm | ModRM), D(DstMem | SrcImmByte | ModRM), | ||
2159 | N, D(ImplicitOps | Stack), N, N, | ||
2160 | D(ByteOp | DstMem | SrcImm | ModRM | Mov), D(DstMem | SrcImm | ModRM | Mov), | ||
2161 | /* 0xC8 - 0xCF */ | ||
2162 | N, N, N, D(ImplicitOps | Stack), | ||
2163 | D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps), | ||
2164 | /* 0xD0 - 0xD7 */ | ||
2165 | D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM), | ||
2166 | D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM), | ||
2167 | N, N, N, N, | ||
2168 | /* 0xD8 - 0xDF */ | ||
2169 | N, N, N, N, N, N, N, N, | ||
2170 | /* 0xE0 - 0xE7 */ | ||
2171 | N, N, N, N, | ||
2172 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), | ||
2173 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), | ||
2174 | /* 0xE8 - 0xEF */ | ||
2175 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), | ||
2176 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), | ||
2177 | D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc), | ||
2178 | D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc), | ||
2179 | /* 0xF0 - 0xF7 */ | ||
2180 | N, N, N, N, | ||
2181 | D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3), | ||
2182 | /* 0xF8 - 0xFF */ | ||
2183 | D(ImplicitOps), N, D(ImplicitOps), D(ImplicitOps), | ||
2184 | D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5), | ||
2185 | }; | ||
2186 | |||
2187 | static struct opcode twobyte_table[256] = { | ||
2188 | /* 0x00 - 0x0F */ | ||
2189 | N, GD(0, &group7), N, N, | ||
2190 | N, D(ImplicitOps), D(ImplicitOps | Priv), N, | ||
2191 | D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N, | ||
2192 | N, D(ImplicitOps | ModRM), N, N, | ||
2193 | /* 0x10 - 0x1F */ | ||
2194 | N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, | ||
2195 | /* 0x20 - 0x2F */ | ||
2196 | D(ModRM | ImplicitOps | Priv), D(ModRM | Priv), | ||
2197 | D(ModRM | ImplicitOps | Priv), D(ModRM | Priv), | ||
2198 | N, N, N, N, | ||
2199 | N, N, N, N, N, N, N, N, | ||
2200 | /* 0x30 - 0x3F */ | ||
2201 | D(ImplicitOps | Priv), N, D(ImplicitOps | Priv), N, | ||
2202 | D(ImplicitOps), D(ImplicitOps | Priv), N, N, | ||
2203 | N, N, N, N, N, N, N, N, | ||
2204 | /* 0x40 - 0x4F */ | ||
2205 | X16(D(DstReg | SrcMem | ModRM | Mov)), | ||
2206 | /* 0x50 - 0x5F */ | ||
2207 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2208 | /* 0x60 - 0x6F */ | ||
2209 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2210 | /* 0x70 - 0x7F */ | ||
2211 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2212 | /* 0x80 - 0x8F */ | ||
2213 | X16(D(SrcImm)), | ||
2214 | /* 0x90 - 0x9F */ | ||
2215 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2216 | /* 0xA0 - 0xA7 */ | ||
2217 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), | ||
2218 | N, D(DstMem | SrcReg | ModRM | BitOp), | ||
2219 | D(DstMem | SrcReg | Src2ImmByte | ModRM), | ||
2220 | D(DstMem | SrcReg | Src2CL | ModRM), N, N, | ||
2221 | /* 0xA8 - 0xAF */ | ||
2222 | D(ImplicitOps | Stack), D(ImplicitOps | Stack), | ||
2223 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
2224 | D(DstMem | SrcReg | Src2ImmByte | ModRM), | ||
2225 | D(DstMem | SrcReg | Src2CL | ModRM), | ||
2226 | D(ModRM), N, | ||
2227 | /* 0xB0 - 0xB7 */ | ||
2228 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | ||
2229 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
2230 | N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov), | ||
2231 | D(DstReg | SrcMem16 | ModRM | Mov), | ||
2232 | /* 0xB8 - 0xBF */ | ||
2233 | N, N, | ||
2234 | G(0, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock), | ||
2235 | N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov), | ||
2236 | D(DstReg | SrcMem16 | ModRM | Mov), | ||
2237 | /* 0xC0 - 0xCF */ | ||
2238 | N, N, N, D(DstMem | SrcReg | ModRM | Mov), | ||
2239 | N, N, N, GD(0, &group9), | ||
2240 | N, N, N, N, N, N, N, N, | ||
2241 | /* 0xD0 - 0xDF */ | ||
2242 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2243 | /* 0xE0 - 0xEF */ | ||
2244 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | ||
2245 | /* 0xF0 - 0xFF */ | ||
2246 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N | ||
2247 | }; | ||
2248 | |||
2249 | #undef D | ||
2250 | #undef N | ||
2251 | #undef G | ||
2252 | #undef GD | ||
2253 | #undef I | ||
2254 | |||
2255 | int | 2255 | int |
2256 | x86_decode_insn(struct x86_emulate_ctxt *ctxt) | 2256 | x86_decode_insn(struct x86_emulate_ctxt *ctxt) |
2257 | { | 2257 | { |