diff options
author | Avi Kivity <avi@redhat.com> | 2010-07-29 08:11:36 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:50:08 -0400 |
commit | fd853310a1ebaef257956208165873494bb805dc (patch) | |
tree | 5bcd3f909d634bbcbd0ecdaf8b0bed630150c2b6 /arch/x86/kvm | |
parent | d65b1dee408243daa45110ee494d204508d31657 (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.c | 294 |
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 | |||
115 | static struct opcode opcode_table[256] = { | 118 | static 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 | ||
229 | static struct opcode twobyte_table[256] = { | 232 | static 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 | ||
291 | static struct opcode group_table[] = { | 294 | static 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 | ||
320 | static struct opcode group2_table[] = { | 323 | static 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) |