KVM: x86: bit-ops emulation ignores offset on 64-bit
The current emulation of bit operations ignores the offset from the destination on 64-bit target memory operands. This patch fixes this behavior. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bc39c4db71
commit
7dec5603b6
|
@ -1220,12 +1220,14 @@ static void fetch_bit_operand(struct x86_emulate_ctxt *ctxt)
|
||||||
long sv = 0, mask;
|
long sv = 0, mask;
|
||||||
|
|
||||||
if (ctxt->dst.type == OP_MEM && ctxt->src.type == OP_REG) {
|
if (ctxt->dst.type == OP_MEM && ctxt->src.type == OP_REG) {
|
||||||
mask = ~(ctxt->dst.bytes * 8 - 1);
|
mask = ~((long)ctxt->dst.bytes * 8 - 1);
|
||||||
|
|
||||||
if (ctxt->src.bytes == 2)
|
if (ctxt->src.bytes == 2)
|
||||||
sv = (s16)ctxt->src.val & (s16)mask;
|
sv = (s16)ctxt->src.val & (s16)mask;
|
||||||
else if (ctxt->src.bytes == 4)
|
else if (ctxt->src.bytes == 4)
|
||||||
sv = (s32)ctxt->src.val & (s32)mask;
|
sv = (s32)ctxt->src.val & (s32)mask;
|
||||||
|
else
|
||||||
|
sv = (s64)ctxt->src.val & (s64)mask;
|
||||||
|
|
||||||
ctxt->dst.addr.mem.ea += (sv >> 3);
|
ctxt->dst.addr.mem.ea += (sv >> 3);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue