From: Paolo Bonzini <pbonzini@redhat.com>
To: Wanpeng Li <wanpeng.li@linux.intel.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
Gleb Natapov <gleb@kernel.org>,
Zhang Yang <yang.z.zhang@intel.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Jan Kiszka <jan.kiszka@siemens.com>
Subject: Re: [PATCH v2 3/3] KVM: x86: #GP when attempts to write reserved bits of Variable Range MTRRs
Date: Fri, 29 Aug 2014 18:47:54 +0200 [thread overview]
Message-ID: <5400AEBA.2080405@redhat.com> (raw)
In-Reply-To: <1408439080-57721-3-git-send-email-wanpeng.li@linux.intel.com>
Il 19/08/2014 11:04, Wanpeng Li ha scritto:
> Section 11.11.2.3 of the SDM mentions "All other bits in the IA32_MTRR_PHYSBASEn
> and IA32_MTRR_PHYSMASKn registers are reserved; the processor generates a
> general-protection exception(#GP) if software attempts to write to them". This
> patch do it in kvm.
>
> Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
This breaks if the guest maxphyaddr is higher than the host's (which
sometimes happens depending on your hardware and how QEMU is
configured).
You need to use cpuid_maxphyaddr, like this
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a375dfc42f6a..916e89515210 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1726,7 +1726,7 @@ static bool valid_mtrr_type(unsigned t)
static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
{
int i;
- u64 mask = 0;
+ u64 mask;
if (!msr_mtrr_valid(msr))
return false;
@@ -1750,8 +1750,7 @@ static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
/* variable MTRRs */
WARN_ON(!(msr >= 0x200 && msr < 0x200 + 2 * KVM_NR_VAR_MTRR));
- for (i = 63; i > boot_cpu_data.x86_phys_bits; i--)
- mask |= (1ULL << i);
+ mask = (~0ULL) << cpuid_maxphyaddr(vcpu);
if ((msr & 1) == 0) {
/* MTRR base */
if (!valid_mtrr_type(data & 0xff))
Jan, can you see if this patch fixes the SeaBIOS triple fault you reported?
Paolo
> ---
> arch/x86/kvm/x86.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index fb3ea7a..b85da5f 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1726,6 +1726,7 @@ static bool valid_mtrr_type(unsigned t)
> static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
> {
> int i;
> + u64 mask = 0;
>
> if (!msr_mtrr_valid(msr))
> return false;
> @@ -1749,10 +1750,21 @@ static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
> /* variable MTRRs */
> WARN_ON(!(msr >= 0x200 && msr < 0x200 + 2 * KVM_NR_VAR_MTRR));
>
> - if ((msr & 1) == 0)
> + for (i = 63; i > boot_cpu_data.x86_phys_bits; i--)
> + mask |= (1ULL << i);
> + if ((msr & 1) == 0) {
> /* MTRR base */
> - return valid_mtrr_type(data & 0xff);
> - /* MTRR mask */
> + if (!valid_mtrr_type(data & 0xff))
> + return false;
> + mask |= 0xf00;
> + } else
> + /* MTRR mask */
> + mask |= 0x7ff;
> + if (data & mask) {
> + kvm_inject_gp(vcpu, 0);
> + return false;
> + }
> +
> return true;
> }
>
>
next prev parent reply other threads:[~2014-08-29 16:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-19 9:04 [PATCH v2 1/3] KVM: vmx: fix ept reserved bits for 1-GByte page Wanpeng Li
2014-08-19 9:04 ` [PATCH v2 2/3] KVM: x86: fix check legal type of Variable Range MTRRs Wanpeng Li
2014-08-19 9:04 ` [PATCH v2 3/3] KVM: x86: #GP when attempts to write reserved bits " Wanpeng Li
2014-08-19 9:11 ` Paolo Bonzini
2014-08-29 16:47 ` Paolo Bonzini [this message]
2014-08-29 16:52 ` Jan Kiszka
2014-09-01 0:22 ` Wanpeng Li
2014-08-19 9:09 ` [PATCH v2 1/3] KVM: vmx: fix ept reserved bits for 1-GByte page Paolo Bonzini
2014-08-19 11:16 ` Wanpeng Li
2014-08-19 12:07 ` Paolo Bonzini
2014-08-20 3:21 ` Wanpeng Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5400AEBA.2080405@redhat.com \
--to=pbonzini@redhat.com \
--cc=gleb@kernel.org \
--cc=jan.kiszka@siemens.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=wanpeng.li@linux.intel.com \
--cc=yang.z.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.