From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: [PATCH] KVM: nSVM: Fix IOIO bitmap evaluation Date: Mon, 30 Jun 2014 10:54:17 +0200 Message-ID: <53B125B9.6050306@web.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="wcluwGqeBrdOQlFw3CWvukNafKCj62Efa" Cc: Joerg Roedel , Valentine Sinitsyn To: Paolo Bonzini , kvm Return-path: Received: from mout.web.de ([212.227.17.12]:58387 "EHLO mout.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755333AbaF3Iy0 (ORCPT ); Mon, 30 Jun 2014 04:54:26 -0400 Sender: kvm-owner@vger.kernel.org List-ID: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --wcluwGqeBrdOQlFw3CWvukNafKCj62Efa Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable From: Jan Kiszka First, kvm_read_guest returns 0 on success. And then we need to take the access size into account when testing the bitmap: intercept if any of bits corresponding to the access is set. Signed-off-by: Jan Kiszka --- This does not yet solve all IOIO issues, there are emulation-related bugs remaining, but this fix is self-contained. arch/x86/kvm/svm.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index c79766e1..3483ac9 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -2116,22 +2116,27 @@ static void nested_svm_unmap(struct page *page) =20 static int nested_svm_intercept_ioio(struct vcpu_svm *svm) { - unsigned port; - u8 val, bit; + unsigned port, size, iopm_len; + u16 val, mask; + u8 start_bit; u64 gpa; =20 if (!(svm->nested.intercept & (1ULL << INTERCEPT_IOIO_PROT))) return NESTED_EXIT_HOST; =20 port =3D svm->vmcb->control.exit_info_1 >> 16; + size =3D (svm->vmcb->control.exit_info_1 & SVM_IOIO_SIZE_MASK) >> + SVM_IOIO_SIZE_SHIFT; gpa =3D svm->nested.vmcb_iopm + (port / 8); - bit =3D port % 8; - val =3D 0; + start_bit =3D port % 8; + iopm_len =3D (start_bit + size > 8) ? 2 : 1; + mask =3D (0xf >> (4 - size)) << start_bit; + val =3D 0; =20 - if (kvm_read_guest(svm->vcpu.kvm, gpa, &val, 1)) - val &=3D (1 << bit); + if (kvm_read_guest(svm->vcpu.kvm, gpa, &val, iopm_len)) + return NESTED_EXIT_DONE; =20 - return val ? NESTED_EXIT_DONE : NESTED_EXIT_HOST; + return (val & mask) ? NESTED_EXIT_DONE : NESTED_EXIT_HOST; } =20 static int nested_svm_exit_handled_msr(struct vcpu_svm *svm) --=20 1.8.4.5 --wcluwGqeBrdOQlFw3CWvukNafKCj62Efa Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iEYEARECAAYFAlOxJbkACgkQitSsb3rl5xSAtgCbBzl6ViepYMEt4S7LBUbAzrgS agAAn1rZPU3sazJFPaf9Z5U2rX1obn07 =xe+5 -----END PGP SIGNATURE----- --wcluwGqeBrdOQlFw3CWvukNafKCj62Efa--