KVM: x86 emulator: use SrcAcc to simplify stos decoding
PATCH 1/4 KVM: x86 emulator: use SrcAcc to simplify stos decoding
Use SrcAcc to simplify stos decoding.
--- arch/x86/kvm/emulate.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
arch/x86/kvm/emulate.c +2 -3
@@ -2175,7 +2175,8 @@ static struct opcode opcode_table[256] = {D (ByteOp | SrcSI | DstDI | Mov | String),D (SrcSI | DstDI | Mov | String),D (ByteOp | SrcSI | DstDI | String),D (SrcSI | DstDI | String),/* 0xA8 - 0xAF */ -D (DstAcc | SrcImmByte | ByteOp),D (DstAcc | SrcImm),D (ByteOp | DstDI | Mov | String),D (DstDI | Mov | String), +D (DstAcc | SrcImmByte | ByteOp),D (DstAcc | SrcImm), +D (ByteOp | SrcAcc | DstDI | Mov | String),D (SrcAcc | DstDI | Mov | String),D (ByteOp | SrcSI | DstAcc | Mov | String),D (SrcSI | DstAcc | Mov | String),D (ByteOp | DstDI | String),D (DstDI | String), /* 0xB0 - 0xB7 */
@@ -2937,8 +2938,6 @@ special_insn: case 0xa8 ... 0xa9: /* test ax, imm */ goto test; case 0xaa ... 0xab: /* stos */ - c->dst.val = c->regs[VCPU_REGS_RAX ]; -break ; case 0xac ... 0xad: /* lods */ goto mov; case 0xae ... 0xaf: /* scas */
Signature · 1 line
1.7.0.4
PATCH 2/4 KVM: x86 emulator: disable writeback when decode dest operand
This patch change to disable writeback when decode dest operand if the dest type is ImplicitOps or not specified.
--- arch/x86/kvm/emulate.c | 23 ++++++----------------- 1 files changed, 6 insertions(+), 17 deletions(-)
arch/x86/kvm/emulate.c +6 -17
@@ -2569,9 +2569,6 @@ done_prefixes:/* Decode and fetch the destination operand: register or memory. */ switch (c->d & DstMask) { -case ImplicitOps: -/* Special instructions do their own operand decoding. */ -return 0 ;case DstReg:decode_register_operand (&c->dst, c, c->twobyte && (c->b ==0xb6 || c->b ==0xb7 ));
@@ -2606,6 +2603,11 @@ done_prefixes: c->regs[VCPU_REGS_RDI]); c->dst.val =0 ;break ; +case ImplicitOps: +/* Special instructions do their own operand decoding. */ +default : + c->dst.type =OP_NONE ;/* Disable writeback. */ +return 0 ; } done:
@@ -3040,7 +3042,6 @@ special_insn:case 0xf5 :/* cmc */ /* complement carry flag from eflags reg */ ctxt->eflags ^=EFLG_CF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ break ; case 0xf6 ... 0xf7: /* Grp3 */if (!emulate_grp3 (ctxt, ops))
@@ -3048,16 +3049,13 @@ special_insn:break ;case 0xf8 :/* clc */ ctxt->eflags &= ~EFLG_CF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ break ;case 0xfa :/* cli */ if (emulator_bad_iopl (ctxt, ops)) {emulate_gp (ctxt,0 ); goto done; - }else { + }else ctxt->eflags &= ~X86_EFLAGS_IF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ - }break ;case 0xfb :/* sti */ if (emulator_bad_iopl (ctxt, ops)) {
@@ -3066,16 +3064,13 @@ special_insn: }else { ctxt->interruptibility =KVM_X86_SHADOW_INT_STI ; ctxt->eflags |=X86_EFLAGS_IF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ }break ;case 0xfc :/* cld */ ctxt->eflags &= ~EFLG_DF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ break ;case 0xfd :/* std */ ctxt->eflags |=EFLG_DF ; - c->dst.type =OP_NONE ;/* Disable writeback. */ break ;case 0xfe :/* Grp4 */ grp45:
@@ -3212,16 +3207,13 @@ twobyte_insn:break ;case 0x06 :emulate_clts (ctxt->vcpu); - c->dst.type =OP_NONE ;break ;case 0x09 :/* wbinvd */ kvm_emulate_wbinvd (ctxt->vcpu); - c->dst.type =OP_NONE ;break ;case 0x08 :/* invd */ case 0x0d :/* GrpP (prefetch) */ case 0x18 :/* Grp16 (prefetch/nop) */ - c->dst.type =OP_NONE ;break ;case 0x20 :/* mov cr, reg */ switch (c->modrm_reg) {
@@ -3274,7 +3266,6 @@ twobyte_insn: goto done; } rc =X86EMUL_CONTINUE ; - c->dst.type =OP_NONE ;break ;case 0x32 :/* rdmsr */
@@ -3286,7 +3277,6 @@ twobyte_insn: c->regs[VCPU_REGS_RDX ] = msr_data >>32 ; } rc =X86EMUL_CONTINUE ; - c->dst.type =OP_NONE ;break ;case 0x34 :/* sysenter */ rc =emulate_sysenter (ctxt, ops);
@@ -3310,7 +3300,6 @@ twobyte_insn: case 0x80 ... 0x8f: /* jnz rel, etc*/if (test_cc (c->b, ctxt->eflags))jmp_rel (c, c->src.val); - c->dst.type =OP_NONE ;break ;case 0xa0 :/* push fs */ emulate_push_sreg (ctxt, ops,VCPU_SREG_FS );
Signature · 1 line
1.7.0.4
PATCH 3/4 KVM: x86 emulator: using SrcOne for instruction d0/d1 decoding
In reply to Wei YongjunUsing SrcOne for instruction d0/d1 decoding.
--- arch/x86/kvm/emulate.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
arch/x86/kvm/emulate.c +1 -2
@@ -2191,7 +2191,7 @@ static struct opcode opcode_table[256] = {N ,N ,N ,D (ImplicitOps | Stack),D (ImplicitOps),D (SrcImmByte),D (ImplicitOps | No64),D (ImplicitOps),/* 0xD0 - 0xD7 */ -D (ByteOp | DstMem | SrcImplicit | ModRM),D (DstMem | SrcImplicit | ModRM), +D (ByteOp | DstMem | SrcOne | ModRM),D (DstMem | SrcOne | ModRM),D (ByteOp | DstMem | SrcImplicit | ModRM),D (DstMem | SrcImplicit | ModRM),N ,N ,N ,N , /* 0xD8 - 0xDF */
@@ -2971,7 +2971,6 @@ special_insn: goto done;break ; case 0xd0 ... 0xd1: /* Grp2 */ - c->src.val =1 ;emulate_grp2 (ctxt);break ; case 0xd2 ... 0xd3: /* Grp2 */
Signature · 1 line
1.7.0.4
Re: [PATCH 3/4] KVM: x86 emulator: using SrcOne for instruction d0/d1 decoding
Quoted 2 lines · Wei Yongjun
Using SrcOne for instruction d0/d1 decoding.
Applied 1-3, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 4/4 KVM: x86 emulator: remove dup code of in/out instruction
In reply to Wei Yongjun--- arch/x86/kvm/emulate.c | 50 ++++++++++++++++++++--------------------------- 1 files changed, 21 insertions(+), 29 deletions(-)
arch/x86/kvm/emulate.c +21 -29
@@ -54,6 +54,7 @@#define DstAcc (4<<1)/* Destination Accumulator */ #define DstDI (5<<1)/* Destination is in ES:(E)DI */ #define DstMem64 (6<<1)/* 64bit memory operand */ +#define DstImmUByte (7<<1)/* 8-bit unsigned immediate operand */ #define DstMask (7<<1)/* Source operand type. */ #define SrcNone (0<<4)/* No source operand. */
@@ -2199,12 +2200,12 @@ static struct opcode opcode_table[256] = {/* 0xE0 - 0xE7 */ N ,N ,N ,N ,D (ByteOp | SrcImmUByte | DstAcc),D (SrcImmUByte | DstAcc), -D (ByteOp | SrcImmUByte | DstAcc),D (SrcImmUByte | DstAcc), +D (ByteOp | SrcAcc | DstImmUByte),D (SrcAcc | DstImmUByte),/* 0xE8 - 0xEF */ D (SrcImm | Stack),D (SrcImm | ImplicitOps),D (SrcImmFAddr | No64),D (SrcImmByte | ImplicitOps),D (SrcNone | ByteOp | DstAcc),D (SrcNone | DstAcc), -D (SrcNone | ByteOp | DstAcc),D (SrcNone | DstAcc), +D (ByteOp | SrcAcc | ImplicitOps),D (SrcAcc | ImplicitOps),/* 0xF0 - 0xF7 */ N ,N ,N ,N , D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3),
@@ -2573,6 +2574,12 @@ done_prefixes:decode_register_operand (&c->dst, c, c->twobyte && (c->b ==0xb6 || c->b ==0xb7 ));break ; +case DstImmUByte: + c->dst.type =OP_IMM ; + c->dst.addr.mem = c->eip; + c->dst.bytes =1 ; + c->dst.val =insn_fetch (u8,1 , c->eip); +break ;case DstMem:case DstMem64: c->dst = memop;
@@ -2803,29 +2810,12 @@ special_insn:break ;case 0x6c :/* insb */ case 0x6d :/* insw/insd */ - c->dst.bytes =min (c->dst.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->regs[VCPU_REGS_RDX ], - c->dst.bytes)) { -emulate_gp (ctxt,0 ); - goto done; - } -if (!pio_in_emulated (ctxt, ops, c->dst.bytes, - c->regs[VCPU_REGS_RDX ], &c->dst.val)) - goto done;/* IO is needed, skip writeback */ -break ; + c->src.val = c->regs[VCPU_REGS_RDX ]; + goto do_io_in;case 0x6e :/* outsb */ case 0x6f :/* outsw/outsd */ - c->src.bytes =min (c->src.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->regs[VCPU_REGS_RDX ], - c->src.bytes)) { -emulate_gp (ctxt,0 ); - goto done; - } - ops->pio_out_emulated (c->src.bytes, c->regs[VCPU_REGS_RDX ], - &c->src.val,1 , ctxt->vcpu); - - c->dst.type =OP_NONE ;/* nothing to writeback */ -break ; + c->dst.val = c->regs[VCPU_REGS_RDX ]; + goto do_io_out; case 0x70 ... 0x7f: /* jcc (short) */if (test_cc (c->b, ctxt->eflags))jmp_rel (c, c->src.val);
@@ -3024,16 +3014,18 @@ special_insn:break ;case 0xee :/* out dx,al */ case 0xef :/* out dx,(e/r)ax */ - c->src.val = c->regs[VCPU_REGS_RDX ]; + c->dst.val = c->regs[VCPU_REGS_RDX ]; do_io_out: - c->dst.bytes =min (c->dst.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->src.val, c->dst.bytes)) { + c->src.bytes =min (c->src.bytes,4u ); +if (!emulator_io_permited (ctxt, ops, c->dst.val, + c->src.bytes)) {emulate_gp (ctxt,0 ); goto done; } - ops->pio_out_emulated (c->dst.bytes, c->src.val, &c->dst.val,1 , - ctxt->vcpu); - c->dst.type =OP_NONE ;/* Disable writeback. */ + ops->pio_out_emulated (c->src.bytes, c->dst.val, + &c->src.val,1 , ctxt->vcpu); + + c->dst.type =OP_NONE ;/* nothing to writeback */ break ;case 0xf4 :/* hlt */ ctxt->vcpu->arch.halt_request =1 ;
Signature · 1 line
1.7.0.4
Re: [PATCH 4/4] KVM: x86 emulator: remove dup code of in/out instruction
Quoted 1 line · Wei Yongjun
Signed-off-by Wei Yongjun <[email protected]>
Patch is good, but too big. Please separate into DstImmUByte, change OUT to use dst instead of src, IN consolidationn and OUT consolidation.
Quoted 103 lines
--- arch/x86/kvm/emulate.c | 50 ++++++++++++++++++++--------------------------- 1 files changed, 21 insertions(+), 29 deletions(-)arch/x86/kvm/emulate.c +21
-29@@ -54,6 +54,7 @@#define DstAcc (4<<1)/* Destination Accumulator */ #define DstDI (5<<1)/* Destination is in ES:(E)DI */ #define DstMem64 (6<<1)/* 64bit memory operand */ +#define DstImmUByte (7<<1)/* 8-bit unsigned immediate operand */ #define DstMask (7<<1)/* Source operand type. */ #define SrcNone (0<<4)/* No source operand. */ @@ -2199,12 +2200,12 @@ static struct opcode opcode_table[256] = {/* 0xE0 - 0xE7 */ N ,N ,N ,N ,D (ByteOp | SrcImmUByte | DstAcc),D (SrcImmUByte | DstAcc), -D (ByteOp | SrcImmUByte | DstAcc),D (SrcImmUByte | DstAcc), +D (ByteOp | SrcAcc | DstImmUByte),D (SrcAcc | DstImmUByte),/* 0xE8 - 0xEF */ D (SrcImm | Stack),D (SrcImm | ImplicitOps),D (SrcImmFAddr | No64),D (SrcImmByte | ImplicitOps),D (SrcNone | ByteOp | DstAcc),D (SrcNone | DstAcc), -D (SrcNone | ByteOp | DstAcc),D (SrcNone | DstAcc), +D (ByteOp | SrcAcc | ImplicitOps),D (SrcAcc | ImplicitOps),/* 0xF0 - 0xF7 */ N ,N ,N ,N , D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3),@@ -2573,6 +2574,12 @@ done_prefixes:decode_register_operand (&c->dst, c, c->twobyte && (c->b ==0xb6 || c->b ==0xb7 ));break ; +case DstImmUByte: + c->dst.type =OP_IMM ; + c->dst.addr.mem = c->eip; + c->dst.bytes =1 ; + c->dst.val =insn_fetch (u8,1 , c->eip); +break ;case DstMem:case DstMem64: c->dst = memop;@@ -2803,29 +2810,12 @@ special_insn:break ;case 0x6c :/* insb */ case 0x6d :/* insw/insd */ - c->dst.bytes =min (c->dst.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->regs[VCPU_REGS_RDX ], - c->dst.bytes)) { -emulate_gp (ctxt,0 ); - goto done; - } -if (!pio_in_emulated (ctxt, ops, c->dst.bytes, - c->regs[VCPU_REGS_RDX ], &c->dst.val)) - goto done;/* IO is needed, skip writeback */ -break ; + c->src.val = c->regs[VCPU_REGS_RDX ]; + goto do_io_in;case 0x6e :/* outsb */ case 0x6f :/* outsw/outsd */ - c->src.bytes =min (c->src.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->regs[VCPU_REGS_RDX ], - c->src.bytes)) { -emulate_gp (ctxt,0 ); - goto done; - } - ops->pio_out_emulated (c->src.bytes, c->regs[VCPU_REGS_RDX ], - &c->src.val,1 , ctxt->vcpu); - - c->dst.type =OP_NONE ;/* nothing to writeback */ -break ; + c->dst.val = c->regs[VCPU_REGS_RDX ]; + goto do_io_out; case 0x70 ... 0x7f: /* jcc (short) */if (test_cc (c->b, ctxt->eflags))jmp_rel (c, c->src.val);@@ -3024,16 +3014,18 @@ special_insn:break ;case 0xee :/* out dx,al */ case 0xef :/* out dx,(e/r)ax */ - c->src.val = c->regs[VCPU_REGS_RDX ]; + c->dst.val = c->regs[VCPU_REGS_RDX ]; do_io_out: - c->dst.bytes =min (c->dst.bytes,4u ); -if (!emulator_io_permited (ctxt, ops, c->src.val, c->dst.bytes)) { + c->src.bytes =min (c->src.bytes,4u ); +if (!emulator_io_permited (ctxt, ops, c->dst.val, + c->src.bytes)) {emulate_gp (ctxt,0 ); goto done; } - ops->pio_out_emulated (c->dst.bytes, c->src.val, &c->dst.val,1 , - ctxt->vcpu); - c->dst.type =OP_NONE ;/* Disable writeback. */ + ops->pio_out_emulated (c->src.bytes, c->dst.val, + &c->src.val,1 , ctxt->vcpu); + + c->dst.type =OP_NONE ;/* nothing to writeback */ break ;case 0xf4 :/* hlt */ ctxt->vcpu->arch.halt_request =1 ;
Signature · 1 line
error compiling committee.c: too many arguments to function