From 3fb86f96c436090d401215703a7302118eef94f0 Mon Sep 17 00:00:00 2001 From: Qi Zheng Date: Thu, 16 Nov 2023 13:05:33 +0800 Subject: [PATCH] [libos] Update cpuid leaf table --- src/libos/src/exception/cpuid.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/libos/src/exception/cpuid.rs b/src/libos/src/exception/cpuid.rs index 17718092..dac435cb 100644 --- a/src/libos/src/exception/cpuid.rs +++ b/src/libos/src/exception/cpuid.rs @@ -57,6 +57,7 @@ impl CpuIdCache { fn generate_cpuid_cache(&mut self, max_basic_leaf: u32, max_extend_leaf: u32) { let mut sgx_support: bool = false; + let mut pconfig_support: bool = false; // Generate basic leaf cpuid cache for leaf in CPUID_MIN_BASIC_LEAF..=max_basic_leaf { // Intel SGX Capability Enumeration Leaf, @@ -64,6 +65,11 @@ impl CpuIdCache { if leaf == 0x12 && !sgx_support { continue; } + // Intel PCONFIG Enumeration Leaf, + // Leaf 1BH is supported if CPUID.(EAX=07H, ECX=0H):EDX[18] = 1. + if leaf == 0x1B && !pconfig_support { + continue; + } let mut max_subleaf = 0; for subleaf in (0..) { let cpuid_input = CpuIdInput { leaf, subleaf }; @@ -96,13 +102,15 @@ impl CpuIdCache { 0xD => 63, // (Sub-leaf == 0) can not decide max_subleaf for these leaf, // later match expression will decide the max_subleaf. - 0x4 | 0xB | 0x12 | 0x1F => CPUID_MAX_SUBLEAF, + 0x4 | 0xB | 0x12 | 0x1B | 0x1F => CPUID_MAX_SUBLEAF, // Default max_subleaf is 0. _ => 0, }; if leaf == 0x7 { // EBX Bit 02: Supports IntelĀ® SGX Extensions if 1. sgx_support = (cpuid_result.ebx & 0x0000_0004) != 0; + // EDX Bit 18: Supports PCONFIG if 1. + pconfig_support = (cpuid_result.edx & 0x40000) != 0; } } // These leafs determine the maximum supported sub-leaf according to @@ -120,6 +128,9 @@ impl CpuIdCache { // EAX Bit 03 - 00: Sub-leaf Type. // 0000b: Indicates this sub-leaf is invalid. 0x12 if subleaf >= 2 && (cpuid_result.eax & 0x0000000F) == 0 => subleaf, + // If a sub-leaf type (EAX) is 0, the sub-leaf is invalid and zero is returned + // in EBX, ECX, and EDX. + 0x1B if (cpuid_result.eax == 0) => subleaf, // V2 Extended Topology Enumeration Leaf // CPUID leaf 0x1F is a preferred superset to leaf 0xB. 0x1F if (cpuid_result.ecx & 0x0000_FF00) == 0 => subleaf, @@ -214,8 +225,9 @@ lazy_static! { } fn is_cpuid_leaf_has_subleaves(leaf: u32) -> bool { - const CPUID_LEAF_WITH_SUBLEAF: [u32; 11] = - [0x4, 0x7, 0xB, 0xD, 0xF, 0x10, 0x12, 0x14, 0x17, 0x18, 0x1F]; + const CPUID_LEAF_WITH_SUBLEAF: [u32; 12] = [ + 0x4, 0x7, 0xB, 0xD, 0xF, 0x10, 0x12, 0x14, 0x17, 0x18, 0x1B, 0x1F, + ]; CPUID_LEAF_WITH_SUBLEAF.contains(&leaf) }