[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240617173426.11.I899d035485269f5110a3323fbb1680fbba718e4c@changeid>
Date: Mon, 17 Jun 2024 17:34:45 -0700
From: Douglas Anderson <dianders@...omium.org>
To: Daniel Thompson <daniel.thompson@...aro.org>
Cc: kgdb-bugreport@...ts.sourceforge.net,
Douglas Anderson <dianders@...omium.org>,
Christophe JAILLET <christophe.jaillet@...adoo.fr>,
Jason Wessel <jason.wessel@...driver.com>,
Thorsten Blum <thorsten.blum@...lux.com>,
Yuran Pereira <yuran.pereira@...mail.com>,
linux-kernel@...r.kernel.org
Subject: [PATCH 11/13] kdb: Abstract out parsing for mdWcN
We'd like to use the "WcN" parsing for some other "md"
variants. Abstract it out.
Signed-off-by: Douglas Anderson <dianders@...omium.org>
---
kernel/debug/kdb/kdb_main.c | 55 +++++++++++++++++++++++++++++++------
1 file changed, 46 insertions(+), 9 deletions(-)
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 6dcbf4ea4bcd..1a37c9bb505c 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -1591,6 +1591,49 @@ static void kdb_md_line(const char *fmtstr, unsigned long addr,
#define KDB_MD_BYTES_PER_LINE 16
+/**
+ * kdb_md_parse_arg0() - Parse argv[0] for "md" command
+ *
+ * @cmd: The name of the command, like "md"
+ * @arg0: The value of argv[0].
+ * @repeat: If argv0 modifies repeat count we'll adjust here.
+ * @bytesperword Ifargv0 modifies bytesperword we'll adjust here.
+ *
+ * Return: true if this was a valid cmd; false otherwise.
+ */
+static bool kdb_md_parse_arg0(const char *cmd, const char *arg0,
+ int *repeat, int *bytesperword)
+{
+ int cmdlen = strlen(cmd);
+
+ /* arg0 must _start_ with the command string or it's a no-go. */
+ if (strncmp(cmd, arg0, cmdlen) != 0)
+ return false;
+
+ /* If it's just the base command, we're done and it's good. */
+ if (arg0[cmdlen] == '\0')
+ return true;
+
+ /*
+ * The first byte after the base command must be bytes per word, a
+ * digit. The actual value of bytesperword will be validated later.
+ */
+ if (!isdigit(arg0[cmdlen]))
+ return false;
+ *bytesperword = (int)(arg0[cmdlen] - '0');
+ cmdlen++;
+
+ /* After the bytes per word must be end of string or a 'c'. */
+ if (arg0[cmdlen] == '\0')
+ return true;
+ if (arg0[cmdlen] != 'c')
+ return false;
+ cmdlen++;
+
+ /* After the "c" is the repeat. */
+ return kstrtouint(arg0 + cmdlen, 10, repeat) == 0;
+}
+
static int kdb_md(int argc, const char **argv)
{
static unsigned long last_addr;
@@ -1608,19 +1651,13 @@ static int kdb_md(int argc, const char **argv)
kdbgetintenv("RADIX", &radix);
kdbgetintenv("BYTESPERWORD", &bytesperword);
- if (isdigit(argv[0][2])) {
- bytesperword = (int)(argv[0][2] - '0');
- if (!argv[0][3])
- valid = true;
- else if (argv[0][3] == 'c' && argv[0][4])
- valid = kstrtouint(argv[0] + 4, 10, &repeat) == 0;
- } else if (strcmp(argv[0], "md") == 0)
+ if (kdb_md_parse_arg0("md", argv[0], &repeat, &bytesperword))
valid = true;
else if (strcmp(argv[0], "mds") == 0)
valid = true;
- else if (strcmp(argv[0], "mdp") == 0) {
+ else if (strcmp(argv[0], "mdp") == 0)
phys = valid = true;
- }
+
if (!valid)
return KDB_NOTFOUND;
--
2.45.2.627.g7a2c4fd464-goog
Powered by blists - more mailing lists