On Thu, Nov 25, 2010 at 06:04:23PM -0500, Kenneth R Westerback wrote: > Index: amd64/cpu.c > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v > retrieving revision 1.38 > diff -u -p -r1.38 cpu.c > --- amd64/cpu.c 13 Nov 2010 04:16:42 -0000 1.38 > +++ amd64/cpu.c 25 Nov 2010 23:00:44 -0000 > @@ -135,8 +135,6 @@ struct cpu_info cpu_info_primary = { 0, > > struct cpu_info *cpu_info_list = &cpu_info_primary; > > -u_int32_t cpus_attached = 0; > - > #ifdef MULTIPROCESSOR > /* > * Array of CPU info structures. Must be statically-allocated because > @@ -345,8 +343,6 @@ cpu_attach(struct device *parent, struct > panic("unknown processor type??"); > } > cpu_vm_init(ci); > - > - cpus_attached |= (1 << ci->ci_cpuid); > > #if defined(MULTIPROCESSOR) > if (mp_verbose) { > Index: include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v > retrieving revision 1.60 > diff -u -p -r1.60 cpu.h > --- include/cpu.h 22 Nov 2010 21:07:18 -0000 1.60 > +++ include/cpu.h 25 Nov 2010 23:00:44 -0000 > @@ -211,8 +211,6 @@ extern struct cpu_info cpu_info_primary; > > #define aston(p) ((p)->p_md.md_astpending = 1) > > -extern u_int32_t cpus_attached; > - > #define curpcb curcpu()->ci_curpcb > > /*
this should follow krws diff above. information about each cpu is stored in a statically sized array. if we have more physical cpus than entries in that array, we currently start storing cpu_info structures in unowned memory after that array. this leads to Bad Things(tm). MAXCPUs should be bumped up on amd64, but we should also avoid panicking on ridiculously overspecced boxes. i am sure i will regret claiming that a 48core machine is overspecced in the very near future though. Index: amd64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v retrieving revision 1.38 diff -u -p -r1.38 cpu.c --- amd64/cpu.c 13 Nov 2010 04:16:42 -0000 1.38 +++ amd64/cpu.c 26 Nov 2010 06:31:53 -0000 @@ -167,10 +165,24 @@ cpu_match(struct device *parent, void *m { struct cfdata *cf = match; struct cpu_attach_args *caa = aux; + int cpunum; - if (strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0) + /* + * we cannot attach more cpus than we are set up to store in the + * cpu_info array, so fail to match if we have more cpus than slots + * in the array. + */ + + for (cpunum = 0; cpunum < nitems(cpu_info); cpunum++) { + if (cpu_info[cpunum] == NULL) + break; + } + + if (cpunum < nitems(cpu_info) && + strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0) return 1; - return 0; + + return (0); } static void