ref: 41383ad0120630edd42c5c897a287e2f9d9161b4
parent: dd8908cff003135095996d2b0b5ea250c615a0e2
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jan 5 00:32:40 EST 2016
kernel: change active.machs from bitmap to char array to support up to 64 cpus on pc64
--- a/sys/src/9/alphapc/dat.h
+++ b/sys/src/9/alphapc/dat.h
@@ -184,8 +184,8 @@
struct
{
Lock;
- short machs;
- short exiting;
+ char machs[MAXMACH];
+ int exiting;
}active;
/*
--- a/sys/src/9/alphapc/main.c
+++ b/sys/src/9/alphapc/main.c
@@ -156,7 +156,7 @@
m->machno = n;
active.exiting = 0;
- active.machs = 1;
+ active.machs[0] = 1;
cpu = (Hwcpu*) ((ulong)hwrpb + hwrpb->cpuoff + n*hwrpb->cpulen);
cpu->state &= ~Cpubootinprog;
--- a/sys/src/9/alphapc/trap.c
+++ b/sys/src/9/alphapc/trap.c
@@ -261,8 +261,8 @@
*/
iprint("cpu%d: spurious interrupt %d, last %d",
m->machno, vno-VectorPIC, m->lastintr);
- for(i = 0; i < 32; i++){
- if(!(active.machs & (1<<i)))
+ for(i = 0; i < MAXMACH; i++){
+ if(active.machs[i] == 0)
continue;
mach = MACHP(i);
if(m->machno == mach->machno)
--- a/sys/src/9/bcm/dat.h
+++ b/sys/src/9/bcm/dat.h
@@ -223,7 +223,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
--- a/sys/src/9/bcm/main.c
+++ b/sys/src/9/bcm/main.c
@@ -199,7 +199,7 @@
conf.nmach = 1;
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
up = nil;
--- a/sys/src/9/bitsy/dat.h
+++ b/sys/src/9/bitsy/dat.h
@@ -178,7 +178,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
--- a/sys/src/9/bitsy/main.c
+++ b/sys/src/9/bitsy/main.c
@@ -26,7 +26,7 @@
memset(m, 0, sizeof(Mach));
m->ticks = 1;
- active.machs = 1;
+ active.machs[0] = 1;
rs232power(1);
quotefmtinstall();
--- a/sys/src/9/kw/dat.h
+++ b/sys/src/9/kw/dat.h
@@ -194,7 +194,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
--- a/sys/src/9/kw/main.c
+++ b/sys/src/9/kw/main.c
@@ -349,7 +349,7 @@
conf.nmach = 1;
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
up = nil;
--- a/sys/src/9/mtx/dat.h
+++ b/sys/src/9/mtx/dat.h
@@ -181,8 +181,8 @@
struct
{
Lock;
- short machs;
- short exiting;
+ char machs[MAXMACH];
+ int exiting;
}active;
/*
--- a/sys/src/9/mtx/main.c
+++ b/sys/src/9/mtx/main.c
@@ -59,7 +59,7 @@
/* turn on caches */
puthid0(gethid0() | BIT(16) | BIT(17));
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
}
--- a/sys/src/9/omap/dat.h
+++ b/sys/src/9/omap/dat.h
@@ -216,7 +216,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
--- a/sys/src/9/omap/main.c
+++ b/sys/src/9/omap/main.c
@@ -295,7 +295,7 @@
conf.nmach = 1;
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
up = nil;
--- a/sys/src/9/pc/dat.h
+++ b/sys/src/9/pc/dat.h
@@ -270,7 +270,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
int thunderbirdsarego; /* lets the added processors continue to schedinit */
}active;
--- a/sys/src/9/pc/main.c
+++ b/sys/src/9/pc/main.c
@@ -181,7 +181,7 @@
machinit();
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
}
--- a/sys/src/9/pc/mmu.c
+++ b/sys/src/9/pc/mmu.c
@@ -685,7 +685,7 @@
for(i=0; i<conf.nmach; i++){
nm = MACHP(i);
if(nm != m)
- while((active.machs&(1<<nm->machno)) && nm->flushmmu)
+ while(active.machs[nm->machno] && nm->flushmmu)
;
}
}
--- a/sys/src/9/pc/mp.c
+++ b/sys/src/9/pc/mp.c
@@ -198,6 +198,8 @@
for(i=0; i<nelem(mpapic); i++){
if((apic = mpapic[i]) == nil)
continue;
+ if(apic->machno >= MAXMACH)
+ continue;
if(ncpu <= 1)
break;
if((apic->flags & (PcmpBP|PcmpEN)) == PcmpEN){
@@ -574,7 +576,7 @@
for(;;) idle();
}
- print("mpshutdown: active = %#8.8ux\n", active.machs);
+ print("mpshutdown\n");
delay(1000);
splhi();
--- a/sys/src/9/pc/squidboy.c
+++ b/sys/src/9/pc/squidboy.c
@@ -30,7 +30,7 @@
fpoff();
lock(&active);
- active.machs |= 1<<m->machno;
+ active.machs[m->machno] = 1;
unlock(&active);
while(!active.thunderbirdsarego)
--- a/sys/src/9/pc/trap.c
+++ b/sys/src/9/pc/trap.c
@@ -400,8 +400,8 @@
if(0)print("cpu%d: spurious interrupt %d, last %d\n",
m->machno, vno, m->lastintr);
if(0)if(conf.nmach > 1){
- for(i = 0; i < 32; i++){
- if(!(active.machs & (1<<i)))
+ for(i = 0; i < MAXMACH; i++){
+ if(active.machs[i] == 0)
continue;
mach = MACHP(i);
if(m->machno == mach->machno)
--- a/sys/src/9/pc64/dat.h
+++ b/sys/src/9/pc64/dat.h
@@ -233,7 +233,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* bitmap of active CPUs */
int exiting; /* shutdown */
int thunderbirdsarego; /* lets the added processors continue to schedinit */
}active;
--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -326,7 +326,7 @@
machinit();
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
}
--- a/sys/src/9/pc64/mem.h
+++ b/sys/src/9/pc64/mem.h
@@ -28,7 +28,7 @@
#define BLOCKALIGN 8
#define FPalign 16
-#define MAXMACH 32 /* max # cpus system can run */
+#define MAXMACH 64 /* max # cpus system can run */
#define KSTACK (16*KiB) /* Size of Proc kernel stack */
--- a/sys/src/9/pc64/squidboy.c
+++ b/sys/src/9/pc64/squidboy.c
@@ -24,7 +24,7 @@
timersinit();
lock(&active);
- active.machs |= 1<<m->machno;
+ active.machs[m->machno] = 1;
unlock(&active);
while(!active.thunderbirdsarego)
--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -394,8 +394,8 @@
if(0)print("cpu%d: spurious interrupt %d, last %d\n",
m->machno, vno, m->lastintr);
if(0)if(conf.nmach > 1){
- for(i = 0; i < 32; i++){
- if(!(active.machs & (1<<i)))
+ for(i = 0; i < MAXMACH; i++){
+ if(active.machs[i] == 0)
continue;
mach = MACHP(i);
if(m->machno == mach->machno)
--- a/sys/src/9/port/devcons.c
+++ b/sys/src/9/port/devcons.c
@@ -568,8 +568,8 @@
case Qsysstat:
b = smalloc(conf.nmach*(NUMSIZE*11+1) + 1); /* +1 for NUL */
bp = b;
- for(id = 0; id < 32; id++) {
- if(active.machs & (1<<id)) {
+ for(id = 0; id < MAXMACH; id++) {
+ if(active.machs[id]) {
mp = MACHP(id);
readnum(0, bp, NUMSIZE, id, NUMSIZE);
bp += NUMSIZE;
@@ -767,8 +767,8 @@
break;
case Qsysstat:
- for(id = 0; id < 32; id++) {
- if(active.machs & (1<<id)) {
+ for(id = 0; id < MAXMACH; id++) {
+ if(active.machs[id]) {
mp = MACHP(id);
mp->cs = 0;
mp->intr = 0;
@@ -1051,8 +1051,8 @@
int ms, once;
lock(&active);
- once = active.machs & (1<<m->machno);
- active.machs &= ~(1<<m->machno);
+ once = active.machs[m->machno];
+ active.machs[m->machno] = 0;
active.exiting = 1;
unlock(&active);
@@ -1063,7 +1063,7 @@
spllo();
for(ms = 5*1000; ms > 0; ms -= TK2MS(2)){
delay(TK2MS(2));
- if(active.machs == 0 && consactive() == 0)
+ if(memchr(active.machs, 1, MAXMACH) == nil && consactive() == 0)
break;
}
}
--- a/sys/src/9/port/portclock.c
+++ b/sys/src/9/port/portclock.c
@@ -145,7 +145,7 @@
if(kproftimer != nil)
kproftimer(ur->pc);
- if((active.machs&(1<<m->machno)) == 0)
+ if(active.machs[m->machno] == 0)
return;
if(active.exiting)
--- a/sys/src/9/ppc/dat.h
+++ b/sys/src/9/ppc/dat.h
@@ -189,8 +189,8 @@
struct
{
Lock;
- short machs;
- short exiting;
+ char machs[MAXMACH];
+ int exiting;
}active;
/*
--- a/sys/src/9/ppc/m8260.c
+++ b/sys/src/9/ppc/m8260.c
@@ -214,7 +214,7 @@
vco 198
*/
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
putmsr(getmsr() | MSR_ME);
--- a/sys/src/9/ppc/msaturn.c
+++ b/sys/src/9/ppc/msaturn.c
@@ -140,7 +140,7 @@
m->cpuhz = 200000000; /* 750FX? */
m->cyclefreq = m->bushz / 4;
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
putmsr(getmsr() | MSR_ME);
--- a/sys/src/9/sgi/dat.h
+++ b/sys/src/9/sgi/dat.h
@@ -204,7 +204,7 @@
struct
{
Lock;
- long machs; /* bitmap of processors */
+ char machs[MAXMACH]; /* active cpus */
short exiting;
}active;
--- a/sys/src/9/sgi/main.c
+++ b/sys/src/9/sgi/main.c
@@ -172,7 +172,7 @@
confinit();
machinit(); /* calls clockinit */
active.exiting = 0;
- active.machs = 1;
+ active.machs[0] = 1;
print("\nPlan 9\n");
kmapinit();
--- a/sys/src/9/teg2/archtegra.c
+++ b/sys/src/9/teg2/archtegra.c
@@ -676,7 +676,7 @@
Power *pwr;
up = nil;
- if (active.machs & (1<<m->machno)) {
+ if (active.machs[m->machno]) {
serialputc('?');
serialputc('r');
panic("cpu%d: resetting after start", m->machno);
--- a/sys/src/9/teg2/dat.h
+++ b/sys/src/9/teg2/dat.h
@@ -246,7 +246,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int wfi; /* bitmap of CPUs in WFI state */
int stopped; /* bitmap of CPUs stopped */
int exiting; /* shutdown */
--- a/sys/src/9/teg2/main.c
+++ b/sys/src/9/teg2/main.c
@@ -208,13 +208,10 @@
void
machon(uint cpu)
{
- ulong cpubit;
-
- cpubit = 1 << cpu;
lock(&active);
- if ((active.machs & cpubit) == 0) { /* currently off? */
+ if (active.machs[cpu] == 0) { /* currently off? */
+ active.machs[cpu] = 1;
conf.nmach++;
- active.machs |= cpubit;
}
unlock(&active);
}
@@ -223,13 +220,10 @@
void
machoff(uint cpu)
{
- ulong cpubit;
-
- cpubit = 1 << cpu;
lock(&active);
- if (active.machs & cpubit) { /* currently on? */
+ if (active.machs[cpu]) { /* currently on? */
+ active.machs[cpu] = 0;
conf.nmach--;
- active.machs &= ~cpubit;
}
unlock(&active);
}
--- a/sys/src/9/xen/main.c
+++ b/sys/src/9/xen/main.c
@@ -121,7 +121,7 @@
machinit();
- active.machs = 1;
+ active.machs[0] = 1;
active.exiting = 0;
}
--- a/sys/src/9/xen/trap.c
+++ b/sys/src/9/xen/trap.c
@@ -393,8 +393,8 @@
iprint("cpu%d: spurious interrupt %d, last %d\n",
m->machno, vno, m->lastintr);
if(0)if(conf.nmach > 1){
- for(i = 0; i < 32; i++){
- if(!(active.machs & (1<<i)))
+ for(i = 0; i < MAXMACH; i++){
+ if(active.machs[i] == 0)
continue;
mach = MACHP(i);
if(m->machno == mach->machno)
--- a/sys/src/9/zynq/dat.h
+++ b/sys/src/9/zynq/dat.h
@@ -175,7 +175,7 @@
struct
{
Lock;
- int machs; /* bitmap of active CPUs */
+ char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
--- a/sys/src/9/zynq/main.c
+++ b/sys/src/9/zynq/main.c
@@ -385,7 +385,7 @@
void
main(void)
{
- active.machs |= (1 << m->machno);
+ active.machs[m->machno] = 1;
if(m->machno != 0){
uartputs("\n", 1);
mmuinit();