On 11/10/20 8:21 AM, Yu-cheng Yu wrote: > Control-flow Enforcement Technology (CET) adds five MSRs. Introduce > them and their XSAVES supervisor states: > > MSR_IA32_U_CET (user-mode CET settings), > MSR_IA32_PL3_SSP (user-mode Shadow Stack pointer), > MSR_IA32_PL0_SSP (kernel-mode Shadow Stack pointer), > MSR_IA32_PL1_SSP (Privilege Level 1 Shadow Stack pointer), > MSR_IA32_PL2_SSP (Privilege Level 2 Shadow Stack pointer). This patch goes into a bunch of XSAVE work that this changelog only briefly touches on. I think it needs to be beefed up a bit. > @@ -835,8 +843,19 @@ void __init fpu__init_system_xstate(void) > * Clear XSAVE features that are disabled in the normal CPUID. > */ > for (i = 0; i < ARRAY_SIZE(xsave_cpuid_features); i++) { > - if (!boot_cpu_has(xsave_cpuid_features[i])) > - xfeatures_mask_all &= ~BIT_ULL(i); > + if (xsave_cpuid_features[i] == X86_FEATURE_SHSTK) { > + /* > + * X86_FEATURE_SHSTK and X86_FEATURE_IBT share > + * same states, but can be enabled separately. > + */ > + if (!boot_cpu_has(X86_FEATURE_SHSTK) && > + !boot_cpu_has(X86_FEATURE_IBT)) > + xfeatures_mask_all &= ~BIT_ULL(i); > + } else { > + if ((xsave_cpuid_features[i] == -1) || Where did the -1 come from? Was that introduced earlier in this series? I don't see any way a xsave_cpuid_features[] can be -1 in the current tree. > + !boot_cpu_has(xsave_cpuid_features[i])) > + xfeatures_mask_all &= ~BIT_ULL(i); > + } > } Do we have any other spots in the kernel where we care about: boot_cpu_has(X86_FEATURE_SHSTK) || boot_cpu_has(X86_FEATURE_IBT) ? If so, we could also address this by declaring a software-defined X86_FEATURE_CET and then setting it if SHSTK||IBT is supported, then we just put that one feature in xsave_cpuid_features[]. I'm also not crazy about the loop as it is. I'd much rather see this in a helper like: bool cpu_supports_xsave_deps(int xfeature) { bool ret; ret = boot_cpu_has(xsave_cpuid_features[xfeature]) /* * X86_FEATURE_SHSTK is checked in xsave_cpuid_features() * but the CET states are needed if either SHSTK or IBT are * available. */ if (xfeature == XFEATURE_CET_USER || xfeature == XFEATURE_CET_KERNEL) ret |= boot_cpu_has(X86_FEATURE_IBT) return ret; } See how that's extensible? You can add as many special cases as you want.