Commit 069b0d51 authored by Conor Dooley's avatar Conor Dooley Committed by Palmer Dabbelt

RISC-V: validate riscv,isa at boot, not during ISA string parsing

Since riscv_fill_hwcap() now only iterates over possible cpus, the
basic validation of whether riscv,isa contains "rv<width>" can be moved
to riscv_early_of_processor_hartid().

Further, "ima" support is required by the kernel, so reject any CPU not
fitting the bill.
Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
Signed-off-by: default avatarConor Dooley <conor.dooley@microchip.com>
Reviewed-by: default avatarSunil V L <sunilvl@ventanamicro.com>
Link: https://lore.kernel.org/r/20230607-guts-blurry-67e711acf328@spudSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 2ac87434
...@@ -65,10 +65,12 @@ int riscv_early_of_processor_hartid(struct device_node *node, unsigned long *har ...@@ -65,10 +65,12 @@ int riscv_early_of_processor_hartid(struct device_node *node, unsigned long *har
pr_warn("CPU with hartid=%lu has no \"riscv,isa\" property\n", *hart); pr_warn("CPU with hartid=%lu has no \"riscv,isa\" property\n", *hart);
return -ENODEV; return -ENODEV;
} }
if (tolower(isa[0]) != 'r' || tolower(isa[1]) != 'v') {
pr_warn("CPU with hartid=%lu has an invalid ISA of \"%s\"\n", *hart, isa); if (IS_ENABLED(CONFIG_32BIT) && strncasecmp(isa, "rv32ima", 7))
return -ENODEV;
if (IS_ENABLED(CONFIG_64BIT) && strncasecmp(isa, "rv64ima", 7))
return -ENODEV; return -ENODEV;
}
return 0; return 0;
} }
......
...@@ -148,12 +148,12 @@ void __init riscv_fill_hwcap(void) ...@@ -148,12 +148,12 @@ void __init riscv_fill_hwcap(void)
} }
} }
if (IS_ENABLED(CONFIG_32BIT) && strncasecmp(isa, "rv32", 4)) /*
continue; * For all possible cpus, we have already validated in
* the boot process that they at least contain "rv" and
if (IS_ENABLED(CONFIG_64BIT) && strncasecmp(isa, "rv64", 4)) * whichever of "32"/"64" this kernel supports, and so this
continue; * section can be skipped.
*/
isa += 4; isa += 4;
bitmap_zero(this_isa, RISCV_ISA_EXT_MAX); bitmap_zero(this_isa, RISCV_ISA_EXT_MAX);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment