Diff below reduces the number of arm64 CPUs we attach to the maximum
that we support.  Without this diff a kernel running on hardware with
more than MAXCPUS CPUs will almost certainly crash.

To make this work, the code is changed to bump ncpus whenever we
attach a secondary CPU instead of bumping it when those cores are
sucessfully spun up.  Should make no difference on correctly
functioning hardware.

ok?


Index: arch/arm64/arm64/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/cpu.c,v
retrieving revision 1.22
diff -u -p -r1.22 cpu.c
--- arch/arm64/arm64/cpu.c      4 Aug 2018 11:55:40 -0000       1.22
+++ arch/arm64/arm64/cpu.c      17 Aug 2018 17:50:09 -0000
@@ -211,10 +211,14 @@ int
 cpu_match(struct device *parent, void *cfdata, void *aux)
 {
        struct fdt_attach_args *faa = aux;
+       uint64_t mpidr = READ_SPECIALREG(mpidr_el1);
        char buf[32];
 
-       if (OF_getprop(faa->fa_node, "device_type", buf, sizeof(buf)) > 0 &&
-           strcmp(buf, "cpu") == 0)
+       if (OF_getprop(faa->fa_node, "device_type", buf, sizeof(buf)) <= 0 ||
+           strcmp(buf, "cpu") != 0)
+               return 0;
+
+       if (ncpus < MAXCPUS || faa->fa_reg[0].addr == (mpidr & MPIDR_AFF))
                return 1;
 
        return 0;
@@ -243,6 +247,7 @@ cpu_attach(struct device *parent, struct
                ci->ci_next = cpu_info_list->ci_next;
                cpu_info_list->ci_next = ci;
                ci->ci_flags |= CPUF_AP;
+               ncpus++;
        }
 #endif
 
@@ -429,7 +434,6 @@ cpu_start_secondary(struct cpu_info *ci)
        uint64_t tcr;
        int s;
 
-       ncpus++;
        ci->ci_flags |= CPUF_PRESENT;
        __asm volatile("dsb sy");
 

Reply via email to