[PATCH v3 10/10] target/i386: Use AMD ucode-rev default for Hygon
Tina Zhang <[email protected]>
| Newsgroups | org.kernel.vger.kvm,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
QEMU currently gives named Hygon Dhyana CPUs the non-AMD default ucode-rev value, 0x100000000. That is the Intel/KVM-VMX-shaped encoding, where the visible revision is in the high 32 bits. Linux reads MSR 0x8b for Hygon CPUs through the AMD patch-level path, using MSR_AMD64_PATCH_LEVEL and storing the low 32 bits as cpuinfo_x86.microcode. With the old QEMU default, a Dhyana guest sees microcode revision 0. Use the AMD/KVM-SVM-shaped default, 0x01000065, for Hygon on this specific MSR 0x8b default path. This does not route Hygon through AMD microcode loading and does not claim that Hygon CPUs are otherwise identical to AMD CPUs. Preserve migration ABI through the vendor CPU ABI compatibility gate used by this Hygon bug-fix group. pc-11.1 and older machine types leave that gate off, so they retain the previous ucode-rev default. Explicit user-provided ucode-rev values still override the default. Add qtest coverage for the new default, the compatibility cases, and an explicit user override. Signed-off-by: Tina Zhang <[email protected]> Reviewed-by: Zhao Liu <[email protected]> --- target/i386/cpu.c | 3 ++- tests/qtest/test-x86-cpuid-compat.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index f65a5b32bc..0630cfd8b2 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -10222,7 +10222,8 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) * needs to happen after the evenual setting of ucode_rev in * accel-specific code in cpu_common_realize. */ - if (IS_AMD_CPU(env)) { + if (IS_AMD_CPU(env) || + (IS_HYGON_CPU(env) && cpu->hygon_vendor_abi_fixes)) { cpu->ucode_rev = 0x01000065; } else { cpu->ucode_rev = 0x100000000ULL; diff --git a/tests/qtest/test-x86-cpuid-compat.c b/tests/qtest/test-x86-cpuid-compat.c index 44d4631cd6..13c9ddb4db 100644 --- a/tests/qtest/test-x86-cpuid-compat.c +++ b/tests/qtest/test-x86-cpuid-compat.c @@ -404,6 +404,25 @@ static const CpuidTestArgs cpuid_tests[] = { "486", "xlevel2=0xC0000002,xstore=on", NULL, "xlevel2", 0xC0000002, }, + { + "x86/cpuid/props/dhyana/ucode-rev/default", + "Dhyana", NULL, NULL, "ucode-rev", 0x01000065, + }, + { + "x86/cpuid/props/dhyana/ucode-rev/compat-off", + "Dhyana", "x-hygon-vendor-abi-fixes=off", NULL, + "ucode-rev", 0x100000000LL, + }, + { + "x86/cpuid/props/dhyana/ucode-rev/pc-i440fx-11.1", + "Dhyana", NULL, "pc-i440fx-11.1", + "ucode-rev", 0x100000000LL, + }, + { + "x86/cpuid/props/dhyana/ucode-rev/user", + "Dhyana", "ucode-rev=0x12345678", NULL, + "ucode-rev", 0x12345678, + }, }; /* -- 2.43.7