RISC-V: validate riscv,isa at boot, not during ISA string parsing
authorConor Dooley <conor.dooley@microchip.com>
Wed, 7 Jun 2023 20:28:27 +0000 (21:28 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 21 Jun 2023 14:45:15 +0000 (07:45 -0700)
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: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
Link: https://lore.kernel.org/r/20230607-guts-blurry-67e711acf328@spud
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/cpu.c
arch/riscv/kernel/cpufeature.c

index 8025de0..dfb4a2a 100644 (file)
@@ -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);
                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 0;
 }
index c863521..c3851c8 100644 (file)
@@ -148,12 +148,12 @@ void __init riscv_fill_hwcap(void)
                        }
                }
 
-               if (IS_ENABLED(CONFIG_32BIT) && strncasecmp(isa, "rv32", 4))
-                       continue;
-
-               if (IS_ENABLED(CONFIG_64BIT) && strncasecmp(isa, "rv64", 4))
-                       continue;
-
+               /*
+                * For all possible cpus, we have already validated in
+                * the boot process that they at least contain "rv" and
+                * whichever of "32"/"64" this kernel supports, and so this
+                * section can be skipped.
+                */
                isa += 4;
 
                bitmap_zero(this_isa, RISCV_ISA_EXT_MAX);