Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: GPL-2.0
0002 
0003 =================
0004 x86 Feature Flags
0005 =================
0006 
0007 Introduction
0008 ============
0009 
0010 On x86, flags appearing in /proc/cpuinfo have an X86_FEATURE definition
0011 in arch/x86/include/asm/cpufeatures.h. If the kernel cares about a feature
0012 or KVM want to expose the feature to a KVM guest, it can and should have
0013 an X86_FEATURE_* defined. These flags represent hardware features as
0014 well as software features.
0015 
0016 If users want to know if a feature is available on a given system, they
0017 try to find the flag in /proc/cpuinfo. If a given flag is present, it
0018 means that the kernel supports it and is currently making it available.
0019 If such flag represents a hardware feature, it also means that the
0020 hardware supports it.
0021 
0022 If the expected flag does not appear in /proc/cpuinfo, things are murkier.
0023 Users need to find out the reason why the flag is missing and find the way
0024 how to enable it, which is not always easy. There are several factors that
0025 can explain missing flags: the expected feature failed to enable, the feature
0026 is missing in hardware, platform firmware did not enable it, the feature is
0027 disabled at build or run time, an old kernel is in use, or the kernel does
0028 not support the feature and thus has not enabled it. In general, /proc/cpuinfo
0029 shows features which the kernel supports. For a full list of CPUID flags
0030 which the CPU supports, use tools/arch/x86/kcpuid.
0031 
0032 How are feature flags created?
0033 ==============================
0034 
0035 a: Feature flags can be derived from the contents of CPUID leaves.
0036 ------------------------------------------------------------------
0037 These feature definitions are organized mirroring the layout of CPUID
0038 leaves and grouped in words with offsets as mapped in enum cpuid_leafs
0039 in cpufeatures.h (see arch/x86/include/asm/cpufeatures.h for details).
0040 If a feature is defined with a X86_FEATURE_<name> definition in
0041 cpufeatures.h, and if it is detected at run time, the flags will be
0042 displayed accordingly in /proc/cpuinfo. For example, the flag "avx2"
0043 comes from X86_FEATURE_AVX2 in cpufeatures.h.
0044 
0045 b: Flags can be from scattered CPUID-based features.
0046 ----------------------------------------------------
0047 Hardware features enumerated in sparsely populated CPUID leaves get
0048 software-defined values. Still, CPUID needs to be queried to determine
0049 if a given feature is present. This is done in init_scattered_cpuid_features().
0050 For instance, X86_FEATURE_CQM_LLC is defined as 11*32 + 0 and its presence is
0051 checked at runtime in the respective CPUID leaf [EAX=f, ECX=0] bit EDX[1].
0052 
0053 The intent of scattering CPUID leaves is to not bloat struct
0054 cpuinfo_x86.x86_capability[] unnecessarily. For instance, the CPUID leaf
0055 [EAX=7, ECX=0] has 30 features and is dense, but the CPUID leaf [EAX=7, EAX=1]
0056 has only one feature and would waste 31 bits of space in the x86_capability[]
0057 array. Since there is a struct cpuinfo_x86 for each possible CPU, the wasted
0058 memory is not trivial.
0059 
0060 c: Flags can be created synthetically under certain conditions for hardware features.
0061 -------------------------------------------------------------------------------------
0062 Examples of conditions include whether certain features are present in
0063 MSR_IA32_CORE_CAPS or specific CPU models are identified. If the needed
0064 conditions are met, the features are enabled by the set_cpu_cap or
0065 setup_force_cpu_cap macros. For example, if bit 5 is set in MSR_IA32_CORE_CAPS,
0066 the feature X86_FEATURE_SPLIT_LOCK_DETECT will be enabled and
0067 "split_lock_detect" will be displayed. The flag "ring3mwait" will be
0068 displayed only when running on INTEL_FAM6_XEON_PHI_[KNL|KNM] processors.
0069 
0070 d: Flags can represent purely software features.
0071 ------------------------------------------------
0072 These flags do not represent hardware features. Instead, they represent a
0073 software feature implemented in the kernel. For example, Kernel Page Table
0074 Isolation is purely software feature and its feature flag X86_FEATURE_PTI is
0075 also defined in cpufeatures.h.
0076 
0077 Naming of Flags
0078 ===============
0079 
0080 The script arch/x86/kernel/cpu/mkcapflags.sh processes the
0081 #define X86_FEATURE_<name> from cpufeatures.h and generates the
0082 x86_cap/bug_flags[] arrays in kernel/cpu/capflags.c. The names in the
0083 resulting x86_cap/bug_flags[] are used to populate /proc/cpuinfo. The naming
0084 of flags in the x86_cap/bug_flags[] are as follows:
0085 
0086 a: The name of the flag is from the string in X86_FEATURE_<name> by default.
0087 ----------------------------------------------------------------------------
0088 By default, the flag <name> in /proc/cpuinfo is extracted from the respective
0089 X86_FEATURE_<name> in cpufeatures.h. For example, the flag "avx2" is from
0090 X86_FEATURE_AVX2.
0091 
0092 b: The naming can be overridden.
0093 --------------------------------
0094 If the comment on the line for the #define X86_FEATURE_* starts with a
0095 double-quote character (""), the string inside the double-quote characters
0096 will be the name of the flags. For example, the flag "sse4_1" comes from
0097 the comment "sse4_1" following the X86_FEATURE_XMM4_1 definition.
0098 
0099 There are situations in which overriding the displayed name of the flag is
0100 needed. For instance, /proc/cpuinfo is a userspace interface and must remain
0101 constant. If, for some reason, the naming of X86_FEATURE_<name> changes, one
0102 shall override the new naming with the name already used in /proc/cpuinfo.
0103 
0104 c: The naming override can be "", which means it will not appear in /proc/cpuinfo.
0105 ----------------------------------------------------------------------------------
0106 The feature shall be omitted from /proc/cpuinfo if it does not make sense for
0107 the feature to be exposed to userspace. For example, X86_FEATURE_ALWAYS is
0108 defined in cpufeatures.h but that flag is an internal kernel feature used
0109 in the alternative runtime patching functionality. So, its name is overridden
0110 with "". Its flag will not appear in /proc/cpuinfo.
0111 
0112 Flags are missing when one or more of these happen
0113 ==================================================
0114 
0115 a: The hardware does not enumerate support for it.
0116 --------------------------------------------------
0117 For example, when a new kernel is running on old hardware or the feature is
0118 not enabled by boot firmware. Even if the hardware is new, there might be a
0119 problem enabling the feature at run time, the flag will not be displayed.
0120 
0121 b: The kernel does not know about the flag.
0122 -------------------------------------------
0123 For example, when an old kernel is running on new hardware.
0124 
0125 c: The kernel disabled support for it at compile-time.
0126 ------------------------------------------------------
0127 For example, if 5-level-paging is not enabled when building (i.e.,
0128 CONFIG_X86_5LEVEL is not selected) the flag "la57" will not show up [#f1]_.
0129 Even though the feature will still be detected via CPUID, the kernel disables
0130 it by clearing via setup_clear_cpu_cap(X86_FEATURE_LA57).
0131 
0132 d: The feature is disabled at boot-time.
0133 ----------------------------------------
0134 A feature can be disabled either using a command-line parameter or because
0135 it failed to be enabled. The command-line parameter clearcpuid= can be used
0136 to disable features using the feature number as defined in
0137 /arch/x86/include/asm/cpufeatures.h. For instance, User Mode Instruction
0138 Protection can be disabled using clearcpuid=514. The number 514 is calculated
0139 from #define X86_FEATURE_UMIP (16*32 + 2).
0140 
0141 In addition, there exists a variety of custom command-line parameters that
0142 disable specific features. The list of parameters includes, but is not limited
0143 to, nofsgsbase, nosgx, noxsave, etc. 5-level paging can also be disabled using
0144 "no5lvl".
0145 
0146 e: The feature was known to be non-functional.
0147 ----------------------------------------------
0148 The feature was known to be non-functional because a dependency was
0149 missing at runtime. For example, AVX flags will not show up if XSAVE feature
0150 is disabled since they depend on XSAVE feature. Another example would be broken
0151 CPUs and them missing microcode patches. Due to that, the kernel decides not to
0152 enable a feature.
0153 
0154 .. [#f1] 5-level paging uses linear address of 57 bits.