aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2010-07-29 08:11:53 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:50:25 -0400
commit73fba5f4fe3e08bd7acb18a65b53643445c8f028 (patch)
tree88a1332c4888379c42d5d983deff2614962e3cbf
parentdde7e6d12a9ef9f727d05ce824f4fe75ca2a5b3a (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.c472
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
126static struct opcode group1[] = {
127 X7(D(Lock)), N
128};
129
130static struct opcode group1A[] = {
131 D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N,
132};
133
134static 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
140static 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
145static 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
152static 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
162static 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
168static 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
174static 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
288static 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
2025static struct opcode group1[] = {
2026 X7(D(Lock)), N
2027};
2028
2029static struct opcode group1A[] = {
2030 D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N,
2031};
2032
2033static 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
2039static 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
2044static 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
2051static 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
2061static 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
2067static 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
2073static 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
2187static 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
2255int 2255int
2256x86_decode_insn(struct x86_emulate_ctxt *ctxt) 2256x86_decode_insn(struct x86_emulate_ctxt *ctxt)
2257{ 2257{