On 08/04/2010 10:40 AM, Wei Yongjun wrote:
> 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.

> ---
>  arch/x86/kvm/emulate.c |   50 ++++++++++++++++++++---------------------------
>  1 files changed, 21 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 1ce3c4f..d197b46 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -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;


-- 
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to