[PATCH v7 16/33] arm64: idreg_override: Avoid kstrtou64() to parse a single hex digit
Ard Biesheuvel
ardb at kernel.org
Fri Nov 11 09:11:44 PST 2022
All ID register value overrides are =0 with the exception of the nokaslr
pseudo feature which uses =1. In order to remove the dependency on
kstrtou64(), which is part of the core kernel and no longer usable once
we move idreg-override into the early mini C runtime, let's just parse a
single hex digit (with optional leading 0x) and set the output value
accordingly.
Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
---
arch/arm64/kernel/idreg-override.c | 27 +++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c
index a5299aa1d1711adc..7e3eb48f5c83d539 100644
--- a/arch/arm64/kernel/idreg-override.c
+++ b/arch/arm64/kernel/idreg-override.c
@@ -170,6 +170,7 @@ static int __init find_field(const char *cmdline, char *opt, int len,
const struct ftr_set_desc *reg, int f, u64 *v)
{
int flen = strlen(reg->fields[f].name);
+ const char *p;
// append '<fieldname>=' to obtain '<name>.<fieldname>='
memcpy(opt + len, reg->fields[f].name, flen);
@@ -179,7 +180,31 @@ static int __init find_field(const char *cmdline, char *opt, int len,
if (memcmp(cmdline, opt, len))
return -1;
- return kstrtou64(cmdline + len, 0, v);
+ p = cmdline + len;
+
+ // skip "0x" if it comes next
+ if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))
+ p += 2;
+
+ // check whether the RHS is a single non-whitespace character
+ if (*p == '\0' || (p[1] && !isspace(p[1])))
+ return -1;
+
+ // only accept a single hex character as the value
+ switch (*p) {
+ case '0' ... '9':
+ *v = *p - '0';
+ break;
+ case 'a' ... 'f':
+ *v = *p - 'a' + 10;
+ break;
+ case 'A' ... 'F':
+ *v = *p - 'A' + 10;
+ break;
+ default:
+ return -1;
+ }
+ return 0;
}
static const void * __init get_filter(const struct ftr_set_desc *reg, int idx)
--
2.35.1
More information about the linux-arm-kernel
mailing list