|
@@ -117,242 +117,6 @@ struct group_dual {
|
|
|
struct opcode mod3[8];
|
|
|
};
|
|
|
|
|
|
-#define D(_y) { .flags = (_y) }
|
|
|
-#define N D(0)
|
|
|
-#define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
|
|
|
-#define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) }
|
|
|
-#define I(_f, _e) { .flags = (_f), .u.execute = (_e) }
|
|
|
-
|
|
|
-static struct opcode group1[] = {
|
|
|
- X7(D(Lock)), N
|
|
|
-};
|
|
|
-
|
|
|
-static struct opcode group1A[] = {
|
|
|
- D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N,
|
|
|
-};
|
|
|
-
|
|
|
-static struct opcode group3[] = {
|
|
|
- D(DstMem | SrcImm | ModRM), D(DstMem | SrcImm | ModRM),
|
|
|
- D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
|
|
|
- X4(D(Undefined)),
|
|
|
-};
|
|
|
-
|
|
|
-static struct opcode group4[] = {
|
|
|
- D(ByteOp | DstMem | SrcNone | ModRM | Lock), D(ByteOp | DstMem | SrcNone | ModRM | Lock),
|
|
|
- N, N, N, N, N, N,
|
|
|
-};
|
|
|
-
|
|
|
-static struct opcode group5[] = {
|
|
|
- D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
|
|
|
- D(SrcMem | ModRM | Stack), N,
|
|
|
- D(SrcMem | ModRM | Stack), D(SrcMemFAddr | ModRM | ImplicitOps),
|
|
|
- D(SrcMem | ModRM | Stack), N,
|
|
|
-};
|
|
|
-
|
|
|
-static struct group_dual group7 = { {
|
|
|
- N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv),
|
|
|
- D(SrcNone | ModRM | DstMem | Mov), N,
|
|
|
- D(SrcMem16 | ModRM | Mov | Priv), D(SrcMem | ModRM | ByteOp | Priv),
|
|
|
-}, {
|
|
|
- D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv),
|
|
|
- D(SrcNone | ModRM | DstMem | Mov), N,
|
|
|
- D(SrcMem16 | ModRM | Mov | Priv), N,
|
|
|
-} };
|
|
|
-
|
|
|
-static struct opcode group8[] = {
|
|
|
- N, N, N, N,
|
|
|
- D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock),
|
|
|
- D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock),
|
|
|
-};
|
|
|
-
|
|
|
-static struct group_dual group9 = { {
|
|
|
- N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N,
|
|
|
-}, {
|
|
|
- N, N, N, N, N, N, N, N,
|
|
|
-} };
|
|
|
-
|
|
|
-static struct opcode opcode_table[256] = {
|
|
|
- /* 0x00 - 0x07 */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
- D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
- /* 0x08 - 0x0F */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
- D(ImplicitOps | Stack | No64), N,
|
|
|
- /* 0x10 - 0x17 */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
- D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
- /* 0x18 - 0x1F */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
- D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
- /* 0x20 - 0x27 */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
- /* 0x28 - 0x2F */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
- /* 0x30 - 0x37 */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
- /* 0x38 - 0x3F */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
- D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
- N, N,
|
|
|
- /* 0x40 - 0x4F */
|
|
|
- X16(D(DstReg)),
|
|
|
- /* 0x50 - 0x57 */
|
|
|
- X8(D(SrcReg | Stack)),
|
|
|
- /* 0x58 - 0x5F */
|
|
|
- X8(D(DstReg | Stack)),
|
|
|
- /* 0x60 - 0x67 */
|
|
|
- D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
- N, D(DstReg | SrcMem32 | ModRM | Mov) /* movsxd (x86/64) */ ,
|
|
|
- N, N, N, N,
|
|
|
- /* 0x68 - 0x6F */
|
|
|
- D(SrcImm | Mov | Stack), N, D(SrcImmByte | Mov | Stack), N,
|
|
|
- D(DstDI | ByteOp | Mov | String), D(DstDI | Mov | String), /* insb, insw/insd */
|
|
|
- D(SrcSI | ByteOp | ImplicitOps | String), D(SrcSI | ImplicitOps | String), /* outsb, outsw/outsd */
|
|
|
- /* 0x70 - 0x7F */
|
|
|
- X16(D(SrcImmByte)),
|
|
|
- /* 0x80 - 0x87 */
|
|
|
- G(ByteOp | DstMem | SrcImm | ModRM | Group, group1),
|
|
|
- G(DstMem | SrcImm | ModRM | Group, group1),
|
|
|
- G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1),
|
|
|
- G(DstMem | SrcImmByte | ModRM | Group, group1),
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- /* 0x88 - 0x8F */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov),
|
|
|
- D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov),
|
|
|
- D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg),
|
|
|
- D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A),
|
|
|
- /* 0x90 - 0x97 */
|
|
|
- D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg),
|
|
|
- /* 0x98 - 0x9F */
|
|
|
- N, N, D(SrcImmFAddr | No64), N,
|
|
|
- D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N,
|
|
|
- /* 0xA0 - 0xA7 */
|
|
|
- D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs),
|
|
|
- D(ByteOp | DstMem | SrcAcc | Mov | MemAbs), D(DstMem | SrcAcc | Mov | MemAbs),
|
|
|
- D(ByteOp | SrcSI | DstDI | Mov | String), D(SrcSI | DstDI | Mov | String),
|
|
|
- D(ByteOp | SrcSI | DstDI | String), D(SrcSI | DstDI | String),
|
|
|
- /* 0xA8 - 0xAF */
|
|
|
- D(DstAcc | SrcImmByte | ByteOp), D(DstAcc | SrcImm), D(ByteOp | DstDI | Mov | String), D(DstDI | Mov | String),
|
|
|
- D(ByteOp | SrcSI | DstAcc | Mov | String), D(SrcSI | DstAcc | Mov | String),
|
|
|
- D(ByteOp | DstDI | String), D(DstDI | String),
|
|
|
- /* 0xB0 - 0xB7 */
|
|
|
- X8(D(ByteOp | DstReg | SrcImm | Mov)),
|
|
|
- /* 0xB8 - 0xBF */
|
|
|
- X8(D(DstReg | SrcImm | Mov)),
|
|
|
- /* 0xC0 - 0xC7 */
|
|
|
- D(ByteOp | DstMem | SrcImm | ModRM), D(DstMem | SrcImmByte | ModRM),
|
|
|
- N, D(ImplicitOps | Stack), N, N,
|
|
|
- D(ByteOp | DstMem | SrcImm | ModRM | Mov), D(DstMem | SrcImm | ModRM | Mov),
|
|
|
- /* 0xC8 - 0xCF */
|
|
|
- N, N, N, D(ImplicitOps | Stack),
|
|
|
- D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps),
|
|
|
- /* 0xD0 - 0xD7 */
|
|
|
- D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
|
|
|
- D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
|
|
|
- N, N, N, N,
|
|
|
- /* 0xD8 - 0xDF */
|
|
|
- N, N, N, N, N, N, N, N,
|
|
|
- /* 0xE0 - 0xE7 */
|
|
|
- N, N, N, N,
|
|
|
- D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
|
|
|
- D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
|
|
|
- /* 0xE8 - 0xEF */
|
|
|
- D(SrcImm | Stack), D(SrcImm | ImplicitOps),
|
|
|
- D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps),
|
|
|
- D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
|
|
|
- D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
|
|
|
- /* 0xF0 - 0xF7 */
|
|
|
- N, N, N, N,
|
|
|
- D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3),
|
|
|
- /* 0xF8 - 0xFF */
|
|
|
- D(ImplicitOps), N, D(ImplicitOps), D(ImplicitOps),
|
|
|
- D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5),
|
|
|
-};
|
|
|
-
|
|
|
-static struct opcode twobyte_table[256] = {
|
|
|
- /* 0x00 - 0x0F */
|
|
|
- N, GD(0, &group7), N, N,
|
|
|
- N, D(ImplicitOps), D(ImplicitOps | Priv), N,
|
|
|
- D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N,
|
|
|
- N, D(ImplicitOps | ModRM), N, N,
|
|
|
- /* 0x10 - 0x1F */
|
|
|
- N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
|
|
|
- /* 0x20 - 0x2F */
|
|
|
- D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
|
|
|
- D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
|
|
|
- N, N, N, N,
|
|
|
- N, N, N, N, N, N, N, N,
|
|
|
- /* 0x30 - 0x3F */
|
|
|
- D(ImplicitOps | Priv), N, D(ImplicitOps | Priv), N,
|
|
|
- D(ImplicitOps), D(ImplicitOps | Priv), N, N,
|
|
|
- N, N, N, N, N, N, N, N,
|
|
|
- /* 0x40 - 0x4F */
|
|
|
- X16(D(DstReg | SrcMem | ModRM | Mov)),
|
|
|
- /* 0x50 - 0x5F */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0x60 - 0x6F */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0x70 - 0x7F */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0x80 - 0x8F */
|
|
|
- X16(D(SrcImm)),
|
|
|
- /* 0x90 - 0x9F */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0xA0 - 0xA7 */
|
|
|
- D(ImplicitOps | Stack), D(ImplicitOps | Stack),
|
|
|
- N, D(DstMem | SrcReg | ModRM | BitOp),
|
|
|
- D(DstMem | SrcReg | Src2ImmByte | ModRM),
|
|
|
- D(DstMem | SrcReg | Src2CL | ModRM), N, N,
|
|
|
- /* 0xA8 - 0xAF */
|
|
|
- D(ImplicitOps | Stack), D(ImplicitOps | Stack),
|
|
|
- N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
- D(DstMem | SrcReg | Src2ImmByte | ModRM),
|
|
|
- D(DstMem | SrcReg | Src2CL | ModRM),
|
|
|
- D(ModRM), N,
|
|
|
- /* 0xB0 - 0xB7 */
|
|
|
- D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
- N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
- N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
|
|
|
- D(DstReg | SrcMem16 | ModRM | Mov),
|
|
|
- /* 0xB8 - 0xBF */
|
|
|
- N, N,
|
|
|
- G(0, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
- N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
|
|
|
- D(DstReg | SrcMem16 | ModRM | Mov),
|
|
|
- /* 0xC0 - 0xCF */
|
|
|
- N, N, N, D(DstMem | SrcReg | ModRM | Mov),
|
|
|
- N, N, N, GD(0, &group9),
|
|
|
- N, N, N, N, N, N, N, N,
|
|
|
- /* 0xD0 - 0xDF */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0xE0 - 0xEF */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
- /* 0xF0 - 0xFF */
|
|
|
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
|
|
|
-};
|
|
|
-
|
|
|
-#undef D
|
|
|
-#undef N
|
|
|
-#undef G
|
|
|
-#undef GD
|
|
|
-#undef I
|
|
|
-
|
|
|
/* EFLAGS bit definitions. */
|
|
|
#define EFLG_ID (1<<21)
|
|
|
#define EFLG_VIP (1<<20)
|
|
@@ -2252,6 +2016,242 @@ static void string_addr_inc(struct x86_emulate_ctxt *ctxt, unsigned long base,
|
|
|
op->ptr = (unsigned long *)register_address(c, base, c->regs[reg]);
|
|
|
}
|
|
|
|
|
|
+#define D(_y) { .flags = (_y) }
|
|
|
+#define N D(0)
|
|
|
+#define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
|
|
|
+#define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) }
|
|
|
+#define I(_f, _e) { .flags = (_f), .u.execute = (_e) }
|
|
|
+
|
|
|
+static struct opcode group1[] = {
|
|
|
+ X7(D(Lock)), N
|
|
|
+};
|
|
|
+
|
|
|
+static struct opcode group1A[] = {
|
|
|
+ D(DstMem | SrcNone | ModRM | Mov | Stack), N, N, N, N, N, N, N,
|
|
|
+};
|
|
|
+
|
|
|
+static struct opcode group3[] = {
|
|
|
+ D(DstMem | SrcImm | ModRM), D(DstMem | SrcImm | ModRM),
|
|
|
+ D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
|
|
|
+ X4(D(Undefined)),
|
|
|
+};
|
|
|
+
|
|
|
+static struct opcode group4[] = {
|
|
|
+ D(ByteOp | DstMem | SrcNone | ModRM | Lock), D(ByteOp | DstMem | SrcNone | ModRM | Lock),
|
|
|
+ N, N, N, N, N, N,
|
|
|
+};
|
|
|
+
|
|
|
+static struct opcode group5[] = {
|
|
|
+ D(DstMem | SrcNone | ModRM | Lock), D(DstMem | SrcNone | ModRM | Lock),
|
|
|
+ D(SrcMem | ModRM | Stack), N,
|
|
|
+ D(SrcMem | ModRM | Stack), D(SrcMemFAddr | ModRM | ImplicitOps),
|
|
|
+ D(SrcMem | ModRM | Stack), N,
|
|
|
+};
|
|
|
+
|
|
|
+static struct group_dual group7 = { {
|
|
|
+ N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv),
|
|
|
+ D(SrcNone | ModRM | DstMem | Mov), N,
|
|
|
+ D(SrcMem16 | ModRM | Mov | Priv), D(SrcMem | ModRM | ByteOp | Priv),
|
|
|
+}, {
|
|
|
+ D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv),
|
|
|
+ D(SrcNone | ModRM | DstMem | Mov), N,
|
|
|
+ D(SrcMem16 | ModRM | Mov | Priv), N,
|
|
|
+} };
|
|
|
+
|
|
|
+static struct opcode group8[] = {
|
|
|
+ N, N, N, N,
|
|
|
+ D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock),
|
|
|
+ D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock),
|
|
|
+};
|
|
|
+
|
|
|
+static struct group_dual group9 = { {
|
|
|
+ N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N,
|
|
|
+}, {
|
|
|
+ N, N, N, N, N, N, N, N,
|
|
|
+} };
|
|
|
+
|
|
|
+static struct opcode opcode_table[256] = {
|
|
|
+ /* 0x00 - 0x07 */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
+ D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
+ /* 0x08 - 0x0F */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
+ D(ImplicitOps | Stack | No64), N,
|
|
|
+ /* 0x10 - 0x17 */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
+ D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
+ /* 0x18 - 0x1F */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
+ D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
+ /* 0x20 - 0x27 */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
+ /* 0x28 - 0x2F */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
+ /* 0x30 - 0x37 */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImmByte), D(DstAcc | SrcImm), N, N,
|
|
|
+ /* 0x38 - 0x3F */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
|
|
|
+ D(ByteOp | DstAcc | SrcImm), D(DstAcc | SrcImm),
|
|
|
+ N, N,
|
|
|
+ /* 0x40 - 0x4F */
|
|
|
+ X16(D(DstReg)),
|
|
|
+ /* 0x50 - 0x57 */
|
|
|
+ X8(D(SrcReg | Stack)),
|
|
|
+ /* 0x58 - 0x5F */
|
|
|
+ X8(D(DstReg | Stack)),
|
|
|
+ /* 0x60 - 0x67 */
|
|
|
+ D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
|
|
|
+ N, D(DstReg | SrcMem32 | ModRM | Mov) /* movsxd (x86/64) */ ,
|
|
|
+ N, N, N, N,
|
|
|
+ /* 0x68 - 0x6F */
|
|
|
+ D(SrcImm | Mov | Stack), N, D(SrcImmByte | Mov | Stack), N,
|
|
|
+ D(DstDI | ByteOp | Mov | String), D(DstDI | Mov | String), /* insb, insw/insd */
|
|
|
+ D(SrcSI | ByteOp | ImplicitOps | String), D(SrcSI | ImplicitOps | String), /* outsb, outsw/outsd */
|
|
|
+ /* 0x70 - 0x7F */
|
|
|
+ X16(D(SrcImmByte)),
|
|
|
+ /* 0x80 - 0x87 */
|
|
|
+ G(ByteOp | DstMem | SrcImm | ModRM | Group, group1),
|
|
|
+ G(DstMem | SrcImm | ModRM | Group, group1),
|
|
|
+ G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1),
|
|
|
+ G(DstMem | SrcImmByte | ModRM | Group, group1),
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM), D(DstMem | SrcReg | ModRM),
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ /* 0x88 - 0x8F */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov),
|
|
|
+ D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov),
|
|
|
+ D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg),
|
|
|
+ D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A),
|
|
|
+ /* 0x90 - 0x97 */
|
|
|
+ D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg), D(DstReg),
|
|
|
+ /* 0x98 - 0x9F */
|
|
|
+ N, N, D(SrcImmFAddr | No64), N,
|
|
|
+ D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N,
|
|
|
+ /* 0xA0 - 0xA7 */
|
|
|
+ D(ByteOp | DstAcc | SrcMem | Mov | MemAbs), D(DstAcc | SrcMem | Mov | MemAbs),
|
|
|
+ D(ByteOp | DstMem | SrcAcc | Mov | MemAbs), D(DstMem | SrcAcc | Mov | MemAbs),
|
|
|
+ D(ByteOp | SrcSI | DstDI | Mov | String), D(SrcSI | DstDI | Mov | String),
|
|
|
+ D(ByteOp | SrcSI | DstDI | String), D(SrcSI | DstDI | String),
|
|
|
+ /* 0xA8 - 0xAF */
|
|
|
+ D(DstAcc | SrcImmByte | ByteOp), D(DstAcc | SrcImm), D(ByteOp | DstDI | Mov | String), D(DstDI | Mov | String),
|
|
|
+ D(ByteOp | SrcSI | DstAcc | Mov | String), D(SrcSI | DstAcc | Mov | String),
|
|
|
+ D(ByteOp | DstDI | String), D(DstDI | String),
|
|
|
+ /* 0xB0 - 0xB7 */
|
|
|
+ X8(D(ByteOp | DstReg | SrcImm | Mov)),
|
|
|
+ /* 0xB8 - 0xBF */
|
|
|
+ X8(D(DstReg | SrcImm | Mov)),
|
|
|
+ /* 0xC0 - 0xC7 */
|
|
|
+ D(ByteOp | DstMem | SrcImm | ModRM), D(DstMem | SrcImmByte | ModRM),
|
|
|
+ N, D(ImplicitOps | Stack), N, N,
|
|
|
+ D(ByteOp | DstMem | SrcImm | ModRM | Mov), D(DstMem | SrcImm | ModRM | Mov),
|
|
|
+ /* 0xC8 - 0xCF */
|
|
|
+ N, N, N, D(ImplicitOps | Stack),
|
|
|
+ D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps),
|
|
|
+ /* 0xD0 - 0xD7 */
|
|
|
+ D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
|
|
|
+ D(ByteOp | DstMem | SrcImplicit | ModRM), D(DstMem | SrcImplicit | ModRM),
|
|
|
+ N, N, N, N,
|
|
|
+ /* 0xD8 - 0xDF */
|
|
|
+ N, N, N, N, N, N, N, N,
|
|
|
+ /* 0xE0 - 0xE7 */
|
|
|
+ N, N, N, N,
|
|
|
+ D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
|
|
|
+ D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
|
|
|
+ /* 0xE8 - 0xEF */
|
|
|
+ D(SrcImm | Stack), D(SrcImm | ImplicitOps),
|
|
|
+ D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps),
|
|
|
+ D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
|
|
|
+ D(SrcNone | ByteOp | DstAcc), D(SrcNone | DstAcc),
|
|
|
+ /* 0xF0 - 0xF7 */
|
|
|
+ N, N, N, N,
|
|
|
+ D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3),
|
|
|
+ /* 0xF8 - 0xFF */
|
|
|
+ D(ImplicitOps), N, D(ImplicitOps), D(ImplicitOps),
|
|
|
+ D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5),
|
|
|
+};
|
|
|
+
|
|
|
+static struct opcode twobyte_table[256] = {
|
|
|
+ /* 0x00 - 0x0F */
|
|
|
+ N, GD(0, &group7), N, N,
|
|
|
+ N, D(ImplicitOps), D(ImplicitOps | Priv), N,
|
|
|
+ D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N,
|
|
|
+ N, D(ImplicitOps | ModRM), N, N,
|
|
|
+ /* 0x10 - 0x1F */
|
|
|
+ N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
|
|
|
+ /* 0x20 - 0x2F */
|
|
|
+ D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
|
|
|
+ D(ModRM | ImplicitOps | Priv), D(ModRM | Priv),
|
|
|
+ N, N, N, N,
|
|
|
+ N, N, N, N, N, N, N, N,
|
|
|
+ /* 0x30 - 0x3F */
|
|
|
+ D(ImplicitOps | Priv), N, D(ImplicitOps | Priv), N,
|
|
|
+ D(ImplicitOps), D(ImplicitOps | Priv), N, N,
|
|
|
+ N, N, N, N, N, N, N, N,
|
|
|
+ /* 0x40 - 0x4F */
|
|
|
+ X16(D(DstReg | SrcMem | ModRM | Mov)),
|
|
|
+ /* 0x50 - 0x5F */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0x60 - 0x6F */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0x70 - 0x7F */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0x80 - 0x8F */
|
|
|
+ X16(D(SrcImm)),
|
|
|
+ /* 0x90 - 0x9F */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0xA0 - 0xA7 */
|
|
|
+ D(ImplicitOps | Stack), D(ImplicitOps | Stack),
|
|
|
+ N, D(DstMem | SrcReg | ModRM | BitOp),
|
|
|
+ D(DstMem | SrcReg | Src2ImmByte | ModRM),
|
|
|
+ D(DstMem | SrcReg | Src2CL | ModRM), N, N,
|
|
|
+ /* 0xA8 - 0xAF */
|
|
|
+ D(ImplicitOps | Stack), D(ImplicitOps | Stack),
|
|
|
+ N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
+ D(DstMem | SrcReg | Src2ImmByte | ModRM),
|
|
|
+ D(DstMem | SrcReg | Src2CL | ModRM),
|
|
|
+ D(ModRM), N,
|
|
|
+ /* 0xB0 - 0xB7 */
|
|
|
+ D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock),
|
|
|
+ N, D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
+ N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
|
|
|
+ D(DstReg | SrcMem16 | ModRM | Mov),
|
|
|
+ /* 0xB8 - 0xBF */
|
|
|
+ N, N,
|
|
|
+ G(0, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock),
|
|
|
+ N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov),
|
|
|
+ D(DstReg | SrcMem16 | ModRM | Mov),
|
|
|
+ /* 0xC0 - 0xCF */
|
|
|
+ N, N, N, D(DstMem | SrcReg | ModRM | Mov),
|
|
|
+ N, N, N, GD(0, &group9),
|
|
|
+ N, N, N, N, N, N, N, N,
|
|
|
+ /* 0xD0 - 0xDF */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0xE0 - 0xEF */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
|
|
|
+ /* 0xF0 - 0xFF */
|
|
|
+ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
|
|
|
+};
|
|
|
+
|
|
|
+#undef D
|
|
|
+#undef N
|
|
|
+#undef G
|
|
|
+#undef GD
|
|
|
+#undef I
|
|
|
+
|
|
|
int
|
|
|
x86_decode_insn(struct x86_emulate_ctxt *ctxt)
|
|
|
{
|