mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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>,
	"H. Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, x86-cpuid@lists.linux.dev
Cc: Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org,
	"Ahmed S. Darwish" <darwi@linutronix.de>
Subject: [PATCH v1 7/9] tools/x86/kcpuid: Parse subleaf ranges if provided
Date: Thu, 18 Jul 2024 15:47:47 +0200	[thread overview]
Message-ID: <20240718134755.378115-8-darwi@linutronix.de> (raw)
In-Reply-To: <20240718134755.378115-1-darwi@linutronix.de>

It's a common pattern in cpuid leaves to have the same bitfields format
repeated across a number of subleaves.  Typically, this is used for
enumerating hierarchial structures like cache and TLB levels, CPU
topology levels, etc.

Modify kcpuid.c to handle subleaf ranges in the CSV file subleaves
column.  For example, make it able to parse lines in the form:

 # LEAF, SUBLEAVES,  reg,    bits,    short_name             , ...
    0xb,       1:0,  eax,     4:0,    x2apic_id_shift        , ...
    0xb,       1:0,  ebx,    15:0,    domain_lcpus_count     , ...
    0xb,       1:0,  ecx,     7:0,    domain_nr              , ...

This way, full output can be printed to the user.

Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
---
 tools/arch/x86/kcpuid/kcpuid.c | 50 ++++++++++++++++++++++------------
 1 file changed, 32 insertions(+), 18 deletions(-)

diff --git a/tools/arch/x86/kcpuid/kcpuid.c b/tools/arch/x86/kcpuid/kcpuid.c
index beb4fde48145..c321db86750b 100644
--- a/tools/arch/x86/kcpuid/kcpuid.c
+++ b/tools/arch/x86/kcpuid/kcpuid.c
@@ -307,6 +307,8 @@ static int parse_line(char *line)
 	struct bits_desc *bdesc;
 	int reg_index;
 	char *start, *end;
+	u32 subleaf_start, subleaf_end;
+	unsigned bit_start, bit_end;
 
 	/* Skip comments and NULL line */
 	if (line[0] == '#' || line[0] == '\n')
@@ -345,13 +347,25 @@ static int parse_line(char *line)
 		return 0;
 
 	/* subleaf */
-	sub = strtoul(tokens[1], NULL, 0);
-	if ((int)sub > func->nr)
-		return -1;
+	buf = tokens[1];
+	end = strtok(buf, ":");
+	start = strtok(NULL, ":");
+	subleaf_end = strtoul(end, NULL, 0);
+
+	/* A subleaf range is given? */
+	if (start) {
+		subleaf_start = strtoul(start, NULL, 0);
+		subleaf_end = min(subleaf_end, (u32)(func->nr - 1));
+		if (subleaf_start > subleaf_end)
+			return 0;
+	} else {
+		subleaf_start = subleaf_end;
+		if (subleaf_start > (u32)(func->nr - 1))
+			return 0;
+	}
 
-	leaf = &func->leafs[sub];
+	/* register */
 	buf = tokens[2];
-
 	if (strcasestr(buf, "EAX"))
 		reg_index = R_EAX;
 	else if (strcasestr(buf, "EBX"))
@@ -363,23 +377,23 @@ static int parse_line(char *line)
 	else
 		goto err_exit;
 
-	reg = &leaf->info[reg_index];
-	bdesc = &reg->descs[reg->nr++];
-
 	/* bit flag or bits field */
 	buf = tokens[3];
-
 	end = strtok(buf, ":");
-	bdesc->end = strtoul(end, NULL, 0);
-	bdesc->start = bdesc->end;
-
-	/* start != NULL means it is bit fields */
 	start = strtok(NULL, ":");
-	if (start)
-		bdesc->start = strtoul(start, NULL, 0);
-
-	strcpy(bdesc->simp, strtok(tokens[4], " \t"));
-	strcpy(bdesc->detail, tokens[5]);
+	bit_end = strtoul(end, NULL, 0);
+	bit_start = (start) ? strtoul(start, NULL, 0) : bit_end;
+
+	for (sub = subleaf_start; sub <= subleaf_end; sub++) {
+		leaf = &func->leafs[sub];
+		reg = &leaf->info[reg_index];
+		bdesc = &reg->descs[reg->nr++];
+
+		bdesc->end = bit_end;
+		bdesc->start = bit_start;
+		strcpy(bdesc->simp, strtok(tokens[4], " \t"));
+		strcpy(bdesc->detail, tokens[5]);
+	}
 	return 0;
 
 err_exit:
-- 
2.45.2


  parent reply	other threads:[~2024-07-18 13:48 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-18 13:45 [ANNOUNCE] x86-cpuid.org: A machine-readable CPUID repository Ahmed S. Darwish
2024-07-18 13:47 ` [PATCH v1 0/9] tools/x86/kcpuid: Complete the CPUID database Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 1/9] tools/x86/kcpuid: Remove unused variable Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 2/9] tools/x86/kcpuid: Properly align long-description columns Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 3/9] tools/x86/kcpuid: Set max possible subleaves count to 64 Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 4/9] tools/x86/kcpuid: Protect against faulty "max subleaf" values Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 5/9] tools/x86/kcpuid: Strip bitfield names leading/trailing whitespace Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 6/9] tools/x86/kcpuid: Recognize all leaves with subleaves Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` Ahmed S. Darwish [this message]
2024-08-02  7:28     ` [tip: x86/misc] tools/x86/kcpuid: Parse subleaf ranges if provided tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 8/9] tools/x86/kcpuid: Introduce a complete cpuid bitfields CSV file Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for Ahmed S. Darwish
2024-07-18 13:47   ` [PATCH v1 9/9] MAINTAINERS: Add x86 cpuid database entry Ahmed S. Darwish
2024-08-02  7:28     ` [tip: x86/misc] " tip-bot2 for 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=20240718134755.378115-8-darwi@linutronix.de \
    --to=darwi@linutronix.de \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --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®