[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] vmx realmode: Faster emulation of REP INS and REP OUTS.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1201022331 0 # Node ID dbb5a79837759726b0ea600e8122efd8efd334de # Parent a878752a83f9c610d678b894063b133a5cf0719a vmx realmode: Faster emulation of REP INS and REP OUTS. This makes, in particular, reading files via the BIOS disk abstraction much much much faster. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/x86/hvm/vmx/realmode.c | 60 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+) diff -r a878752a83f9 -r dbb5a7983775 xen/arch/x86/hvm/vmx/realmode.c --- a/xen/arch/x86/hvm/vmx/realmode.c Tue Jan 22 17:18:02 2008 +0000 +++ b/xen/arch/x86/hvm/vmx/realmode.c Tue Jan 22 17:18:51 2008 +0000 @@ -221,6 +221,64 @@ realmode_emulate_cmpxchg( { /* Fix this in case the guest is really relying on r-m-w atomicity. */ return realmode_emulate_write(seg, offset, new, bytes, ctxt); +} + +static int +realmode_rep_ins( + uint16_t src_port, + enum x86_segment dst_seg, + unsigned long dst_offset, + unsigned int bytes_per_rep, + unsigned long *reps, + struct x86_emulate_ctxt *ctxt) +{ + struct realmode_emulate_ctxt *rm_ctxt = + container_of(ctxt, struct realmode_emulate_ctxt, ctxt); + struct vcpu *curr = current; + uint32_t paddr = rm_ctxt->seg_reg[dst_seg].base + dst_offset; + + if ( curr->arch.hvm_vmx.real_mode_io_in_progress ) + return X86EMUL_UNHANDLEABLE; + + if ( !curr->arch.hvm_vmx.real_mode_io_completed ) + { + curr->arch.hvm_vmx.real_mode_io_in_progress = 1; + send_pio_req(src_port, *reps, bytes_per_rep, + paddr, IOREQ_READ, + !!(ctxt->regs->eflags & X86_EFLAGS_DF), 1); + } + + if ( !curr->arch.hvm_vmx.real_mode_io_completed ) + return X86EMUL_RETRY; + + curr->arch.hvm_vmx.real_mode_io_completed = 0; + + return X86EMUL_OKAY; +} + +static int +realmode_rep_outs( + enum x86_segment src_seg, + unsigned long src_offset, + uint16_t dst_port, + unsigned int bytes_per_rep, + unsigned long *reps, + struct x86_emulate_ctxt *ctxt) +{ + struct realmode_emulate_ctxt *rm_ctxt = + container_of(ctxt, struct realmode_emulate_ctxt, ctxt); + struct vcpu *curr = current; + uint32_t paddr = rm_ctxt->seg_reg[src_seg].base + src_offset; + + if ( curr->arch.hvm_vmx.real_mode_io_in_progress ) + return X86EMUL_UNHANDLEABLE; + + curr->arch.hvm_vmx.real_mode_io_in_progress = 1; + send_pio_req(dst_port, *reps, bytes_per_rep, + paddr, IOREQ_WRITE, + !!(ctxt->regs->eflags & X86_EFLAGS_DF), 1); + + return X86EMUL_OKAY; } static int @@ -420,6 +478,8 @@ static struct x86_emulate_ops realmode_e .insn_fetch = realmode_emulate_insn_fetch, .write = realmode_emulate_write, .cmpxchg = realmode_emulate_cmpxchg, + .rep_ins = realmode_rep_ins, + .rep_outs = realmode_rep_outs, .read_segment = realmode_read_segment, .write_segment = realmode_write_segment, .read_io = realmode_read_io, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |