--- a/sys/platform/vkernel64/platform/globaldata.c +++ b/sys/platform/vkernel64/platform/globaldata.c @@ -79,11 +79,13 @@ cpu_gdinit(struct mdglobaldata *gd, int cpu) *(void **)gd->mi.gd_idlethread.td_sp = cpu_idle_restore; } +/* + * Only slots for CPUs that were actually brought online have backing + * pages. The KVA window [CPU_prvspace, CPU_prvspace+SMP_MAXCPU) is + * merely *reserved* (init.c init_globaldata()/mp.c start_all_aps() map + * only ncpus slots), so do not bless the unmapped remainder. + */ int is_globaldata_space(vm_offset_t saddr, vm_offset_t eaddr) { if (saddr >= (vm_offset_t)&CPU_prvspace[0] && - eaddr <= (vm_offset_t)&CPU_prvspace[MAXCPU]) { + eaddr <= (vm_offset_t)&CPU_prvspace[ncpus]) { return (TRUE); } return (FALSE);