@@ -3372,7 +3372,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
3372
3372
int def_op_bytes , def_ad_bytes , goffset , simd_prefix ;
3373
3373
bool op_prefix = false;
3374
3374
struct opcode opcode ;
3375
- struct operand memop = { .type = OP_NONE };
3375
+ struct operand memop = { .type = OP_NONE }, * memopp = NULL ;
3376
3376
3377
3377
c -> eip = ctxt -> eip ;
3378
3378
c -> fetch .start = c -> eip ;
@@ -3547,9 +3547,6 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
3547
3547
if (memop .type == OP_MEM && c -> ad_bytes != 8 )
3548
3548
memop .addr .mem .ea = (u32 )memop .addr .mem .ea ;
3549
3549
3550
- if (memop .type == OP_MEM && c -> rip_relative )
3551
- memop .addr .mem .ea += c -> eip ;
3552
-
3553
3550
/*
3554
3551
* Decode and fetch the source operand: register, memory
3555
3552
* or immediate.
@@ -3571,6 +3568,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
3571
3568
c -> op_bytes ;
3572
3569
srcmem_common :
3573
3570
c -> src = memop ;
3571
+ memopp = & c -> src ;
3574
3572
break ;
3575
3573
case SrcImmU16 :
3576
3574
rc = decode_imm (ctxt , & c -> src , 2 , false);
@@ -3667,6 +3665,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
3667
3665
case DstMem :
3668
3666
case DstMem64 :
3669
3667
c -> dst = memop ;
3668
+ memopp = & c -> dst ;
3670
3669
if ((c -> d & DstMask ) == DstMem64 )
3671
3670
c -> dst .bytes = 8 ;
3672
3671
else
@@ -3700,10 +3699,13 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
3700
3699
/* Special instructions do their own operand decoding. */
3701
3700
default :
3702
3701
c -> dst .type = OP_NONE ; /* Disable writeback. */
3703
- return 0 ;
3702
+ break ;
3704
3703
}
3705
3704
3706
3705
done :
3706
+ if (memopp && memopp -> type == OP_MEM && c -> rip_relative )
3707
+ memopp -> addr .mem .ea += c -> eip ;
3708
+
3707
3709
return (rc == X86EMUL_UNHANDLEABLE ) ? EMULATION_FAILED : EMULATION_OK ;
3708
3710
}
3709
3711
0 commit comments