[PATCH v7 077/120] x86/sgx: Use parsed CPUID(0x12)
From: Ahmed S. Darwish
Date: Thu May 28 2026 - 12:24:31 EST
Use parsed CPUID(0x12) instead of doing direct CPUID queries and manually
extracting the fields with bitwise operations.
Remove the subleaf's SGX_CPUID_EPC_INVALID type check since this is already
done by the parser's CPUID(0x12).n read function. cpuid_subleaf_n() just
returns NULL in that case.
Rework sgx_calc_section_metric() to build-up the SGX metric directly from
the passed fields. There is no need for extracting them with GENMASK
operations as this is already handled by the C99 bitfields.
Signed-off-by: Ahmed S. Darwish <darwi@xxxxxxxxxxxxx>
---
arch/x86/kernel/cpu/sgx/main.c | 29 +++++++++++++----------------
1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
index 4505f808af5e..071f034f8b2c 100644
--- a/arch/x86/kernel/cpu/sgx/main.c
+++ b/arch/x86/kernel/cpu/sgx/main.c
@@ -742,14 +742,12 @@ int arch_memory_failure(unsigned long pfn, int flags)
}
/*
- * A section metric is concatenated in a way that @low bits 12-31 define the
- * bits 12-31 of the metric and @high bits 0-19 define the bits 32-51 of the
- * metric.
+ * A section metric is concatenated in a way that @low bits define the bits
+ * 12-31 of the metric and @high bits define the bits 32-51 of the metric.
*/
-static inline u64 __init sgx_calc_section_metric(u64 low, u64 high)
+static inline u64 __init sgx_calc_section_metric(u32 low, u32 high)
{
- return (low & GENMASK_ULL(31, 12)) +
- ((high & GENMASK_ULL(19, 0)) << 32);
+ return ((u64)high << 32) | (low << 12);
}
#ifdef CONFIG_NUMA
@@ -796,29 +794,28 @@ static void __init arch_update_sysfs_visibility(int nid) {}
static bool __init sgx_page_cache_init(void)
{
- u32 eax, ebx, ecx, edx, type;
+ const struct leaf_0x12_n *sl;
u64 pa, size;
int nid;
- int i;
sgx_numa_nodes = kmalloc_objs(*sgx_numa_nodes, num_possible_nodes());
if (!sgx_numa_nodes)
return false;
- for (i = 0; i < ARRAY_SIZE(sgx_epc_sections); i++) {
- cpuid_count(SGX_CPUID, i + SGX_CPUID_EPC, &eax, &ebx, &ecx, &edx);
+ for (int i = 0; i < ARRAY_SIZE(sgx_epc_sections); i++) {
+ u32 subleaf = SGX_CPUID_EPC + i;
- type = eax & SGX_CPUID_EPC_MASK;
- if (type == SGX_CPUID_EPC_INVALID)
+ sl = cpuid_subleaf_n(&boot_cpu_data, 0x12, subleaf);
+ if (!sl)
break;
- if (type != SGX_CPUID_EPC_SECTION) {
- pr_err_once("Unknown EPC section type: %u\n", type);
+ if (sl->subleaf_type != SGX_CPUID_EPC_SECTION) {
+ pr_err_once("Unknown EPC section type: %u\n", sl->subleaf_type);
break;
}
- pa = sgx_calc_section_metric(eax, ebx);
- size = sgx_calc_section_metric(ecx, edx);
+ pa = sgx_calc_section_metric(sl->epc_sec_base_addr_0, sl->epc_sec_base_addr_1);
+ size = sgx_calc_section_metric(sl->epc_sec_size_0, sl->epc_sec_size_1);
pr_info("EPC section 0x%llx-0x%llx\n", pa, pa + size - 1);
--
2.54.0