[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250312143738.458507-14-darwi@linutronix.de>
Date: Wed, 12 Mar 2025 15:37:30 +0100
From: "Ahmed S. Darwish" <darwi@...utronix.de>
To: Ingo Molnar <mingo@...hat.com>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Borislav Petkov <bp@...en8.de>
Cc: Thomas Gleixner <tglx@...utronix.de>,
Andrew Cooper <andrew.cooper3@...rix.com>,
"H. Peter Anvin" <hpa@...or.com>,
John Ogness <john.ogness@...utronix.de>,
x86@...nel.org,
x86-cpuid@...ts.linux.dev,
LKML <linux-kernel@...r.kernel.org>,
"Ahmed S. Darwish" <darwi@...utronix.de>
Subject: [PATCH v2 13/20] tools/x86/kcpuid: Consolidate index validity checks
Let index_to_cpuid_range() return a range only if the passed index is
within that range's maximum supported function on the CPU.
This avoids repeating the same index validity check at both
setup_cpuid_range() and index_to_func().
Signed-off-by: Ahmed S. Darwish <darwi@...utronix.de>
---
tools/arch/x86/kcpuid/kcpuid.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/tools/arch/x86/kcpuid/kcpuid.c b/tools/arch/x86/kcpuid/kcpuid.c
index 0ba0d440482c..fff6db1119ed 100644
--- a/tools/arch/x86/kcpuid/kcpuid.c
+++ b/tools/arch/x86/kcpuid/kcpuid.c
@@ -101,10 +101,12 @@ static char *range_to_str(struct cpuid_range *range)
struct cpuid_range *index_to_cpuid_range(u32 index)
{
+ u32 func_idx = index & CPUID_FUNCTION_MASK;
+ u32 range_idx = index & CPUID_INDEX_MASK;
struct cpuid_range *range;
for_each_cpuid_range(range) {
- if (range->index == (index & CPUID_INDEX_MASK))
+ if (range->index == range_idx && (u32)range->nr > func_idx)
return range;
}
@@ -331,16 +333,14 @@ static void parse_line(char *line)
/* index/main-leaf */
index = strtoull(tokens[0], NULL, 0);
- /* Skip line parsing if it's not covered by known ranges */
+ /*
+ * Skip line parsing if the index is not covered by known-valid
+ * CPUID ranges on this CPU.
+ */
range = index_to_cpuid_range(index);
if (!range)
return;
- /* Skip line parsing for non-existing indexes */
- index &= CPUID_FUNCTION_MASK;
- if ((int)index >= range->nr)
- return;
-
/* Skip line parsing if the index CPUID output is all zero */
func = &range->funcs[index];
if (!func->nr)
@@ -505,17 +505,13 @@ static void show_range(struct cpuid_range *range)
static inline struct cpuid_func *index_to_func(u32 index)
{
+ u32 func_idx = index & CPUID_FUNCTION_MASK;
struct cpuid_range *range;
- u32 func_idx;
range = index_to_cpuid_range(index);
if (!range)
return NULL;
- func_idx = index & CPUID_FUNCTION_MASK;
- if ((func_idx + 1) > (u32)range->nr)
- return NULL;
-
return &range->funcs[func_idx];
}
--
2.48.1
Powered by blists - more mailing lists