From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, likexu@tencent.com
Subject: Re: [PATCH kvm-unit-tests] x86: do not overwrite bits 7 and 12 of MSR_IA32_MISC_ENABLE
Date: Thu, 16 Jun 2022 18:30:26 +0000 [thread overview]
Message-ID: <Yqt2wlBKqsoOH0Y4@google.com> (raw)
In-Reply-To: <20220520183207.7952-1-pbonzini@redhat.com>
On Fri, May 20, 2022, Paolo Bonzini wrote:
> Bits 7 and 12 of MSR_IA32_MISC_ENABLE represent the configuration of the
> vPMU, and latest KVM does not allow the guest to modify them. Adjust
> kvm-unit-tests to avoid failures.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> x86/msr.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/x86/msr.c b/x86/msr.c
> index 44fbb3b..2eb928c 100644
> --- a/x86/msr.c
> +++ b/x86/msr.c
> @@ -19,6 +19,7 @@ struct msr_info {
> bool is_64bit_only;
> const char *name;
> unsigned long long value;
> + unsigned long long keep;
> };
>
>
> @@ -27,6 +28,8 @@ struct msr_info {
>
> #define MSR_TEST(msr, val, only64) \
> { .index = msr, .name = #msr, .value = val, .is_64bit_only = only64 }
> +#define MSR_TEST_RO_BITS(msr, val, only64, ro) \
Heh, I wrote pretty much this exact patch before I saw your version.
> + { .index = msr, .name = #msr, .value = val, .is_64bit_only = only64, .keep = ro }
What if we omit @only64 and hardcode it false, and add separate macros for the
"64-bit only" MSRS? Then there are fewer magic booleans in the code. Prep patch
at the bottom. With that, this becomes:
#define MSR_TEST_RO_BITS(msr, val, ro) __MSR_TEST(msr, val, false, ro)
> struct msr_info msr_info[] =
> {
> @@ -34,7 +37,8 @@ struct msr_info msr_info[] =
> MSR_TEST(MSR_IA32_SYSENTER_ESP, addr_ul, false),
> MSR_TEST(MSR_IA32_SYSENTER_EIP, addr_ul, false),
> // reserved: 1:2, 4:6, 8:10, 13:15, 17, 19:21, 24:33, 35:63
> - MSR_TEST(MSR_IA32_MISC_ENABLE, 0x400c51889, false),
> + // read-only: 7, 12
> + MSR_TEST_RO_BITS(MSR_IA32_MISC_ENABLE, 0x400c50809, false, 0x1080),
Bit 11, "BTS Unavailable", is also read-only. I would also strongly prefer that
this use BIT(7) | BIT(11) | BIT(12). Maybe someday we can pull in msr-index.h...
> MSR_TEST(MSR_IA32_CR_PAT, 0x07070707, false),
> MSR_TEST(MSR_FS_BASE, addr_64, true),
> MSR_TEST(MSR_GS_BASE, addr_64, true),
> @@ -59,6 +63,8 @@ static void test_msr_rw(struct msr_info *msr, unsigned long long val)
> */
> if (msr->index == MSR_EFER)
> val |= orig;
> + else
> + val = (val & ~msr->keep) | (orig & msr->keep);
Use MSR_TEST_RO_BITS() for MSR_EFER and the special case goes away.
MSR_TEST_RO_BITS(MSR_EFER, EFER_SCE, ~EFER_SCE),
--
From: Sean Christopherson <seanjc@google.com>
Date: Fri, 10 Jun 2022 12:44:01 -0700
Subject: [PATCH] x86/msr: Add dedicated macros to handle MSRs that are 64-bit
only
Add a separate macro for handling 64-bit only MSRs to minimize churn and
copy+paste in a future commit that will add support for read-only bits.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
x86/msr.c | 29 ++++++++++++++++-------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/x86/msr.c b/x86/msr.c
index 44fbb3b2..5f2ad8d6 100644
--- a/x86/msr.c
+++ b/x86/msr.c
@@ -25,24 +25,27 @@ struct msr_info {
#define addr_64 0x0000123456789abcULL
#define addr_ul (unsigned long)addr_64
-#define MSR_TEST(msr, val, only64) \
+#define __MSR_TEST(msr, val, only64) \
{ .index = msr, .name = #msr, .value = val, .is_64bit_only = only64 }
+#define MSR_TEST(msr, val) __MSR_TEST(msr, val, false)
+#define MSR_TEST_ONLY64(msr, val) __MSR_TEST(msr, val, true)
+
struct msr_info msr_info[] =
{
- MSR_TEST(MSR_IA32_SYSENTER_CS, 0x1234, false),
- MSR_TEST(MSR_IA32_SYSENTER_ESP, addr_ul, false),
- MSR_TEST(MSR_IA32_SYSENTER_EIP, addr_ul, false),
+ MSR_TEST(MSR_IA32_SYSENTER_CS, 0x1234),
+ MSR_TEST(MSR_IA32_SYSENTER_ESP, addr_ul),
+ MSR_TEST(MSR_IA32_SYSENTER_EIP, addr_ul),
// reserved: 1:2, 4:6, 8:10, 13:15, 17, 19:21, 24:33, 35:63
- MSR_TEST(MSR_IA32_MISC_ENABLE, 0x400c51889, false),
- MSR_TEST(MSR_IA32_CR_PAT, 0x07070707, false),
- MSR_TEST(MSR_FS_BASE, addr_64, true),
- MSR_TEST(MSR_GS_BASE, addr_64, true),
- MSR_TEST(MSR_KERNEL_GS_BASE, addr_64, true),
- MSR_TEST(MSR_EFER, EFER_SCE, false),
- MSR_TEST(MSR_LSTAR, addr_64, true),
- MSR_TEST(MSR_CSTAR, addr_64, true),
- MSR_TEST(MSR_SYSCALL_MASK, 0xffffffff, true),
+ MSR_TEST(MSR_IA32_MISC_ENABLE, 0x400c51889),
+ MSR_TEST(MSR_IA32_CR_PAT, 0x07070707),
+ MSR_TEST_ONLY64(MSR_FS_BASE, addr_64),
+ MSR_TEST_ONLY64(MSR_GS_BASE, addr_64),
+ MSR_TEST_ONLY64(MSR_KERNEL_GS_BASE, addr_64),
+ MSR_TEST(MSR_EFER, EFER_SCE),
+ MSR_TEST_ONLY64(MSR_LSTAR, addr_64),
+ MSR_TEST_ONLY64(MSR_CSTAR, addr_64),
+ MSR_TEST_ONLY64(MSR_SYSCALL_MASK, 0xffffffff),
// MSR_IA32_DEBUGCTLMSR needs svm feature LBRV
// MSR_VM_HSAVE_PA only AMD host
};
base-commit: 2eed0bf1096077144cc3a0dd9974689487f9511a
--
prev parent reply other threads:[~2022-06-16 18:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-20 18:32 [PATCH kvm-unit-tests] x86: do not overwrite bits 7 and 12 of MSR_IA32_MISC_ENABLE Paolo Bonzini
2022-06-16 18:30 ` Sean Christopherson [this message]
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=Yqt2wlBKqsoOH0Y4@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=likexu@tencent.com \
--cc=pbonzini@redhat.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.