summaryrefslogtreecommitdiff
path: root/arch/arm64/kernel/idreg-override.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kernel/idreg-override.c')
-rw-r--r--arch/arm64/kernel/idreg-override.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c
index 8b22ca523186..cf1df5f6fbc1 100644
--- a/arch/arm64/kernel/idreg-override.c
+++ b/arch/arm64/kernel/idreg-override.c
@@ -206,14 +206,15 @@ static int __init parse_nokaslr(char *unused)
}
early_param("nokaslr", parse_nokaslr);
-static int __init find_field(const char *cmdline,
+static int __init find_field(const char *cmdline, char *opt, int len,
const struct ftr_set_desc *reg, int f, u64 *v)
{
- char opt[FTR_DESC_NAME_LEN + FTR_DESC_FIELD_LEN + 2];
- int len;
+ int flen = strlen(reg->fields[f].name);
- len = snprintf(opt, ARRAY_SIZE(opt), "%s.%s=",
- reg->name, reg->fields[f].name);
+ // append '<fieldname>=' to obtain '<name>.<fieldname>='
+ memcpy(opt + len, reg->fields[f].name, flen);
+ len += flen;
+ opt[len++] = '=';
if (memcmp(cmdline, opt, len))
return -1;
@@ -223,15 +224,21 @@ static int __init find_field(const char *cmdline,
static void __init match_options(const char *cmdline)
{
+ char opt[FTR_DESC_NAME_LEN + FTR_DESC_FIELD_LEN + 2];
int i;
for (i = 0; i < ARRAY_SIZE(regs); i++) {
const struct ftr_set_desc *reg = prel64_pointer(regs[i].reg);
struct arm64_ftr_override *override;
+ int len = strlen(reg->name);
int f;
override = prel64_pointer(reg->override);
+ // set opt[] to '<name>.'
+ memcpy(opt, reg->name, len);
+ opt[len++] = '.';
+
for (f = 0; reg->fields[f].name[0] != '\0'; f++) {
u64 shift = reg->fields[f].shift;
u64 width = reg->fields[f].width ?: 4;
@@ -239,7 +246,7 @@ static void __init match_options(const char *cmdline)
bool (*filter)(u64 val);
u64 v;
- if (find_field(cmdline, reg, f, &v))
+ if (find_field(cmdline, opt, len, reg, f, &v))
continue;
/*