aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>2011-11-22 22:27:39 -0500
committerAvi Kivity <avi@redhat.com>2011-12-27 04:17:46 -0500
commit2b5e97e1fadf1ade87558f2a2003616879f9e228 (patch)
tree31a7b6eed647cee35de6e3e7cc90f98b47f2a300 /arch/x86/kvm
parentd77fe6354d5b67f4d4eb62a47621da2b3ee3539e (diff)
KVM: x86 emulator: Use opcode::execute for INS/OUTS from/to port in DX
INSB : 6C INSW/INSD : 6D OUTSB : 6E OUTSW/OUTSD: 6F The I/O port address is read from the DX register when we decode the operand because we see the SrcDX/DstDX flag is set. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/emulate.c14
1 files changed, 2 insertions, 12 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 4cd3313b413..ac8e5ed7883 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3321,8 +3321,8 @@ static struct opcode opcode_table[256] = {
3321 I(DstReg | SrcMem | ModRM | Src2Imm, em_imul_3op), 3321 I(DstReg | SrcMem | ModRM | Src2Imm, em_imul_3op),
3322 I(SrcImmByte | Mov | Stack, em_push), 3322 I(SrcImmByte | Mov | Stack, em_push),
3323 I(DstReg | SrcMem | ModRM | Src2ImmByte, em_imul_3op), 3323 I(DstReg | SrcMem | ModRM | Src2ImmByte, em_imul_3op),
3324 D2bvIP(DstDI | SrcDX | Mov | String, ins, check_perm_in), /* insb, insw/insd */ 3324 I2bvIP(DstDI | SrcDX | Mov | String, em_in, ins, check_perm_in), /* insb, insw/insd */
3325 D2bvIP(SrcSI | DstDX | String, outs, check_perm_out), /* outsb, outsw/outsd */ 3325 I2bvIP(SrcSI | DstDX | String, em_out, outs, check_perm_out), /* outsb, outsw/outsd */
3326 /* 0x70 - 0x7F */ 3326 /* 0x70 - 0x7F */
3327 X16(D(SrcImmByte)), 3327 X16(D(SrcImmByte)),
3328 /* 0x80 - 0x87 */ 3328 /* 0x80 - 0x87 */
@@ -4027,16 +4027,6 @@ special_insn:
4027 goto cannot_emulate; 4027 goto cannot_emulate;
4028 ctxt->dst.val = (s32) ctxt->src.val; 4028 ctxt->dst.val = (s32) ctxt->src.val;
4029 break; 4029 break;
4030 case 0x6c: /* insb */
4031 case 0x6d: /* insw/insd */
4032 ctxt->src.val = ctxt->regs[VCPU_REGS_RDX];
4033 rc = em_in(ctxt);
4034 break;
4035 case 0x6e: /* outsb */
4036 case 0x6f: /* outsw/outsd */
4037 ctxt->dst.val = ctxt->regs[VCPU_REGS_RDX];
4038 rc = em_out(ctxt);
4039 break;
4040 case 0x70 ... 0x7f: /* jcc (short) */ 4030 case 0x70 ... 0x7f: /* jcc (short) */
4041 if (test_cc(ctxt->b, ctxt->eflags)) 4031 if (test_cc(ctxt->b, ctxt->eflags))
4042 jmp_rel(ctxt, ctxt->src.val); 4032 jmp_rel(ctxt, ctxt->src.val);