diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2011-11-22 22:27:39 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-12-27 04:17:46 -0500 |
commit | 2b5e97e1fadf1ade87558f2a2003616879f9e228 (patch) | |
tree | 31a7b6eed647cee35de6e3e7cc90f98b47f2a300 | |
parent | d77fe6354d5b67f4d4eb62a47621da2b3ee3539e (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>
-rw-r--r-- | arch/x86/kvm/emulate.c | 14 |
1 files changed, 2 insertions, 12 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 4cd3313b4131..ac8e5ed78834 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); |