On 26/11/2010, at 9:04 AM, Kenneth R Westerback wrote: > On Thu, Nov 25, 2010 at 02:13:35PM +0100, Mark Kettenis wrote: >>> From: David Gwynne <l...@animata.net> >>> >>> without this diff this box panics on boot while attaching the 36th >>> cpu. its a buffer overrun... >>> >>> analysis done by kettenis. >>> >>> ok? >> >> I think the check should involve MAXCPUS. Your diff makes clear >> though that simply bumping MAXCPUS to 64 isn't going to fly. At the >> very least cpus_attached needs to be changed into a 64-bit integer. >> >>> Index: cpu.c >>> =================================================================== >>> RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v >>> retrieving revision 1.38 >>> diff -u -p -r1.38 cpu.c >>> --- cpu.c 13 Nov 2010 04:16:42 -0000 1.38 >>> +++ cpu.c 24 Nov 2010 13:04:30 -0000 >>> @@ -168,6 +168,9 @@ cpu_match(struct device *parent, void *m >>> struct cfdata *cf = match; >>> struct cpu_attach_args *caa = aux; >>> >>> + if (~cpus_attached == 0) >>> + return 0; >>> + >>> if (strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0) >>> return 1; >>> return 0; >> > > Hmmm. I can't actually find any *use* of cpus_attached. Is it a relic? > > The diff below compiles and runs fine on my 6-proc amd64 box.
make sense to me. ok (for what my ok counts for in this area). dlg > > .... Ken > > 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 > > /*