diff options
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 27f677ef703e..32d3da82da2e 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -1588,34 +1588,28 @@ static void write_register_operand(struct operand *op) | |||
1588 | 1588 | ||
1589 | static int writeback(struct x86_emulate_ctxt *ctxt, struct operand *op) | 1589 | static int writeback(struct x86_emulate_ctxt *ctxt, struct operand *op) |
1590 | { | 1590 | { |
1591 | int rc; | ||
1592 | |||
1593 | switch (op->type) { | 1591 | switch (op->type) { |
1594 | case OP_REG: | 1592 | case OP_REG: |
1595 | write_register_operand(op); | 1593 | write_register_operand(op); |
1596 | break; | 1594 | break; |
1597 | case OP_MEM: | 1595 | case OP_MEM: |
1598 | if (ctxt->lock_prefix) | 1596 | if (ctxt->lock_prefix) |
1599 | rc = segmented_cmpxchg(ctxt, | 1597 | return segmented_cmpxchg(ctxt, |
1598 | op->addr.mem, | ||
1599 | &op->orig_val, | ||
1600 | &op->val, | ||
1601 | op->bytes); | ||
1602 | else | ||
1603 | return segmented_write(ctxt, | ||
1600 | op->addr.mem, | 1604 | op->addr.mem, |
1601 | &op->orig_val, | ||
1602 | &op->val, | 1605 | &op->val, |
1603 | op->bytes); | 1606 | op->bytes); |
1604 | else | ||
1605 | rc = segmented_write(ctxt, | ||
1606 | op->addr.mem, | ||
1607 | &op->val, | ||
1608 | op->bytes); | ||
1609 | if (rc != X86EMUL_CONTINUE) | ||
1610 | return rc; | ||
1611 | break; | 1607 | break; |
1612 | case OP_MEM_STR: | 1608 | case OP_MEM_STR: |
1613 | rc = segmented_write(ctxt, | 1609 | return segmented_write(ctxt, |
1614 | op->addr.mem, | 1610 | op->addr.mem, |
1615 | op->data, | 1611 | op->data, |
1616 | op->bytes * op->count); | 1612 | op->bytes * op->count); |
1617 | if (rc != X86EMUL_CONTINUE) | ||
1618 | return rc; | ||
1619 | break; | 1613 | break; |
1620 | case OP_XMM: | 1614 | case OP_XMM: |
1621 | write_sse_reg(ctxt, &op->vec_val, op->addr.xmm); | 1615 | write_sse_reg(ctxt, &op->vec_val, op->addr.xmm); |