2019-05-22 15:51:29 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2008-02-04 23:48:00 +08:00
|
|
|
/* ----------------------------------------------------------------------- *
|
|
|
|
*
|
|
|
|
* Copyright 2008 rPath, Inc. - All Rights Reserved
|
|
|
|
*
|
|
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This is a host program to preprocess the CPU strings into a
|
|
|
|
* compact format suitable for the setup code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2012-10-03 01:01:26 +08:00
|
|
|
#include "../include/asm/required-features.h"
|
x86: Introduce disabled-features
I believe the REQUIRED_MASK aproach was taken so that it was
easier to consult in assembly (arch/x86/kernel/verify_cpu.S).
DISABLED_MASK does not have the same restriction, but I
implemented it the same way for consistency.
We have a REQUIRED_MASK... which does two things:
1. Keeps a list of cpuid bits to check in very early boot and
refuse to boot if those are not present.
2. Consulted during cpu_has() checks, which allows us to
optimize out things at compile-time. In other words, if we
*KNOW* we will not boot with the feature off, then we can
safely assume that it will be present forever.
But, we don't have a similar mechanism for CPU features which
may be present but that we know we will not use. We simply
use our existing mechanisms to repeatedly check the status of
the bit at runtime (well, the alternatives patching helps here
but it does not provide compile-time optimization).
Adding a feature to disabled-features.h allows the bit to be
checked via a new macro: cpu_feature_enabled(). Note that
for features in DISABLED_MASK, checks with this macro have
all of the benefits of an #ifdef. Before, we would have done
this in a header:
#ifdef CONFIG_X86_INTEL_MPX
#define cpu_has_mpx cpu_has(X86_FEATURE_MPX)
#else
#define cpu_has_mpx 0
#endif
and this in the code:
if (cpu_has_mpx)
do_some_mpx_thing();
Now, just add your feature to DISABLED_MASK and you can do this
everywhere, and get the same benefits you would have from
#ifdefs:
if (cpu_feature_enabled(X86_FEATURE_MPX))
do_some_mpx_thing();
We need a new function and *not* a modification to cpu_has()
because there are cases where we actually need to check the CPU
itself, despite what features the kernel supports. The best
example of this is a hypervisor which has no control over what
features its guests are using and where the guest does not depend
on the host for support.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: http://lkml.kernel.org/r/20140911211513.9E35E931@viggo.jf.intel.com
Acked-by: Borislav Petkov <bp@suse.de>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
2014-09-12 05:15:13 +08:00
|
|
|
#include "../include/asm/disabled-features.h"
|
2016-01-27 05:12:04 +08:00
|
|
|
#include "../include/asm/cpufeatures.h"
|
x86/cpu: Print VMX flags in /proc/cpuinfo using VMX_FEATURES_*
Add support for generating VMX feature names in capflags.c and use the
resulting x86_vmx_flags to print the VMX flags in /proc/cpuinfo. Don't
print VMX flags if no bits are set in word 0, which holds Pin Controls.
Pin Control's INTR and NMI exiting are fundamental pillars of VMX, if
they are not supported then the CPU is broken, it does not actually
support VMX, or the kernel wasn't built with support for the target CPU.
Print the features in a dedicated "vmx flags" line to avoid polluting
the common "flags" and to avoid having to prefix all flags with "vmx_",
which results in horrendously long names.
Keep synthetic VMX flags in cpufeatures to preserve /proc/cpuinfo's ABI
for those flags. This means that "flags" and "vmx flags" will have
duplicate entries for tpr_shadow (virtual_tpr), vnmi, ept, flexpriority,
vpid and ept_ad, but caps the pollution of "flags" at those six VMX
features. The vendor-specific code that populates the synthetic flags
will be consolidated in a future patch to further minimize the lasting
damage.
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20191221044513.21680-12-sean.j.christopherson@intel.com
2019-12-21 12:45:05 +08:00
|
|
|
#include "../include/asm/vmxfeatures.h"
|
2008-08-28 08:56:44 +08:00
|
|
|
#include "../kernel/cpu/capflags.c"
|
2008-02-04 23:48:00 +08:00
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
2008-09-17 06:09:26 +08:00
|
|
|
int i, j;
|
2008-02-04 23:48:00 +08:00
|
|
|
const char *str;
|
|
|
|
|
2010-02-07 01:47:17 +08:00
|
|
|
printf("static const char x86_cap_strs[] =\n");
|
2008-02-04 23:48:00 +08:00
|
|
|
|
2008-09-17 06:09:26 +08:00
|
|
|
for (i = 0; i < NCAPINTS; i++) {
|
|
|
|
for (j = 0; j < 32; j++) {
|
|
|
|
str = x86_cap_flags[i*32+j];
|
|
|
|
|
|
|
|
if (i == NCAPINTS-1 && j == 31) {
|
|
|
|
/* The last entry must be unconditional; this
|
|
|
|
also consumes the compiler-added null
|
|
|
|
character */
|
|
|
|
if (!str)
|
|
|
|
str = "";
|
|
|
|
printf("\t\"\\x%02x\\x%02x\"\"%s\"\n",
|
|
|
|
i, j, str);
|
|
|
|
} else if (str) {
|
|
|
|
printf("#if REQUIRED_MASK%d & (1 << %d)\n"
|
|
|
|
"\t\"\\x%02x\\x%02x\"\"%s\\0\"\n"
|
|
|
|
"#endif\n",
|
|
|
|
i, j, i, j, str);
|
|
|
|
}
|
2008-02-04 23:48:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
printf("\t;\n");
|
|
|
|
return 0;
|
|
|
|
}
|