From: Sean Christopherson <seanjc@google.com>
To: Jim Mattson <jmattson@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Thomas Gleixner <tglx@kernel.org>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
kvm@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
Yosry Ahmed <yosry@kernel.org>
Subject: Re: [PATCH v7 9/9] KVM: selftests: nSVM: Add svm_nested_pat test
Date: Mon, 6 Apr 2026 17:07:45 -0700 [thread overview]
Message-ID: <adRK0dyF9QAsZyVz@google.com> (raw)
In-Reply-To: <20260327234023.2659476-10-jmattson@google.com>
On Fri, Mar 27, 2026, Jim Mattson wrote:
> When KVM_X86_QUIRK_NESTED_SVM_SHARED_PAT is disabled, verify that KVM
> correctly virtualizes the host PAT MSR and the guest PAT register for
> nested SVM guests.
>
> With nested NPT disabled:
> * L1 and L2 share the same PAT
> * The vmcb12.g_pat is ignored
>
> With nested NPT enabled:
> * An invalid g_pat in vmcb12 causes VMEXIT_INVALID
> * RDMSR(IA32_PAT) from L2 returns the value of the guest PAT register
> * WRMSR(IA32_PAT) from L2 is reflected in vmcb12's g_pat on VMEXIT
> * RDMSR(IA32_PAT) from L1 returns the value of the host PAT MSR
> * Save/restore with the vCPU in guest mode preserves both hPAT and gPAT
>
> Signed-off-by: Jim Mattson <jmattson@google.com>
> ---
> tools/arch/x86/include/uapi/asm/kvm.h | 2 +
Don't update uAPI headers in tools/, they're not used by KVM selftests (perf
folks will sync them as needed).
> +#define PAT_DEFAULT 0x0007040600070406ULL
> +#define L1_PAT_VALUE 0x0007040600070404ULL /* Change PA0 to WT */
> +#define L2_VMCB12_PAT 0x0606060606060606ULL /* All WB */
> +#define L2_PAT_MODIFIED 0x0606060606060604ULL /* Change PA0 to WT */
> +#define INVALID_PAT_VALUE 0x0808080808080808ULL /* 8 is reserved */
> +
> +/*
> + * Shared state between L1 and L2 for verification.
> + */
> +struct pat_test_data {
> + uint64_t l2_pat_read;
> + uint64_t l2_pat_after_write;
> + uint64_t l1_pat_after_vmexit;
> + uint64_t vmcb12_gpat_after_exit;
> + bool l2_done;
> +};
> +
> +static struct pat_test_data *pat_data;
This is ridiculous. Whatever AI you're using is reinventing sync_global_to_guest()
in a very obfuscated way. Drop the indirection along with the params and the
full page allocation, and just sync the damn struct.
Actually, this is even dumber than that. The "data" is only ever accessed from
within the guest; it's used to pass info between L1 and L2. Drop the struct
entirely and just write global variables.
In general, please clean this test up before submitting v8. All of the L2 code
is basically copy+paste of itself. This is the second vibe coded selftest (AFAIK)
you've posted, and it has many of the same flaws as the first one[*]. While I'm
not opposed to using fancy tools, and the bar is generally lower for selftests,
the code still needs to be readable and maintainable. This ain't.
[*] https://lore.kernel.org/all/aXJal3srw2-3J5Dm@google.com
> +static void l2_guest_code(void)
> +{
> + pat_data->l2_pat_read = rdmsr(MSR_IA32_CR_PAT);
> + wrmsr(MSR_IA32_CR_PAT, L2_PAT_MODIFIED);
> + pat_data->l2_pat_after_write = rdmsr(MSR_IA32_CR_PAT);
> + pat_data->l2_done = true;
> + vmmcall();
> +}
...
> +static void run_test(void *l1_code, const char *test_name, bool npt_enabled,
> + bool do_save_restore)
> +{
> + struct pat_test_data *data_hva;
> + vm_vaddr_t svm_gva, data_gva;
> + struct kvm_x86_state *state;
> + struct kvm_vcpu *vcpu;
> + struct kvm_vm *vm;
> + struct ucall uc;
> +
> + pr_info("Testing: %s\n", test_name);
> +
> + vm = vm_create_with_one_vcpu(&vcpu, l1_code);
> + vm_enable_cap(vm, KVM_CAP_DISABLE_QUIRKS2,
> + KVM_X86_QUIRK_NESTED_SVM_SHARED_PAT);
> + if (npt_enabled)
> + vm_enable_npt(vm);
> +
> + vcpu_alloc_svm(vm, &svm_gva);
> +
> + data_gva = vm_vaddr_alloc_page(vm);
> + data_hva = addr_gva2hva(vm, data_gva);
> + memset(data_hva, 0, sizeof(*data_hva));
Ugh.
> +
> + if (npt_enabled)
> + tdp_identity_map_default_memslots(vm);
> +
> + vcpu_args_set(vcpu, 2, svm_gva, data_gva);
next prev parent reply other threads:[~2026-04-07 0:07 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-27 23:40 [PATCH v7 0/9] KVM: x86: nSVM: Improve PAT virtualization Jim Mattson
2026-03-27 23:40 ` [PATCH v7 1/9] KVM: x86: Define KVM_X86_QUIRK_NESTED_SVM_SHARED_PAT Jim Mattson
2026-03-30 7:49 ` kernel test robot
2026-04-02 19:39 ` Jim Mattson
2026-04-02 20:26 ` Yosry Ahmed
2026-04-06 23:27 ` Sean Christopherson
2026-03-27 23:40 ` [PATCH v7 2/9] KVM: x86: nSVM: Clear VMCB_NPT clean bit when updating hPAT from guest mode Jim Mattson
2026-03-27 23:40 ` [PATCH v7 3/9] KVM: x86: nSVM: Cache and validate vmcb12 g_pat Jim Mattson
2026-03-27 23:40 ` [PATCH v7 4/9] KVM: x86: nSVM: Set vmcb02.g_pat correctly for nested NPT Jim Mattson
2026-03-27 23:40 ` [PATCH v7 5/9] KVM: x86: nSVM: Redirect IA32_PAT accesses to either hPAT or gPAT Jim Mattson
2026-04-06 23:45 ` Sean Christopherson
2026-03-27 23:40 ` [PATCH v7 6/9] KVM: x86: nSVM: Save gPAT to vmcb12.g_pat on VMEXIT Jim Mattson
2026-03-27 23:40 ` [PATCH v7 7/9] KVM: Documentation: document KVM_{GET,SET}_NESTED_STATE for SVM Jim Mattson
2026-03-27 23:40 ` [PATCH v7 8/9] KVM: x86: nSVM: Save/restore gPAT with KVM_{GET,SET}_NESTED_STATE Jim Mattson
2026-04-06 23:47 ` Sean Christopherson
2026-04-07 3:08 ` Jim Mattson
2026-03-27 23:40 ` [PATCH v7 9/9] KVM: selftests: nSVM: Add svm_nested_pat test Jim Mattson
2026-04-07 0:07 ` Sean Christopherson [this message]
2026-04-07 3:58 ` Jim Mattson
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=adRK0dyF9QAsZyVz@google.com \
--to=seanjc@google.com \
--cc=bp@alien8.de \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=skhan@linuxfoundation.org \
--cc=tglx@kernel.org \
--cc=x86@kernel.org \
--cc=yosry@kernel.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