KVM: x86 emulator: modify 'lods', and 'stos' not to depend on CR2
The current 'lods' and 'stos' is depending on incoming CR2 rather than decode memory address from registers. Signed-off-by: Sheng Yang <sheng.yang@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
@@ -1528,7 +1528,9 @@ special_insn:
|
|||||||
case 0xaa ... 0xab: /* stos */
|
case 0xaa ... 0xab: /* stos */
|
||||||
c->dst.type = OP_MEM;
|
c->dst.type = OP_MEM;
|
||||||
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
|
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
|
||||||
c->dst.ptr = (unsigned long *)cr2;
|
c->dst.ptr = (unsigned long *)register_address(
|
||||||
|
ctxt->es_base,
|
||||||
|
c->regs[VCPU_REGS_RDI]);
|
||||||
c->dst.val = c->regs[VCPU_REGS_RAX];
|
c->dst.val = c->regs[VCPU_REGS_RAX];
|
||||||
register_address_increment(c->regs[VCPU_REGS_RDI],
|
register_address_increment(c->regs[VCPU_REGS_RDI],
|
||||||
(ctxt->eflags & EFLG_DF) ? -c->dst.bytes
|
(ctxt->eflags & EFLG_DF) ? -c->dst.bytes
|
||||||
@@ -1538,9 +1540,13 @@ special_insn:
|
|||||||
c->dst.type = OP_REG;
|
c->dst.type = OP_REG;
|
||||||
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
|
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
|
||||||
c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
|
c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
|
||||||
if ((rc = ops->read_emulated(cr2, &c->dst.val,
|
if ((rc = ops->read_emulated(register_address(
|
||||||
c->dst.bytes,
|
c->override_base ? *c->override_base :
|
||||||
ctxt->vcpu)) != 0)
|
ctxt->ds_base,
|
||||||
|
c->regs[VCPU_REGS_RSI]),
|
||||||
|
&c->dst.val,
|
||||||
|
c->dst.bytes,
|
||||||
|
ctxt->vcpu)) != 0)
|
||||||
goto done;
|
goto done;
|
||||||
register_address_increment(c->regs[VCPU_REGS_RSI],
|
register_address_increment(c->regs[VCPU_REGS_RSI],
|
||||||
(ctxt->eflags & EFLG_DF) ? -c->dst.bytes
|
(ctxt->eflags & EFLG_DF) ? -c->dst.bytes
|
||||||
|
Reference in New Issue
Block a user