x86: Remove ncleft initialization in mpinit
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 06:51:31 +0000 (02:51 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 07:05:13 +0000 (03:05 -0400)
The intent of this code is probably to say "give me how many cores
total, and I'll take away some and return how many I didn't account
for".  It would do that, except in error conditions, it would return
254, which currently is maxcores - 1.  So on error, it would say it
found one core, which seems buggy.

Incidentally, a little while ago I saw a machine that we thought had 9
cores.  Possibly its MP tables were messed up, and it only had 8 cores?
The reported value could have been 8 + (buggy) 1 in that case.

kern/arch/x86/mp.c

index 32dbbcc..4b6c1bd 100644 (file)
@@ -415,13 +415,13 @@ static void *sigsearch(char *signature)
 int mpsinit(int maxcores)
 {
        uint8_t *p;
-       int i, n, ncleft = 254;
+       int i, n;
        _MP_ *mp;
        PCMP *pcmp;
 
        if ((mp = sigsearch("_MP_")) == NULL) {
                printk("No mp tables found, might have issues!\n");
-               return ncleft;
+               return maxcores;
        }
        /* TODO: if an IMCR exists, we should set it to 1, though i've heard that
         * ACPI-capable HW doesn't have the IMCR anymore. */
@@ -434,19 +434,19 @@ int mpsinit(int maxcores)
                printk("\n");
        }
        if (mp->revision != 1 && mp->revision != 4)
-               return ncleft;
+               return maxcores;
        if (sigchecksum(mp, mp->length * 16) != 0)
-               return ncleft;
+               return maxcores;
        if ((pcmp = KADDR_NOCHECK(l32get(mp->addr))) == NULL)
-               return ncleft;
+               return maxcores;
        if (pcmp->revision != 1 && pcmp->revision != 4) {
-               return ncleft;
+               return maxcores;
        }
        n = l16get(pcmp->length) + l16get(pcmp->xlength);
        if ((pcmp = KADDR_NOCHECK(l32get(mp->addr))) == NULL)
-               return ncleft;
+               return maxcores;
        if (sigchecksum(pcmp, l16get(pcmp->length)) != 0) {
-               return ncleft;
+               return maxcores;
        }
        if (MP_VERBOSE_DEBUG) {
                printk("PCMP @ %#p length %p revision %d\n",
@@ -465,7 +465,7 @@ int mpsinit(int maxcores)
                i = sigchecksum(p, l16get(pcmp->xlength));
                if (((i + pcmp->xchecksum) & 0xff) != 0) {
                        printd("extended table checksums to %p\n", i);
-                       return ncleft;
+                       return maxcores;
                }
        }
 
@@ -474,10 +474,5 @@ int mpsinit(int maxcores)
         * for later interrupt enabling and application processor
         * startup.
         */
-       ncleft = mpparse(pcmp, maxcores);
-       return ncleft;
-//  mpacpi(ncleft);
-
-//  apicdump();
-//  ioapicdump();
+       return mpparse(pcmp, maxcores);
 }