lkml.org 
[lkml]   [2011]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 04/12] KVM: x86: cleanup port-in/port-out emulated
    Remove the same code between emulator_pio_in_emulated and
    emulator_pio_out_emulated

    Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
    ---
    arch/x86/kvm/x86.c | 59 ++++++++++++++++++++++-----------------------------
    1 files changed, 26 insertions(+), 33 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index fbb3a44..5400a65 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -4330,32 +4330,24 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
    return r;
    }

    -
    -static int emulator_pio_in_emulated(struct x86_emulate_ctxt *ctxt,
    - int size, unsigned short port, void *val,
    - unsigned int count)
    +static int emulator_pio_in_out(struct kvm_vcpu *vcpu, int size,
    + unsigned short port, void *val,
    + unsigned int count, bool in)
    {
    - struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
    -
    - if (vcpu->arch.pio.count)
    - goto data_avail;
    -
    - trace_kvm_pio(0, port, size, count);
    + trace_kvm_pio(!in, port, size, count);

    vcpu->arch.pio.port = port;
    - vcpu->arch.pio.in = 1;
    + vcpu->arch.pio.in = in;
    vcpu->arch.pio.count = count;
    vcpu->arch.pio.size = size;

    if (!kernel_pio(vcpu, vcpu->arch.pio_data)) {
    - data_avail:
    - memcpy(val, vcpu->arch.pio_data, size * count);
    vcpu->arch.pio.count = 0;
    return 1;
    }

    vcpu->run->exit_reason = KVM_EXIT_IO;
    - vcpu->run->io.direction = KVM_EXIT_IO_IN;
    + vcpu->run->io.direction = in ? KVM_EXIT_IO_IN : KVM_EXIT_IO_OUT;
    vcpu->run->io.size = size;
    vcpu->run->io.data_offset = KVM_PIO_PAGE_OFFSET * PAGE_SIZE;
    vcpu->run->io.count = count;
    @@ -4364,36 +4356,37 @@ static int emulator_pio_in_emulated(struct x86_emulate_ctxt *ctxt,
    return 0;
    }

    -static int emulator_pio_out_emulated(struct x86_emulate_ctxt *ctxt,
    - int size, unsigned short port,
    - const void *val, unsigned int count)
    +static int emulator_pio_in_emulated(struct x86_emulate_ctxt *ctxt,
    + int size, unsigned short port, void *val,
    + unsigned int count)
    {
    struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
    + int ret;

    - trace_kvm_pio(1, port, size, count);
    -
    - vcpu->arch.pio.port = port;
    - vcpu->arch.pio.in = 0;
    - vcpu->arch.pio.count = count;
    - vcpu->arch.pio.size = size;
    -
    - memcpy(vcpu->arch.pio_data, val, size * count);
    + if (vcpu->arch.pio.count)
    + goto data_avail;

    - if (!kernel_pio(vcpu, vcpu->arch.pio_data)) {
    + ret = emulator_pio_in_out(vcpu, size, port, val, count, true);
    + if (ret) {
    +data_avail:
    + memcpy(val, vcpu->arch.pio_data, size * count);
    vcpu->arch.pio.count = 0;
    return 1;
    }

    - vcpu->run->exit_reason = KVM_EXIT_IO;
    - vcpu->run->io.direction = KVM_EXIT_IO_OUT;
    - vcpu->run->io.size = size;
    - vcpu->run->io.data_offset = KVM_PIO_PAGE_OFFSET * PAGE_SIZE;
    - vcpu->run->io.count = count;
    - vcpu->run->io.port = port;
    -
    return 0;
    }

    +static int emulator_pio_out_emulated(struct x86_emulate_ctxt *ctxt,
    + int size, unsigned short port,
    + const void *val, unsigned int count)
    +{
    + struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
    +
    + memcpy(vcpu->arch.pio_data, val, size * count);
    + return emulator_pio_in_out(vcpu, size, port, (void *)val, count, false);
    +}
    +
    static unsigned long get_segment_base(struct kvm_vcpu *vcpu, int seg)
    {
    return kvm_x86_ops->get_segment_base(vcpu, seg);
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2011-08-02 13:09    [W:8.415 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site