Check that fdt hart id matches boot hart id before associating an fdt
authorjsg <jsg@openbsd.org>
Tue, 4 May 2021 06:32:58 +0000 (06:32 +0000)
committerjsg <jsg@openbsd.org>
Tue, 4 May 2021 06:32:58 +0000 (06:32 +0000)
node with the primary cpu.

Prompted by the polarfire icicle where hart 0 is an mmuless e51 core.

ok drahn@ mlarkin@

sys/arch/riscv64/dev/mainbus.c
sys/arch/riscv64/riscv64/machdep.c

index c94c43f..faa9831 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: mainbus.c,v 1.2 2021/05/03 21:25:48 kettenis Exp $ */
+/* $OpenBSD: mainbus.c,v 1.3 2021/05/04 06:32:58 jsg Exp $ */
 /*
  * Copyright (c) 2016 Patrick Wildt <patrick@blueri.se>
  * Copyright (c) 2017 Mark Kettenis <kettenis@openbsd.org>
@@ -323,7 +323,7 @@ mainbus_match_primary(struct device *parent, void *match, void *aux)
        struct fdt_attach_args *fa = aux;
        struct cfdata *cf = match;
 
-       if (fa->fa_nreg < 1)
+       if (fa->fa_nreg < 1 || fa->fa_reg[0].addr != boot_hart)
                return 0;
 
        return (*cf->cf_attach->ca_match)(parent, match, aux);
index f33a352..7fae71c 100644 (file)
@@ -567,6 +567,10 @@ initriscv(struct riscv_bootparams *rbp)
                int len;
                static uint8_t lladdr[6];
 
+               len = fdt_node_property(node, "boot-hartid", &prop);
+               if (len == sizeof(boot_hart))
+                       boot_hart = bemtoh32((uint32_t *)prop);
+
                len = fdt_node_property(node, "bootargs", &prop);
                if (len > 0)
                        collect_kernel_args(prop);