From: "Ahmed S. Darwish" <darwi@linutronix.de>
To: Borislav Petkov <bp@alien8.de>, Ingo Molnar <mingo@redhat.com>,
Dave Hansen <dave.hansen@linux.intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Andrew Cooper <andrew.cooper3@citrix.com>,
"H. Peter Anvin" <hpa@zytor.com>,
x86@kernel.org, John Ogness <john.ogness@linutronix.de>,
x86-cpuid@lists.linux.dev, LKML <linux-kernel@vger.kernel.org>,
"Ahmed S. Darwish" <darwi@linutronix.de>
Subject: [PATCH v1 05/12] tools/x86/kcpuid: Refactor CPUID range handling for future expansion
Date: Thu, 6 Mar 2025 21:49:53 +0100 [thread overview]
Message-ID: <20250306205000.227399-6-darwi@linutronix.de> (raw)
In-Reply-To: <20250306205000.227399-1-darwi@linutronix.de>
The kcpuid code assumes only two CPUID index ranges, standard (0x0...)
and extended (0x80000000...).
Since additional CPUID index ranges will be added in further commits,
replace the "is_ext" boolean with enumeration-based range classification.
Collect all CPUID ranges in a structured array and introduce helper
macros to iterate over it. Use such helpers throughout the code.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
---
tools/arch/x86/kcpuid/kcpuid.c | 103 ++++++++++++++++++++-------------
1 file changed, 62 insertions(+), 41 deletions(-)
diff --git a/tools/arch/x86/kcpuid/kcpuid.c b/tools/arch/x86/kcpuid/kcpuid.c
index c5e18a397e07..6f6a394486af 100644
--- a/tools/arch/x86/kcpuid/kcpuid.c
+++ b/tools/arch/x86/kcpuid/kcpuid.c
@@ -65,19 +65,52 @@ struct cpuid_func {
int nr;
};
+enum range_index {
+ RANGE_STD = 0, /* Standard */
+ RANGE_EXT = 0x80000000, /* Extended */
+};
+
+#define CPUID_INDEX_MASK 0x80000000
+#define CPUID_FUNCTION_MASK (~CPUID_INDEX_MASK)
+
struct cpuid_range {
/* array of main leafs */
struct cpuid_func *funcs;
/* number of valid leafs */
int nr;
- bool is_ext;
+ enum range_index index;
};
-/*
- * basic: basic functions range: [0... ]
- * ext: extended functions range: [0x80000000... ]
- */
-struct cpuid_range *leafs_basic, *leafs_ext;
+static struct cpuid_range ranges[] = {
+ { .index = RANGE_STD, },
+ { .index = RANGE_EXT, },
+};
+
+static char *range_to_str(struct cpuid_range *range)
+{
+ switch (range->index) {
+ case RANGE_STD: return "Standard";
+ case RANGE_EXT: return "Extended";
+ default: return NULL;
+ }
+}
+
+#define for_each_cpuid_range(range) \
+ for (unsigned int i = 0; \
+ i < ARRAY_SIZE(ranges) && ((range) = &ranges[i]); \
+ i++)
+
+struct cpuid_range *index_to_cpuid_range(u32 index)
+{
+ struct cpuid_range *range;
+
+ for_each_cpuid_range(range) {
+ if (range->index == (index & CPUID_INDEX_MASK))
+ return range;
+ }
+
+ return NULL;
+}
static bool show_details;
static bool show_raw;
@@ -175,7 +208,7 @@ static void raw_dump_range(struct cpuid_range *range)
u32 f;
int i;
- printf("%s Leafs :\n", range->is_ext ? "Extended" : "Basic");
+ printf("%s Leafs :\n", range_to_str(range));
printf("================\n");
for (f = 0; (int)f < range->nr; f++) {
@@ -192,29 +225,19 @@ static void raw_dump_range(struct cpuid_range *range)
}
#define MAX_SUBLEAF_NUM 64
-struct cpuid_range *setup_cpuid_range(u32 input_eax)
+void setup_cpuid_range(struct cpuid_range *range)
{
u32 max_func, idx_func, subleaf, max_subleaf;
- u32 eax, ebx, ecx, edx, f = input_eax;
- struct cpuid_range *range;
+ u32 eax, ebx, ecx, edx, f;
bool allzero;
- eax = input_eax;
+ eax = f = range->index;
ebx = ecx = edx = 0;
cpuid(&eax, &ebx, &ecx, &edx);
max_func = eax;
idx_func = (max_func & 0xffff) + 1;
- range = malloc(sizeof(struct cpuid_range));
- if (!range)
- err(EXIT_FAILURE, NULL);
-
- if (input_eax & 0x80000000)
- range->is_ext = true;
- else
- range->is_ext = false;
-
range->funcs = malloc(sizeof(struct cpuid_func) * idx_func);
if (!range->funcs)
err(EXIT_FAILURE, NULL);
@@ -265,8 +288,6 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax)
}
}
-
- return range;
}
/*
@@ -325,13 +346,13 @@ static int parse_line(char *line)
/* index/main-leaf */
index = strtoull(tokens[0], NULL, 0);
- if (index & 0x80000000)
- range = leafs_ext;
- else
- range = leafs_basic;
+ /* Skip line parsing if it's not covered by known ranges */
+ range = index_to_cpuid_range(index);
+ if (!range)
+ return -1;
- index &= 0x7FFFFFFF;
/* Skip line parsing for non-existing indexes */
+ index &= CPUID_FUNCTION_MASK;
if ((int)index >= range->nr)
return -1;
@@ -521,24 +542,28 @@ static inline struct cpuid_func *index_to_func(u32 index)
struct cpuid_range *range;
u32 func_idx;
- range = (index & 0x80000000) ? leafs_ext : leafs_basic;
- func_idx = index & 0xffff;
+ range = index_to_cpuid_range(index);
+ if (!range)
+ return NULL;
+ func_idx = index & 0xffff;
if ((func_idx + 1) > (u32)range->nr) {
warnx("Invalid input index (0x%x)", index);
return NULL;
}
+
return &range->funcs[func_idx];
}
static void show_info(void)
{
+ struct cpuid_range *range;
struct cpuid_func *func;
if (show_raw) {
/* Show all of the raw output of 'cpuid' instr */
- raw_dump_range(leafs_basic);
- raw_dump_range(leafs_ext);
+ for_each_cpuid_range(range)
+ raw_dump_range(range);
return;
}
@@ -565,15 +590,8 @@ static void show_info(void)
}
printf("CPU features:\n=============\n\n");
- show_range(leafs_basic);
- show_range(leafs_ext);
-}
-
-static void setup_platform_cpuid(void)
-{
- /* Setup leafs for the basic and extended range */
- leafs_basic = setup_cpuid_range(0x0);
- leafs_ext = setup_cpuid_range(0x80000000);
+ for_each_cpuid_range(range)
+ show_range(range);
}
static void __noreturn usage(int exit_code)
@@ -649,10 +667,13 @@ static void parse_options(int argc, char *argv[])
*/
int main(int argc, char *argv[])
{
+ struct cpuid_range *range;
+
parse_options(argc, argv);
/* Setup the cpuid leafs of current platform */
- setup_platform_cpuid();
+ for_each_cpuid_range(range)
+ setup_cpuid_range(range);
/* Read and parse the 'cpuid.csv' */
parse_text();
--
2.48.1
next prev parent reply other threads:[~2025-03-06 20:50 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-06 20:49 [PATCH v1 00/12] tools/x86/kcpuid: x86-cpuid-db v2.2 update Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 01/12] tools/x86/kcpuid: Fix error handling Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 02/12] tools/x86/kcpuid: Remove unused local variable Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 03/12] tools/x86/kcpuid: Remove unused global variable Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 04/12] tools/x86/kcpuid: Simplify usage() handling Ahmed S. Darwish
2025-03-06 20:49 ` Ahmed S. Darwish [this message]
2025-03-06 20:49 ` [PATCH v1 06/12] tools/x86/kcpuid: Extend CPUID index mask macro Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 07/12] tools/x86/kcpuid: Add rudimentary CPU vendor detection Ahmed S. Darwish
2025-03-06 21:07 ` Andrew Cooper
2025-03-07 14:06 ` Ahmed S. Darwish
2025-03-06 22:00 ` Dave Hansen
2025-03-07 13:48 ` Ahmed S. Darwish
2025-03-07 15:46 ` H. Peter Anvin
2025-03-07 15:03 ` Dave Hansen
2025-03-10 14:21 ` Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 08/12] tools/x86/kcpuid: Restrict CPUID scanning to valid vendor ranges Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 09/12] tools/x86/kcpuid: Define Transmeta and Centaur index ranges Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 10/12] tools/x86/kcpuid: Update bitfields to x86-cpuid-db v2.0 Ahmed S. Darwish
2025-03-07 3:18 ` H. Peter Anvin
2025-03-07 15:07 ` Ahmed S. Darwish
2025-03-07 15:27 ` H. Peter Anvin
2025-03-10 14:47 ` Ahmed S. Darwish
2025-03-06 20:49 ` [PATCH v1 11/12] tools/x86/kcpuid: Update bitfields to x86-cpuid-db v2.2 Ahmed S. Darwish
2025-03-06 20:50 ` [PATCH v1 12/12] MAINTAINERS: Include kcpuid under X86 CPUID DATABASE Ahmed S. Darwish
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250306205000.227399-6-darwi@linutronix.de \
--to=darwi@linutronix.de \
--cc=andrew.cooper3@citrix.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86-cpuid@lists.linux.dev \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®