diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 490a0a7efb3c4b7c7d389708a0d82d2127d44558..f4bd4b9ea42a44e1ad06286d55111a98acd7c6a9 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -21,6 +21,7 @@ extern bool host_cpu_is_intel; extern bool host_cpu_is_amd; +extern bool host_cpu_is_hygon; #define NMI_VECTOR 0x02 @@ -652,6 +653,11 @@ static inline bool this_cpu_is_amd(void) return this_cpu_vendor_string_is("AuthenticAMD"); } +static inline bool this_cpu_is_hygon(void) +{ + return this_cpu_vendor_string_is("HygonGenuine"); +} + static inline uint32_t __this_cpu_has(uint32_t function, uint32_t index, uint8_t reg, uint8_t lo, uint8_t hi) { diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c index 5a035bc2b9c1c0829ee23696b6d22b194565ee2a..3ca4f541280d99e64a372f575c43a718495bf058 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c @@ -22,6 +22,7 @@ vm_vaddr_t exception_handlers; bool host_cpu_is_amd; bool host_cpu_is_intel; +bool host_cpu_is_hygon; static void regs_dump(FILE *stream, struct kvm_regs *regs, uint8_t indent) { @@ -560,6 +561,7 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm) vm_create_irqchip(vm); 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); } struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, @@ -1164,7 +1166,9 @@ 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 || \ + host_cpu_is_hygon), \ + inputs); \ \ r; \ }) @@ -1264,7 +1268,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 && !host_cpu_is_hygon) return max_gfn; /* On parts with <40 physical address bits, the area is fully hidden */ @@ -1309,4 +1313,5 @@ 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(); } diff --git a/tools/testing/selftests/kvm/x86_64/fix_hypercall_test.c b/tools/testing/selftests/kvm/x86_64/fix_hypercall_test.c index 0f728f05ea82f7dc8051ed812cfde79639ae2385..e3561b50705cd13d87a806ca242db50d73e87adb 100644 --- a/tools/testing/selftests/kvm/x86_64/fix_hypercall_test.c +++ b/tools/testing/selftests/kvm/x86_64/fix_hypercall_test.c @@ -51,7 +51,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 || host_cpu_is_hygon) { native_hypercall_insn = svm_vmmcall; other_hypercall_insn = vmx_vmcall; } else { diff --git a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c index 283cc55597a4fe28c02197ea18c269b9294a16b2..2c32ea361fd8c2294ddbcb99fa63a15c75725205 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c @@ -445,6 +445,11 @@ static bool use_amd_pmu(void) is_zen3(family, model)); } +static bool use_hygon_pmu(void) +{ + return host_cpu_is_hygon; +} + /* * "MEM_INST_RETIRED.ALL_LOADS", "MEM_INST_RETIRED.ALL_STORES", and * "MEM_INST_RETIRED.ANY" from https://perfmon-events.intel.com/ @@ -924,7 +929,7 @@ int main(int argc, char *argv[]) TEST_REQUIRE(kvm_has_cap(KVM_CAP_PMU_EVENT_FILTER)); TEST_REQUIRE(kvm_has_cap(KVM_CAP_PMU_EVENT_MASKED_EVENTS)); - TEST_REQUIRE(use_intel_pmu() || use_amd_pmu()); + TEST_REQUIRE(use_intel_pmu() || use_amd_pmu() || use_hygon_pmu()); guest_code = use_intel_pmu() ? intel_guest_code : amd_guest_code; vm = vm_create_with_one_vcpu(&vcpu, guest_code); @@ -934,7 +939,7 @@ int main(int argc, char *argv[]) TEST_REQUIRE(sanity_check_pmu(vcpu)); - if (use_amd_pmu()) + if (use_amd_pmu() || use_hygon_pmu()) test_amd_deny_list(vcpu); test_without_filter(vcpu); @@ -947,7 +952,7 @@ int main(int argc, char *argv[]) supports_event_mem_inst_retired() && kvm_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS) >= 3) vcpu2 = vm_vcpu_add(vm, 2, intel_masked_events_guest_code); - else if (use_amd_pmu()) + else if (use_amd_pmu() || use_hygon_pmu()) vcpu2 = vm_vcpu_add(vm, 2, amd_masked_events_guest_code); if (vcpu2)