|
@@ -173,6 +173,7 @@
|
|
|
#define NearBranch ((u64)1 << 52) /* Near branches */
|
|
|
#define No16 ((u64)1 << 53) /* No 16 bit operand */
|
|
|
#define IncSP ((u64)1 << 54) /* SP is incremented before ModRM calc */
|
|
|
+#define TwoMemOp ((u64)1 << 55) /* Instruction has two memory operand */
|
|
|
|
|
|
#define DstXacc (DstAccLo | SrcAccHi | SrcWrite)
|
|
|
|
|
@@ -4256,7 +4257,7 @@ static const struct opcode group1[] = {
|
|
|
};
|
|
|
|
|
|
static const struct opcode group1A[] = {
|
|
|
- I(DstMem | SrcNone | Mov | Stack | IncSP, em_pop), N, N, N, N, N, N, N,
|
|
|
+ I(DstMem | SrcNone | Mov | Stack | IncSP | TwoMemOp, em_pop), N, N, N, N, N, N, N,
|
|
|
};
|
|
|
|
|
|
static const struct opcode group2[] = {
|
|
@@ -4294,7 +4295,7 @@ static const struct opcode group5[] = {
|
|
|
I(SrcMemFAddr | ImplicitOps, em_call_far),
|
|
|
I(SrcMem | NearBranch, em_jmp_abs),
|
|
|
I(SrcMemFAddr | ImplicitOps, em_jmp_far),
|
|
|
- I(SrcMem | Stack, em_push), D(Undefined),
|
|
|
+ I(SrcMem | Stack | TwoMemOp, em_push), D(Undefined),
|
|
|
};
|
|
|
|
|
|
static const struct opcode group6[] = {
|
|
@@ -4514,8 +4515,8 @@ static const struct opcode opcode_table[256] = {
|
|
|
/* 0xA0 - 0xA7 */
|
|
|
I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov),
|
|
|
I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov),
|
|
|
- I2bv(SrcSI | DstDI | Mov | String, em_mov),
|
|
|
- F2bv(SrcSI | DstDI | String | NoWrite, em_cmp_r),
|
|
|
+ I2bv(SrcSI | DstDI | Mov | String | TwoMemOp, em_mov),
|
|
|
+ F2bv(SrcSI | DstDI | String | NoWrite | TwoMemOp, em_cmp_r),
|
|
|
/* 0xA8 - 0xAF */
|
|
|
F2bv(DstAcc | SrcImm | NoWrite, em_test),
|
|
|
I2bv(SrcAcc | DstDI | Mov | String, em_mov),
|
|
@@ -5629,3 +5630,14 @@ void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt)
|
|
|
{
|
|
|
writeback_registers(ctxt);
|
|
|
}
|
|
|
+
|
|
|
+bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt)
|
|
|
+{
|
|
|
+ if (ctxt->rep_prefix && (ctxt->d & String))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (ctxt->d & TwoMemOp)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|