[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f46b9ea8-beb7-4957-a1c4-694e0099f421@163.com>
Date: Tue, 10 Feb 2026 17:04:02 +0800
From: Zhiquan Li <zhiquan_li@....com>
To: Sean Christopherson <seanjc@...gle.com>
Cc: pbonzini@...hat.com, shuah@...nel.org, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH RESEND 2/5] KVM: x86: selftests: Alter the instruction of
hypercall on Hygon
On 2/10/26 00:37, Sean Christopherson wrote:
> Rather than play a constant game of whack-a-mole and end up with a huge number of
> "host_cpu_is_amd || host_cpu_is_hygon" checks, I would prefer to add (in addition
> to host_cpu_is_hygon) a "host_cpu_is_amd_compatible" flag.
>
> E.g. slotted in after patch 1, something like this:
>
Many thanks, Sean!
Let me put these into patch 2, and patch 3 can be dropped.
Best Regards,
Zhiquan
> ---
> tools/testing/selftests/kvm/include/x86/processor.h | 1 +
> tools/testing/selftests/kvm/lib/x86/processor.c | 8 ++++++--
> tools/testing/selftests/kvm/x86/fix_hypercall_test.c | 2 +-
> tools/testing/selftests/kvm/x86/msrs_test.c | 2 +-
> tools/testing/selftests/kvm/x86/xapic_state_test.c | 2 +-
> 5 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/
> testing/selftests/kvm/include/x86/processor.h
> index 1338de7111e7..40e3deb64812 100644
> --- a/tools/testing/selftests/kvm/include/x86/processor.h
> +++ b/tools/testing/selftests/kvm/include/x86/processor.h
> @@ -22,6 +22,7 @@
> extern bool host_cpu_is_intel;
> extern bool host_cpu_is_amd;
> extern bool host_cpu_is_hygon;
> +extern bool host_cpu_is_amd_compatible;
> extern uint64_t guest_tsc_khz;
>
> #ifndef MAX_NR_CPUID_ENTRIES
> diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/
> selftests/kvm/lib/x86/processor.c
> index f6b1c5324931..7b7fd2ad148f 100644
> --- a/tools/testing/selftests/kvm/lib/x86/processor.c
> +++ b/tools/testing/selftests/kvm/lib/x86/processor.c
> @@ -24,6 +24,7 @@ vm_vaddr_t exception_handlers;
> bool host_cpu_is_amd;
> bool host_cpu_is_intel;
> bool host_cpu_is_hygon;
> +bool host_cpu_is_amd_compatible;
> bool is_forced_emulation_enabled;
> uint64_t guest_tsc_khz;
>
> @@ -794,6 +795,7 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm, unsigned int nr_vcpus)
> sync_global_to_guest(vm, host_cpu_is_intel);
> sync_global_to_guest(vm, host_cpu_is_amd);
> sync_global_to_guest(vm, host_cpu_is_hygon);
> + sync_global_to_guest(vm, host_cpu_is_amd_compatible);
> sync_global_to_guest(vm, is_forced_emulation_enabled);
> sync_global_to_guest(vm, pmu_errata_mask);
>
> @@ -1350,7 +1352,8 @@ const struct kvm_cpuid_entry2 *get_cpuid_entry(const struct kvm_cpuid2 *cpuid,
> "1: vmmcall\n\t" \
> "2:" \
> : "=a"(r) \
> - : [use_vmmcall] "r" (host_cpu_is_amd), inputs); \
> + : [use_vmmcall] "r" (host_cpu_is_amd_compatible), \
> + inputs); \
> \
> r; \
> })
> @@ -1391,7 +1394,7 @@ unsigned long vm_compute_max_gfn(struct kvm_vm *vm)
> max_gfn = (1ULL << (guest_maxphyaddr - vm->page_shift)) - 1;
>
> /* Avoid reserved HyperTransport region on AMD processors. */
> - if (!host_cpu_is_amd)
> + if (!host_cpu_is_amd_compatible)
> return max_gfn;
>
> /* On parts with <40 physical address bits, the area is fully hidden */
> @@ -1427,6 +1430,7 @@ void kvm_selftest_arch_init(void)
> host_cpu_is_intel = this_cpu_is_intel();
> host_cpu_is_amd = this_cpu_is_amd();
> host_cpu_is_hygon = this_cpu_is_hygon();
> + host_cpu_is_amd_compatible = host_cpu_is_amd || host_cpu_is_hygon;
> is_forced_emulation_enabled = kvm_is_forced_emulation_enabled();
>
> kvm_init_pmu_errata();
> diff --git a/tools/testing/selftests/kvm/x86/fix_hypercall_test.c b/tools/
> testing/selftests/kvm/x86/fix_hypercall_test.c
> index 762628f7d4ba..00b6e85735dd 100644
> --- a/tools/testing/selftests/kvm/x86/fix_hypercall_test.c
> +++ b/tools/testing/selftests/kvm/x86/fix_hypercall_test.c
> @@ -52,7 +52,7 @@ static void guest_main(void)
> if (host_cpu_is_intel) {
> native_hypercall_insn = vmx_vmcall;
> other_hypercall_insn = svm_vmmcall;
> - } else if (host_cpu_is_amd) {
> + } else if (host_cpu_is_amd_compatible) {
> native_hypercall_insn = svm_vmmcall;
> other_hypercall_insn = vmx_vmcall;
> } else {
> diff --git a/tools/testing/selftests/kvm/x86/msrs_test.c b/tools/testing/
> selftests/kvm/x86/msrs_test.c
> index 40d918aedce6..4c97444fdefe 100644
> --- a/tools/testing/selftests/kvm/x86/msrs_test.c
> +++ b/tools/testing/selftests/kvm/x86/msrs_test.c
> @@ -81,7 +81,7 @@ static u64 fixup_rdmsr_val(u32 msr, u64 want)
> * is supposed to emulate that behavior based on guest vendor model
> * (which is the same as the host vendor model for this test).
> */
> - if (!host_cpu_is_amd)
> + if (!host_cpu_is_amd_compatible)
> return want;
>
> switch (msr) {
> diff --git a/tools/testing/selftests/kvm/x86/xapic_state_test.c b/tools/testing/
> selftests/kvm/x86/xapic_state_test.c
> index 3b4814c55722..0c5e12f5f14e 100644
> --- a/tools/testing/selftests/kvm/x86/xapic_state_test.c
> +++ b/tools/testing/selftests/kvm/x86/xapic_state_test.c
> @@ -248,7 +248,7 @@ int main(int argc, char *argv[])
> * drops writes, AMD does not). Account for the errata when checking
> * that KVM reads back what was written.
> */
> - x.has_xavic_errata = host_cpu_is_amd &&
> + x.has_xavic_errata = host_cpu_is_amd_compatible &&
> get_kvm_amd_param_bool("avic");
>
> vcpu_clear_cpuid_feature(x.vcpu, X86_FEATURE_X2APIC);
>
> base-commit: 391774310e7309b5a1ee12fac9264e95b1d4a6ee
> --
Powered by blists - more mailing lists