From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Vivier Subject: Re: [PATCH 4/5] vmx.c uses x86_decode_prefix() instead of get_io_count(). Date: Thu, 02 Aug 2007 11:34:20 +0200 Message-ID: <46B1A51C.2040104@bull.net> References: <46B04CCA.2010503@bull.net> <46B04DD6.7010702@bull.net> <46B04EB9.5010103@bull.net> <46B04F56.60607@bull.net> <46B0501C.6060409@bull.net> <46B19A7B.2030109@qumranet.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1188779160==" Cc: kvm-devel To: Avi Kivity Return-path: In-Reply-To: <46B19A7B.2030109-atKUWr5tajBWk0Htik3J/w@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 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --===============1188779160== Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig12BEF5D6DA276D601ECA785C" This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig12BEF5D6DA276D601ECA785C Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Avi Kivity wrote: > 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 =3D exit_qualification >> 16; >> address =3D 0; >> if (string) { >> - if (rep && !get_io_count(vcpu, &count)) >> + int mode; >> + u64 inst; >> + gva_t rip; >> + struct x86_prefix prefix; >> + u32 cs_ar =3D vmcs_read32(GUEST_CS_AR_BYTES); >> + unsigned long addr_mask; >> + >> + mode =3D (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 =3D vmcs_readl(GUEST_RIP); >> + if (mode !=3D X86EMUL_MODE_PROT64) >> + rip +=3D vmcs_readl(GUEST_CS_BASE); >> + if (emulator_read_std(rip, &inst, sizeof(inst), vcpu) >> + !=3D X86EMUL_CONTINUE) >> + return 1; >> + >> + if (x86_decode_prefix(mode, (u8*)&inst, &prefix) =3D=3D -1) >> return 1; >> + >> + addr_mask =3D (~0ULL >> (64 - (prefix.ad_bytes <<3))); >> + if (rep) >> + count =3D vcpu->regs[VCPU_REGS_RCX] & addr_mask; >> + >> address =3D vmcs_readl(GUEST_LINEAR_ADDRESS); >> } >> return kvm_setup_pio(vcpu, kvm_run, in, size, count, string, down= , >=20 > How about just calliing emulate_instruction() from here (just for the > string case)? That will eliminate all the setup code. But this setup is in emulate_instruction() so it will be executed anyway.= > x86_emulate_memop() will need to be extended to decode ins/outs, but > that's fairly easy. X86_decode_prefix() is a subset of instruction decoding part of x86_emulate_memop(), kvm_setup_pio() can be seen as a subset of instructi= on emulating part of x86_emulate_memop(). So I think in term of performance = it is better to do like that, but I agree by doing: if (string) return emulate_instruction(vcpu, kvm_run, 0, 0); else return kvm_setup_pio(vcpu, kvm_run, in, size, port); it is more more ... more simple. If you prefer simplicity, I can do like that ? (but I know you prefer simplicity...) BTW, I think PATCH 1,2 and 3 should be applied anyway because they allow = to introduce the separation between instruction decoding and instruction emu= lation requested by the TODO "Split the emulator into two functions: one to deco= de into the emulation context, and the other to actually execute the instruction.= " Laurent --=20 ------------- Laurent.Vivier-6ktuUTfB/bM@public.gmane.org -------------- "Software is hard" - Donald Knuth --------------enig12BEF5D6DA276D601ECA785C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.7 (GNU/Linux) iD8DBQFGsaUh9Kffa9pFVzwRAky6AKCMJTCwUiaUM99KCvHYMUZr0StxUACgpXVE eWVaNC8Ix0t51ETgT9k7pRw= =k/Tf -----END PGP SIGNATURE----- --------------enig12BEF5D6DA276D601ECA785C-- --===============1188779160== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- 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/ --===============1188779160== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --===============1188779160==--