aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2010-07-29 08:11:36 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:50:08 -0400
commitfd853310a1ebaef257956208165873494bb805dc (patch)
tree5bcd3f909d634bbcbd0ecdaf8b0bed630150c2b6 /arch/x86/kvm
parentd65b1dee408243daa45110ee494d204508d31657 (diff)
KVM: x86 emulator: Add wrappers for easily defining opcodes
Once 'struct opcode' grows, its initializer will become more complicated. Wrap the simple initializers in a D() macro, and replace the empty initializers with an even simpler N macro. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/emulate.c294
1 files changed, 150 insertions, 144 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index da7df34036ca..7059b1611970 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -112,220 +112,226 @@ struct opcode {
112 u32 flags; 112 u32 flags;
113}; 113};
114 114
115#define D(_y) { .flags = (_y) }
116#define N D(0)
117
115static struct opcode opcode_table[256] = { 118static struct opcode opcode_table[256] = {
116 /* 0x00 - 0x07 */ 119 /* 0x00 - 0x07 */
117 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 120 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
118 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 121 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
119 ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 122 D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
120 ImplicitOps | Stack | No64, ImplicitOps | Stack | No64, 123 D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
121 /* 0x08 - 0x0F */ 124 /* 0x08 - 0x0F */
122 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 125 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
123 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 126 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
124 ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 127 D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
125 ImplicitOps | Stack | No64, 0, 128 D(ImplicitOps | Stack | No64), N,
126 /* 0x10 - 0x17 */ 129 /* 0x10 - 0x17 */
127 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 130 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
128 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 131 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
129 ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 132 D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
130 ImplicitOps | Stack | No64, ImplicitOps | Stack | No64, 133 D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
131 /* 0x18 - 0x1F */ 134 /* 0x18 - 0x1F */
132 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 135 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
133 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 136 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
134 ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 137 D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
135 ImplicitOps | Stack | No64, ImplicitOps | Stack | No64, 138 D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
136 /* 0x20 - 0x27 */ 139 /* 0x20 - 0x27 */
137 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 140 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
138 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 141 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
139 ByteOp | DstAcc | SrcImmByte, DstAcc | SrcImm, 0, 0, 142 D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
140 /* 0x28 - 0x2F */ 143 /* 0x28 - 0x2F */
141 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 144 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
142 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 145 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
143 ByteOp | DstAcc | SrcImmByte, DstAcc | SrcImm, 0, 0, 146 D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
144 /* 0x30 - 0x37 */ 147 /* 0x30 - 0x37 */
145 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 148 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
146 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 149 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
147 ByteOp | DstAcc | SrcImmByte, DstAcc | SrcImm, 0, 0, 150 D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
148 /* 0x38 - 0x3F */ 151 /* 0x38 - 0x3F */
149 ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM, 152 D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
150 ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM, 153 D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
151 ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 154 D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
152 0, 0, 155 N, N,
153 /* 0x40 - 0x4F */ 156 /* 0x40 - 0x4F */
154 X16(DstReg), 157 X16(D(DstReg)),
155 /* 0x50 - 0x57 */ 158 /* 0x50 - 0x57 */
156 X8(SrcReg | Stack), 159 X8(D(SrcReg | Stack)),
157 /* 0x58 - 0x5F */ 160 /* 0x58 - 0x5F */
158 X8(DstReg | Stack), 161 X8(D(DstReg | Stack)),
159 /* 0x60 - 0x67 */ 162 /* 0x60 - 0x67 */
160 ImplicitOps | Stack | No64, ImplicitOps | Stack | No64, 163 D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
161 0, DstReg | SrcMem32 | ModRM | Mov /* movsxd (x86/64) */ , 164 N, D(DstReg | SrcMem32 | ModRM | Mov) /* movsxd (x86/64) */ ,
162 0, 0, 0, 0, 165 N, N, N, N,
163 /* 0x68 - 0x6F */ 166 /* 0x68 - 0x6F */
164 SrcImm | Mov | Stack, 0, SrcImmByte | Mov | Stack, 0, 167 D(SrcImm | Mov | Stack), N, D(SrcImmByte | Mov | Stack), N,
165 DstDI | ByteOp | Mov | String, DstDI | Mov | String, /* insb, insw/insd */ 168 D(DstDI | ByteOp | Mov | String), D(DstDI | Mov | String), /* insb, insw/insd */
166 SrcSI | ByteOp | ImplicitOps | String, SrcSI | ImplicitOps | String, /* outsb, outsw/outsd */ 169 D(SrcSI | ByteOp | ImplicitOps | String), D(SrcSI | ImplicitOps | String), /* outsb, outsw/outsd */
167 /* 0x70 - 0x7F */ 170 /* 0x70 - 0x7F */
168 X16(SrcImmByte), 171 X16(D(SrcImmByte)),
169 /* 0x80 - 0x87 */ 172 /* 0x80 - 0x87 */
170 ByteOp | DstMem | SrcImm | ModRM | Group | Group1, 173 D(ByteOp | DstMem | SrcImm | ModRM | Group | Group1),
171 DstMem | SrcImm | ModRM | Group | Group1, 174 D(DstMem | SrcImm | ModRM | Group | Group1),
172 ByteOp | DstMem | SrcImm | ModRM | No64 | Group | Group1, 175 D(ByteOp | DstMem | SrcImm | ModRM | No64 | Group | Group1),
173 DstMem | SrcImmByte | ModRM | Group | Group1, 176 D(DstMem | SrcImmByte | ModRM | Group | Group1),
174 ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM, 177 D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
175 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 178 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
176 /* 0x88 - 0x8F */ 179 /* 0x88 - 0x8F */
177 ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov, 180 D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov),
178 ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, 181 D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov),
179 DstMem | SrcNone | ModRM | Mov, ModRM | DstReg, 182 D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg),
180 ImplicitOps | SrcMem16 | ModRM, Group | Group1A, 183 D(ImplicitOps | SrcMem16 | ModRM), D(Group | Group1A),
181 /* 0x90 - 0x97 */ 184 /* 0x90 - 0x97 */
182 DstReg, DstReg, DstReg, DstReg, DstReg, DstReg, DstReg, DstReg, 185 D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg),
183 /* 0x98 - 0x9F */ 186 /* 0x98 - 0x9F */
184 0, 0, SrcImmFAddr | No64, 0, 187 N, N, D(SrcImmFAddr | No64), N,
185 ImplicitOps | Stack, ImplicitOps | Stack, 0, 0, 188 D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N,
186 /* 0xA0 - 0xA7 */ 189 /* 0xA0 - 0xA7 */
187 ByteOp | DstAcc | SrcMem | Mov | MemAbs, DstAcc | SrcMem | Mov | MemAbs, 190 D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs),
188 ByteOp | DstMem | SrcAcc | Mov | MemAbs, DstMem | SrcAcc | Mov | MemAbs, 191 D(ByteOp | DstMem | SrcAcc | Mov | MemAbs), D(DstMem | SrcAcc | Mov | MemAbs),
189 ByteOp | SrcSI | DstDI | Mov | String, SrcSI | DstDI | Mov | String, 192 D(ByteOp | SrcSI | DstDI | Mov | String), D(SrcSI | DstDI | Mov | String),
190 ByteOp | SrcSI | DstDI | String, SrcSI | DstDI | String, 193 D(ByteOp | SrcSI | DstDI | String), D(SrcSI | DstDI | String),
191 /* 0xA8 - 0xAF */ 194 /* 0xA8 - 0xAF */
192 DstAcc | SrcImmByte | ByteOp, DstAcc | SrcImm, ByteOp | DstDI | Mov | String, DstDI | Mov | String, 195 D(DstAcc | SrcImmByte | ByteOp), D(DstAcc | SrcImm), D(ByteOp | DstDI | Mov | String), D(DstDI | Mov | String),
193 ByteOp | SrcSI | DstAcc | Mov | String, SrcSI | DstAcc | Mov | String, 196 D(ByteOp | SrcSI | DstAcc | Mov | String), D(SrcSI | DstAcc | Mov | String),
194 ByteOp | DstDI | String, DstDI | String, 197 D(ByteOp | DstDI | String), D(DstDI | String),
195 /* 0xB0 - 0xB7 */ 198 /* 0xB0 - 0xB7 */
196 X8(ByteOp | DstReg | SrcImm | Mov), 199 X8(D(ByteOp | DstReg | SrcImm | Mov)),
197 /* 0xB8 - 0xBF */ 200 /* 0xB8 - 0xBF */
198 X8(DstReg | SrcImm | Mov), 201 X8(D(DstReg | SrcImm | Mov)),
199 /* 0xC0 - 0xC7 */ 202 /* 0xC0 - 0xC7 */
200 ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImmByte | ModRM, 203 D(ByteOp | DstMem | SrcImm | ModRM), D(DstMem | SrcImmByte | ModRM),
201 0, ImplicitOps | Stack, 0, 0, 204 N, D(ImplicitOps | Stack), N, N,
202 ByteOp | DstMem | SrcImm | ModRM | Mov, DstMem | SrcImm | ModRM | Mov, 205 D(ByteOp | DstMem | SrcImm | ModRM | Mov), D(DstMem | SrcImm | ModRM | Mov),
203 /* 0xC8 - 0xCF */ 206 /* 0xC8 - 0xCF */
204 0, 0, 0, ImplicitOps | Stack, 207 N, N, N, D(ImplicitOps | Stack),
205 ImplicitOps, SrcImmByte, ImplicitOps | No64, ImplicitOps, 208 D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps),
206 /* 0xD0 - 0xD7 */ 209 /* 0xD0 - 0xD7 */
207 ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, 210 D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
208 ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, 211 D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
209 0, 0, 0, 0, 212 N, N, N, N,
210 /* 0xD8 - 0xDF */ 213 /* 0xD8 - 0xDF */
211 0, 0, 0, 0, 0, 0, 0, 0, 214 N, N, N, N, N, N, N, N,
212 /* 0xE0 - 0xE7 */ 215 /* 0xE0 - 0xE7 */
213 0, 0, 0, 0, 216 N, N, N, N,
214 ByteOp | SrcImmUByte | DstAcc, SrcImmUByte | DstAcc, 217 D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
215 ByteOp | SrcImmUByte | DstAcc, SrcImmUByte | DstAcc, 218 D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
216 /* 0xE8 - 0xEF */ 219 /* 0xE8 - 0xEF */
217 SrcImm | Stack, SrcImm | ImplicitOps, 220 D(SrcImm | Stack), D(SrcImm | ImplicitOps),
218 SrcImmFAddr | No64, SrcImmByte | ImplicitOps, 221 D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps),
219 SrcNone | ByteOp | DstAcc, SrcNone | DstAcc, 222 D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
220 SrcNone | ByteOp | DstAcc, SrcNone | DstAcc, 223 D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
221 /* 0xF0 - 0xF7 */ 224 /* 0xF0 - 0xF7 */
222 0, 0, 0, 0, 225 N, N, N, N,
223 ImplicitOps | Priv, ImplicitOps, ByteOp | Group | Group3, Group | Group3, 226 D(ImplicitOps | Priv), D(ImplicitOps), D(ByteOp | Group | Group3), D(Group | Group3),
224 /* 0xF8 - 0xFF */ 227 /* 0xF8 - 0xFF */
225 ImplicitOps, 0, ImplicitOps, ImplicitOps, 228 D(ImplicitOps), N, D(ImplicitOps), D(ImplicitOps),
226 ImplicitOps, ImplicitOps, Group | Group4, Group | Group5, 229 D(ImplicitOps), D(ImplicitOps), D(Group | Group4), D(Group | Group5),
227}; 230};
228 231
229static struct opcode twobyte_table[256] = { 232static struct opcode twobyte_table[256] = {
230 /* 0x00 - 0x0F */ 233 /* 0x00 - 0x0F */
231 0, Group | GroupDual | Group7, 0, 0, 234 N, D(Group | GroupDual | Group7), N, N,
232 0, ImplicitOps, ImplicitOps | Priv, 0, 235 N, D(ImplicitOps), D(ImplicitOps | Priv), N,
233 ImplicitOps | Priv, ImplicitOps | Priv, 0, 0, 236 D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N,
234 0, ImplicitOps | ModRM, 0, 0, 237 N, D(ImplicitOps | ModRM), N, N,
235 /* 0x10 - 0x1F */ 238 /* 0x10 - 0x1F */
236 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps | ModRM, 0, 0, 0, 0, 0, 0, 0, 239 N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
237 /* 0x20 - 0x2F */ 240 /* 0x20 - 0x2F */
238 ModRM | ImplicitOps | Priv, ModRM | Priv, 241 D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
239 ModRM | ImplicitOps | Priv, ModRM | Priv, 242 D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
240 0, 0, 0, 0, 243 N, N, N, N,
241 0, 0, 0, 0, 0, 0, 0, 0, 244 N, N, N, N, N, N, N, N,
242 /* 0x30 - 0x3F */ 245 /* 0x30 - 0x3F */
243 ImplicitOps | Priv, 0, ImplicitOps | Priv, 0, 246 D(ImplicitOps | Priv), N, D(ImplicitOps | Priv), N,
244 ImplicitOps, ImplicitOps | Priv, 0, 0, 247 D(ImplicitOps), D(ImplicitOps | Priv), N, N,
245 0, 0, 0, 0, 0, 0, 0, 0, 248 N, N, N, N, N, N, N, N,
246 /* 0x40 - 0x4F */ 249 /* 0x40 - 0x4F */
247 X16(DstReg | SrcMem | ModRM | Mov), 250 X16(D(DstReg | SrcMem | ModRM | Mov)),
248 /* 0x50 - 0x5F */ 251 /* 0x50 - 0x5F */
249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
250 /* 0x60 - 0x6F */ 253 /* 0x60 - 0x6F */
251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
252 /* 0x70 - 0x7F */ 255 /* 0x70 - 0x7F */
253 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
254 /* 0x80 - 0x8F */ 257 /* 0x80 - 0x8F */
255 X16(SrcImm), 258 X16(D(SrcImm)),
256 /* 0x90 - 0x9F */ 259 /* 0x90 - 0x9F */
257 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
258 /* 0xA0 - 0xA7 */ 261 /* 0xA0 - 0xA7 */
259 ImplicitOps | Stack, ImplicitOps | Stack, 262 D(ImplicitOps | Stack), D(ImplicitOps | Stack),
260 0, DstMem | SrcReg | ModRM | BitOp, 263 N, D(DstMem | SrcReg | ModRM | BitOp),
261 DstMem | SrcReg | Src2ImmByte | ModRM, 264 D(DstMem | SrcReg | Src2ImmByte | ModRM),
262 DstMem | SrcReg | Src2CL | ModRM, 0, 0, 265 D(DstMem | SrcReg | Src2CL | ModRM), N, N,
263 /* 0xA8 - 0xAF */ 266 /* 0xA8 - 0xAF */
264 ImplicitOps | Stack, ImplicitOps | Stack, 267 D(ImplicitOps | Stack), D(ImplicitOps | Stack),
265 0, DstMem | SrcReg | ModRM | BitOp | Lock, 268 N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
266 DstMem | SrcReg | Src2ImmByte | ModRM, 269 D(DstMem | SrcReg | Src2ImmByte | ModRM),
267 DstMem | SrcReg | Src2CL | ModRM, 270 D(DstMem | SrcReg | Src2CL | ModRM),
268 ModRM, 0, 271 D(ModRM), N,
269 /* 0xB0 - 0xB7 */ 272 /* 0xB0 - 0xB7 */
270 ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock, 273 D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
271 0, DstMem | SrcReg | ModRM | BitOp | Lock, 274 N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
272 0, 0, ByteOp | DstReg | SrcMem | ModRM | Mov, 275 N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
273 DstReg | SrcMem16 | ModRM | Mov, 276 D(DstReg | SrcMem16 | ModRM | Mov),
274 /* 0xB8 - 0xBF */ 277 /* 0xB8 - 0xBF */
275 0, 0, 278 N, N,
276 Group | Group8, DstMem | SrcReg | ModRM | BitOp | Lock, 279 D(Group | Group8), D(DstMem | SrcReg | ModRM | BitOp | Lock),
277 0, 0, ByteOp | DstReg | SrcMem | ModRM | Mov, 280 N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
278 DstReg | SrcMem16 | ModRM | Mov, 281 D(DstReg | SrcMem16 | ModRM | Mov),
279 /* 0xC0 - 0xCF */ 282 /* 0xC0 - 0xCF */
280 0, 0, 0, DstMem | SrcReg | ModRM | Mov, 283 N, N, N, D(DstMem | SrcReg | ModRM | Mov),
281 0, 0, 0, Group | GroupDual | Group9, 284 N, N, N, D(Group | GroupDual | Group9),
282 0, 0, 0, 0, 0, 0, 0, 0, 285 N, N, N, N, N, N, N, N,
283 /* 0xD0 - 0xDF */ 286 /* 0xD0 - 0xDF */
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
285 /* 0xE0 - 0xEF */ 288 /* 0xE0 - 0xEF */
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
287 /* 0xF0 - 0xFF */ 290 /* 0xF0 - 0xFF */
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 291 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
289}; 292};
290 293
291static struct opcode group_table[] = { 294static struct opcode group_table[] = {
292 [Group1*8] = 295 [Group1*8] =
293 X7(Lock), 0, 296 X7(D(Lock)), N,
294 [Group1A*8] = 297 [Group1A*8] =
295 DstMem | SrcNone | ModRM | Mov | Stack, 0, 0, 0, 0, 0, 0, 0, 298 D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N,
296 [Group3*8] = 299 [Group3*8] =
297 DstMem | SrcImm | ModRM, DstMem | SrcImm | ModRM, 300 D(DstMem | SrcImm | ModRM), D(DstMem | SrcImm | ModRM),
298 DstMem | SrcNone | ModRM | Lock, DstMem | SrcNone | ModRM | Lock, 301 D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
299 X4(Undefined), 302 X4(D(Undefined)),
300 [Group4*8] = 303 [Group4*8] =
301 ByteOp | DstMem | SrcNone | ModRM | Lock, ByteOp | DstMem | SrcNone | ModRM | Lock, 304 D(ByteOp | DstMem | SrcNone | ModRM | Lock), D(ByteOp | DstMem | SrcNone | ModRM | Lock),
302 0, 0, 0, 0, 0, 0, 305 N, N, N, N, N, N,
303 [Group5*8] = 306 [Group5*8] =
304 DstMem | SrcNone | ModRM | Lock, DstMem | SrcNone | ModRM | Lock, 307 D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
305 SrcMem | ModRM | Stack, 0, 308 D(SrcMem | ModRM | Stack), N,
306 SrcMem | ModRM | Stack, SrcMemFAddr | ModRM | ImplicitOps, 309 D(SrcMem | ModRM | Stack), D(SrcMemFAddr | ModRM | ImplicitOps),
307 SrcMem | ModRM | Stack, 0, 310 D(SrcMem | ModRM | Stack), N,
308 [Group7*8] = 311 [Group7*8] =
309 0, 0, ModRM | SrcMem | Priv, ModRM | SrcMem | Priv, 312 N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv),
310 SrcNone | ModRM | DstMem | Mov, 0, 313 D(SrcNone | ModRM | DstMem | Mov), N,
311 SrcMem16 | ModRM | Mov | Priv, SrcMem | ModRM | ByteOp | Priv, 314 D(SrcMem16 | ModRM | Mov | Priv), D(SrcMem | ModRM | ByteOp | Priv),
312 [Group8*8] = 315 [Group8*8] =
313 0, 0, 0, 0, 316 N, N, N, N,
314 DstMem | SrcImmByte | ModRM, DstMem | SrcImmByte | ModRM | Lock, 317 D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock),
315 DstMem | SrcImmByte | ModRM | Lock, DstMem | SrcImmByte | ModRM | Lock, 318 D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock),
316 [Group9*8] = 319 [Group9*8] =
317 0, DstMem64 | ModRM | Lock, 0, 0, 0, 0, 0, 0, 320 N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N,
318}; 321};
319 322
320static struct opcode group2_table[] = { 323static struct opcode group2_table[] = {
321 [Group7*8] = 324 [Group7*8] =
322 SrcNone | ModRM | Priv, 0, 0, SrcNone | ModRM | Priv, 325 D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv),
323 SrcNone | ModRM | DstMem | Mov, 0, 326 D(SrcNone | ModRM | DstMem | Mov), N,
324 SrcMem16 | ModRM | Mov | Priv, 0, 327 D(SrcMem16 | ModRM | Mov | Priv), N,
325 [Group9*8] = 328 [Group9*8] =
326 0, 0, 0, 0, 0, 0, 0, 0, 329 N, N, N, N, N, N, N, N,
327}; 330};
328 331
332#undef D
333#undef N
334
329/* EFLAGS bit definitions. */ 335/* EFLAGS bit definitions. */
330#define EFLG_ID (1<<21) 336#define EFLG_ID (1<<21)
331#define EFLG_VIP (1<<20) 337#define EFLG_VIP (1<<20)