[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/cpuid: Calculate FEATURESET_NR_ENTRIES more helpfully
On 12.05.2023 14:45, Andrew Cooper wrote: > When adding new featureset words, it is convenient to split the work into > several patches. However, GCC 12 spotted that the way we prefer to split the > work results in a real (transient) breakage whereby the policy <-> featureset > helpers perform out-of-bounds accesses on the featureset array. > > Fix this by having gen-cpuid.py calculate FEATURESET_NR_ENTRIES from the > comments describing the word blocks, rather than from the XEN_CPUFEATURE() > with the greatest value. > > For simplicty, require that the word blocks appear in order. This can be > revisted if we find a good reason to have blocks out of order. > > No functional change. > > Reported-by: Jan Beulich <jbeulich@xxxxxxxx> > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> As far as my Python goes: Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Just one remark further down. > This supercedes the entire "x86: Fix transient build breakage with featureset > additions" series, but doesn't really feel as if it ought to be labelled v2 Thank you for re-doing this altogether. I think it's more safe this way, and it now being less intrusive is imo also beneficial. > --- a/xen/tools/gen-cpuid.py > +++ b/xen/tools/gen-cpuid.py > @@ -50,13 +50,37 @@ def parse_definitions(state): > "\s+([\s\d]+\*[\s\d]+\+[\s\d]+)\)" > "\s+/\*([\w!]*) .*$") > > + word_regex = re.compile( > + r"^/\* .* word (\d*) \*/$") > + last_word = -1 > + > this = sys.modules[__name__] > > for l in state.input.readlines(): > - # Short circuit the regex... > - if not l.startswith("XEN_CPUFEATURE("): > + > + # Short circuit the regexes... > + if not (l.startswith("XEN_CPUFEATURE(") or > + l.startswith("/* ")): > continue > > + # Handle /* ... word $N */ lines > + if l.startswith("/* "): > + > + res = word_regex.match(l) > + if res is None: > + continue # Some other comment > + > + word = int(res.groups()[0]) > + > + if word != last_word + 1: > + raise Fail("Featureset word %u out of order (last word %u)" > + % (word, last_word)) > + > + last_word = word > + state.nr_entries = word + 1 > + continue > + > + # Handle XEN_CPUFEATURE( lines > res = feat_regex.match(l) > > if res is None: > @@ -94,6 +118,15 @@ def parse_definitions(state): > if len(state.names) == 0: > raise Fail("No features found") > > + if state.nr_entries == 0: > + raise Fail("No featureset word info found") > + > + max_val = max(state.names.keys()) > + if (max_val >> 5) + 1 > state.nr_entries: Maybe if (max_val >> 5) >= state.nr_entries: ? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |