[PATCH v7 051/120] x86/microcode/amd: rdrand: Use standard CPUID(0x1) types
From: Ahmed S. Darwish
Date: Thu May 28 2026 - 11:54:36 EST
Use standard CPUID(0x1) types from x86-cpuid-db instead of doing manual
bitwise operations.
Keep using a direct CPUID query, instead of the CPUID parser API. At a
later step, clearing a feature bit like X86_FEATURE_RDRAND will also clear
its cached backing CPUID bit, while the code clearly mentions that it wants
to query the CPUID state regardless of the X86_FEATURE_RDRAND bit state.
Signed-off-by: Ahmed S. Darwish <darwi@xxxxxxxxxxxxx>
---
arch/x86/kernel/cpu/amd.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 0e077a4f2646..5f885fafa238 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -807,6 +807,8 @@ early_param("rdrand", rdrand_cmdline);
static void clear_rdrand_cpuid_bit(struct cpuinfo_x86 *c)
{
+ struct leaf_0x1_0 l1;
+
/*
* Saving of the MSR used to hide the RDRAND support during
* suspend/resume is done by arch/x86/power/cpu.c, which is
@@ -819,7 +821,8 @@ static void clear_rdrand_cpuid_bit(struct cpuinfo_x86 *c)
* The self-test can clear X86_FEATURE_RDRAND, so check for
* RDRAND support using the CPUID function directly.
*/
- if (!(cpuid_ecx(1) & BIT(30)) || rdrand_force)
+ cpuid_read(0x1, &l1);
+ if (!l1.rdrand || rdrand_force)
return;
msr_clear_bit(MSR_AMD64_CPUID_FN_1, 62);
@@ -828,7 +831,8 @@ static void clear_rdrand_cpuid_bit(struct cpuinfo_x86 *c)
* Verify that the CPUID change has occurred in case the kernel is
* running virtualized and the hypervisor doesn't support the MSR.
*/
- if (cpuid_ecx(1) & BIT(30)) {
+ cpuid_read(0x1, &l1);
+ if (l1.rdrand) {
pr_info_once("BIOS may not properly restore RDRAND after suspend, but hypervisor does not support hiding RDRAND via CPUID.\n");
return;
}
--
2.54.0