|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] x86/cpuid: Infrastructure to support pseudo feature identifiers
A future change will want a cpuid-like identifier which doesn't have a mapping
to a feature bit.
* Pass the feature name into the parse callback.
* Exclude a feature value of ~0u from falling into the general set/clear bit
paths.
* In gen-cpuid.py, insert a placeholder to collect all the pseudo feature
names.
No practical change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
CC: Henry Wang <Henry.Wang@xxxxxxx>
CC: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
CC: Demi Marie Obenour <demi@xxxxxxxxxxxxxxxxxxxxxx>
---
xen/arch/x86/cpuid.c | 17 +++++++++++++----
xen/tools/gen-cpuid.py | 13 +++++++++++++
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c
index 822f9ace1087..112ee63a9449 100644
--- a/xen/arch/x86/cpuid.c
+++ b/xen/arch/x86/cpuid.c
@@ -39,7 +39,8 @@ static const struct feature_name {
* function pointer call in the middle of the loop.
*/
static int __init always_inline parse_cpuid(
- const char *s, void (*callback)(unsigned int feat, bool val))
+ const char *s, void (*callback)(const char *name,
+ unsigned int feat, bool val))
{
const char *ss;
int val, rc = 0;
@@ -81,7 +82,7 @@ static int __init always_inline parse_cpuid(
if ( (val = parse_boolean(mid->name, s, ss)) >= 0 )
{
- callback(mid->bit, val);
+ callback(mid->name, mid->bit, val);
mid = NULL;
}
@@ -101,8 +102,12 @@ static int __init always_inline parse_cpuid(
return rc;
}
-static void __init cf_check _parse_xen_cpuid(unsigned int feat, bool val)
+static void __init cf_check _parse_xen_cpuid(
+ const char *name, unsigned int feat, bool val)
{
+ if ( unlikely(feat == ~0u) )
+ return;
+
if ( !val )
setup_clear_cpu_cap(feat);
else if ( feat == X86_FEATURE_RDRAND &&
@@ -120,8 +125,12 @@ static bool __initdata dom0_cpuid_cmdline;
static uint32_t __initdata dom0_enable_feat[FSCAPINTS];
static uint32_t __initdata dom0_disable_feat[FSCAPINTS];
-static void __init cf_check _parse_dom0_cpuid(unsigned int feat, bool val)
+static void __init cf_check _parse_dom0_cpuid(
+ const char *name, unsigned int feat, bool val)
{
+ if ( unlikely(feat == ~0u) )
+ return;
+
__set_bit (feat, val ? dom0_enable_feat : dom0_disable_feat);
__clear_bit(feat, val ? dom0_disable_feat : dom0_enable_feat );
}
diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
index 4f7c8d78cce7..f3045b3bfd36 100755
--- a/xen/tools/gen-cpuid.py
+++ b/xen/tools/gen-cpuid.py
@@ -297,6 +297,19 @@ def crunch_numbers(state):
RTM: [TSXLDTRK],
}
+ #
+ # Pseudo feature names. These don't map to a feature bit, but are
+ # inserted into the values dictionary so they can be parsed and handled
+ # specially
+ #
+ pseduo_names = (
+ )
+
+ for n in pseduo_names:
+ if n in state.values:
+ raise Fail("Pseduo feature name %s aliases real feature" % (n, ))
+ state.values[n] = 0xffffffff
+
deep_features = tuple(sorted(deps.keys()))
state.deep_deps = {}
--
2.11.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |