From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 4/5] vmx.c uses x86_decode_prefix() instead of get_io_count(). Date: Thu, 02 Aug 2007 11:48:59 +0300 Message-ID: <46B19A7B.2030109@qumranet.com> References: <46B04CCA.2010503@bull.net> <46B04DD6.7010702@bull.net> <46B04EB9.5010103@bull.net> <46B04F56.60607@bull.net> <46B0501C.6060409@bull.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel To: Laurent Vivier Return-path: In-Reply-To: <46B0501C.6060409-6ktuUTfB/bM@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org Laurent Vivier wrote: > vmx.c uses x86_decode_prefix() instead of get_io_count(). > > > static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > { > u64 exit_qualification; > @@ -1831,8 +1780,32 @@ > port = exit_qualification >> 16; > address = 0; > if (string) { > - if (rep && !get_io_count(vcpu, &count)) > + int mode; > + u64 inst; > + gva_t rip; > + struct x86_prefix prefix; > + u32 cs_ar = vmcs_read32(GUEST_CS_AR_BYTES); > + unsigned long addr_mask; > + > + mode = (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM) ? > + X86EMUL_MODE_REAL : (cs_ar & AR_L_MASK) > + ? X86EMUL_MODE_PROT64 : (cs_ar & AR_DB_MASK) > + ? X86EMUL_MODE_PROT32 : X86EMUL_MODE_PROT16; > + > + rip = vmcs_readl(GUEST_RIP); > + if (mode != X86EMUL_MODE_PROT64) > + rip += vmcs_readl(GUEST_CS_BASE); > + if (emulator_read_std(rip, &inst, sizeof(inst), vcpu) > + != X86EMUL_CONTINUE) > + return 1; > + > + if (x86_decode_prefix(mode, (u8*)&inst, &prefix) == -1) > return 1; > + > + addr_mask = (~0ULL >> (64 - (prefix.ad_bytes <<3))); > + if (rep) > + count = vcpu->regs[VCPU_REGS_RCX] & addr_mask; > + > address = vmcs_readl(GUEST_LINEAR_ADDRESS); > } > return kvm_setup_pio(vcpu, kvm_run, in, size, count, string, down, How about just calliing emulate_instruction() from here (just for the string case)? That will eliminate all the setup code. x86_emulate_memop() will need to be extended to decode ins/outs, but that's fairly easy. -- error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/