|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 5/6] x86/cpu-policy: Disentangle X86_NR_FEAT and FEATURESET_NR_ENTRIES
When adding new words to a featureset, there is a reasonable amount of
boilerplate and it is preforable to split the addition into multiple patches.
GCC 12 spotted a real (transient) error which occurs when splitting additions
like this. Right now, FEATURESET_NR_ENTRIES is dynamically generated from the
highest numeric XEN_CPUFEATURE() value, and can be less than what the
FEATURESET_* constants suggest the length of a featureset bitmap ought to be.
This causes the policy <-> featureset converters to genuinely access
out-of-bounds on the featureset array.
Rework X86_NR_FEAT to be related to FEATURESET_* alone, allowing it
specifically to grow larger than FEATURESET_NR_ENTRIES.
Reported-by: Jan Beulich <jbeulich@xxxxxxxx>
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>
To preempt what I expect will be the first review question, no FEATURESET_*
can't become an enumeration, because the constants undergo token concatination
in the preprocess as part of making DECL_BITFIELD() work.
---
xen/arch/x86/cpu-policy.c | 7 +++++++
xen/arch/x86/include/asm/cpufeatures.h | 5 +----
xen/include/xen/lib/x86/cpu-policy.h | 4 ++--
xen/include/xen/lib/x86/cpuid-consts.h | 2 ++
xen/lib/x86/cpuid.c | 6 +++---
5 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
index 774c512a03bd..00416244a3d8 100644
--- a/xen/arch/x86/cpu-policy.c
+++ b/xen/arch/x86/cpu-policy.c
@@ -883,6 +883,13 @@ void __init init_dom0_cpuid_policy(struct domain *d)
static void __init __maybe_unused build_assertions(void)
{
+ /*
+ * Generally these are the same, but tend to differ when adding new
+ * infrastructure split across several patches. Simply confirm that the
+ * gen-cpuid.py X86_FEATURE_* bits fit within the bitmaps we operate on.
+ */
+ BUILD_BUG_ON(FEATURESET_NR_ENTRIES > X86_NR_FEAT);
+
/* Find some more clever allocation scheme if this trips. */
BUILD_BUG_ON(sizeof(struct cpu_policy) > PAGE_SIZE);
diff --git a/xen/arch/x86/include/asm/cpufeatures.h
b/xen/arch/x86/include/asm/cpufeatures.h
index 408ab4ba16a5..8989291bbfd6 100644
--- a/xen/arch/x86/include/asm/cpufeatures.h
+++ b/xen/arch/x86/include/asm/cpufeatures.h
@@ -2,10 +2,7 @@
* Explicitly intended for multiple inclusion.
*/
-#include <xen/lib/x86/cpuid-autogen.h>
-
-/* Number of capability words covered by the featureset words. */
-#define X86_NR_FEAT FEATURESET_NR_ENTRIES
+#include <xen/lib/x86/cpuid-consts.h>
/* Synthetic words follow the featureset words. */
#define X86_NR_SYNTH 1
diff --git a/xen/include/xen/lib/x86/cpu-policy.h
b/xen/include/xen/lib/x86/cpu-policy.h
index e9bda14a7595..01431de056c8 100644
--- a/xen/include/xen/lib/x86/cpu-policy.h
+++ b/xen/include/xen/lib/x86/cpu-policy.h
@@ -370,12 +370,12 @@ struct cpu_policy_errors
* Copy the featureset words out of a cpu_policy object.
*/
void x86_cpu_policy_to_featureset(const struct cpu_policy *p,
- uint32_t fs[FEATURESET_NR_ENTRIES]);
+ uint32_t fs[X86_NR_FEAT]);
/**
* Copy the featureset words back into a cpu_policy object.
*/
-void x86_cpu_featureset_to_policy(const uint32_t fs[FEATURESET_NR_ENTRIES],
+void x86_cpu_featureset_to_policy(const uint32_t fs[X86_NR_FEAT],
struct cpu_policy *p);
static inline uint64_t cpu_policy_xcr0_max(const struct cpu_policy *p)
diff --git a/xen/include/xen/lib/x86/cpuid-consts.h
b/xen/include/xen/lib/x86/cpuid-consts.h
index 6ca8c39a3df4..9fe931b8e31f 100644
--- a/xen/include/xen/lib/x86/cpuid-consts.h
+++ b/xen/include/xen/lib/x86/cpuid-consts.h
@@ -21,6 +21,8 @@
#define FEATURESET_7c1 14 /* 0x00000007:1.ecx */
#define FEATURESET_7d1 15 /* 0x00000007:1.edx */
+#define X86_NR_FEAT (FEATURESET_7d1 + 1)
+
#endif /* !XEN_LIB_X86_CONSTS_H */
/*
diff --git a/xen/lib/x86/cpuid.c b/xen/lib/x86/cpuid.c
index 68aafb404927..76f26e92af8d 100644
--- a/xen/lib/x86/cpuid.c
+++ b/xen/lib/x86/cpuid.c
@@ -61,7 +61,7 @@ const char *x86_cpuid_vendor_to_str(unsigned int vendor)
}
void x86_cpu_policy_to_featureset(
- const struct cpu_policy *p, uint32_t fs[FEATURESET_NR_ENTRIES])
+ const struct cpu_policy *p, uint32_t fs[X86_NR_FEAT])
{
fs[FEATURESET_1d] = p->basic._1d;
fs[FEATURESET_1c] = p->basic._1c;
@@ -82,7 +82,7 @@ void x86_cpu_policy_to_featureset(
}
void x86_cpu_featureset_to_policy(
- const uint32_t fs[FEATURESET_NR_ENTRIES], struct cpu_policy *p)
+ const uint32_t fs[X86_NR_FEAT], struct cpu_policy *p)
{
p->basic._1d = fs[FEATURESET_1d];
p->basic._1c = fs[FEATURESET_1c];
@@ -285,7 +285,7 @@ const uint32_t *x86_cpu_policy_lookup_deep_deps(uint32_t
feature)
static const uint32_t deep_features[] = INIT_DEEP_FEATURES;
static const struct {
uint32_t feature;
- uint32_t fs[FEATURESET_NR_ENTRIES];
+ uint32_t fs[X86_NR_FEAT];
} deep_deps[] = INIT_DEEP_DEPS;
unsigned int start = 0, end = ARRAY_SIZE(deep_deps);
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |