From: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
To: qemu-devel@nongnu.org, pbonzini@redhat.com, ehabkost@redhat.com,
marcel@redhat.com, mst@redhat.com, kraxel@redhat.com
Subject: [Qemu-devel] [PATCH v4 3/5] x86: Mask mtrr mask based on CPU physical address limits
Date: Fri, 8 Jul 2016 16:01:37 +0100 [thread overview]
Message-ID: <1467990099-27853-4-git-send-email-dgilbert@redhat.com> (raw)
In-Reply-To: <1467990099-27853-1-git-send-email-dgilbert@redhat.com>
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
The CPU GPs if we try and set a bit in a variable MTRR mask above
the limit of physical address bits on the host. We hit this
when loading a migration from a host with a larger physical
address limit than our destination (e.g. a Xeon->i7 of same
generation) but previously used to get away with it
until 48e1a45 started checking that msr writes actually worked.
It seems in our case the GP probably comes from KVM emulating
that GP.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
---
target-i386/kvm.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index f3698f1..6429205 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -1677,6 +1677,8 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
}
}
if (has_msr_mtrr) {
+ uint64_t phys_mask = MAKE_64BIT_MASK(0, cpu->phys_bits);
+
kvm_msr_entry_add(cpu, MSR_MTRRdefType, env->mtrr_deftype);
kvm_msr_entry_add(cpu, MSR_MTRRfix64K_00000, env->mtrr_fixed[0]);
kvm_msr_entry_add(cpu, MSR_MTRRfix16K_80000, env->mtrr_fixed[1]);
@@ -1690,10 +1692,15 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
kvm_msr_entry_add(cpu, MSR_MTRRfix4K_F0000, env->mtrr_fixed[9]);
kvm_msr_entry_add(cpu, MSR_MTRRfix4K_F8000, env->mtrr_fixed[10]);
for (i = 0; i < MSR_MTRRcap_VCNT; i++) {
+ /* The CPU GPs if we write to a bit above the physical limit of
+ * the host CPU (and KVM emulates that)
+ */
+ uint64_t mask = env->mtrr_var[i].mask;
+ mask &= phys_mask;
+
kvm_msr_entry_add(cpu, MSR_MTRRphysBase(i),
env->mtrr_var[i].base);
- kvm_msr_entry_add(cpu, MSR_MTRRphysMask(i),
- env->mtrr_var[i].mask);
+ kvm_msr_entry_add(cpu, MSR_MTRRphysMask(i), mask);
}
}
--
2.7.4
next prev parent reply other threads:[~2016-07-08 15:01 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-08 15:01 [Qemu-devel] [PATCH v4 0/5] x86: Physical address limit patches Dr. David Alan Gilbert (git)
2016-07-08 15:01 ` [Qemu-devel] [PATCH v4 1/5] x86: Provide TCG_PHYS_ADDR_BITS Dr. David Alan Gilbert (git)
2016-07-08 18:44 ` Eduardo Habkost
2016-07-08 15:01 ` [Qemu-devel] [PATCH v4 2/5] x86: Allow physical address bits to be set Dr. David Alan Gilbert (git)
2016-07-08 18:59 ` Eduardo Habkost
2016-07-08 19:24 ` Paolo Bonzini
2016-07-08 19:25 ` Dr. David Alan Gilbert
2016-07-08 19:50 ` Eduardo Habkost
2016-07-08 23:36 ` Eduardo Habkost
2016-07-09 0:59 ` Richard Henderson
2016-07-09 2:36 ` Eduardo Habkost
2016-07-08 15:01 ` Dr. David Alan Gilbert (git) [this message]
2016-07-08 15:01 ` [Qemu-devel] [PATCH v4 4/5] x86: fill high bits of mtrr mask Dr. David Alan Gilbert (git)
2016-07-08 23:07 ` Eduardo Habkost
2016-07-08 15:01 ` [Qemu-devel] [PATCH v4 5/5] x86: Set physical address bits based on host Dr. David Alan Gilbert (git)
2016-07-08 16:34 ` Paolo Bonzini
2016-07-08 23:16 ` Eduardo Habkost
2016-07-11 12:29 ` Dr. David Alan Gilbert
2016-07-11 13:01 ` Eduardo Habkost
2016-07-11 15:39 ` Dr. David Alan Gilbert
2016-07-11 18:42 ` Eduardo Habkost
2016-07-11 18:47 ` Dr. David Alan Gilbert
2016-07-09 0:15 ` [Qemu-devel] [PATCH v4 0/5] x86: Physical address limit patches Eduardo Habkost
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=1467990099-27853-4-git-send-email-dgilbert@redhat.com \
--to=dgilbert@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kraxel@redhat.com \
--cc=marcel@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).