Defer mptable_pass1() from mp_probe() to mp_enable()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 12 Jun 2009 08:36:45 +0000 (16:36 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 12 Jun 2009 11:07:54 +0000 (19:07 +0800)
sys/platform/pc32/i386/mp_machdep.c

index e042a13..7407731 100644 (file)
@@ -362,13 +362,7 @@ mp_probe(void)
        return 0;
 
 found:
-       /*
-        * Calculate needed resources.  We can safely map physical
-        * memory into SMPpt after mptable_pass1() completes.
-        */
        mpfps = (mpfps_t)x;
-       mptable_pass1();
-
        return 1;
 }
 
@@ -503,23 +497,29 @@ mp_enable(u_int boot_addr)
 
        POSTCODE(MP_ENABLE_POST);
 
-       if (cpu_apic_address == 0)
-               panic("pmap_bootstrap: no local apic!");
-
-       /* local apic is mapped on last page */
-       SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N |
-           pmap_get_pgeflag() | (cpu_apic_address & PG_FRAME));
-
        /* turn on 4MB of V == P addressing so we can get to MP table */
        *(int *)PTD = PG_V | PG_RW | ((uintptr_t)(void *)KPTphys & PG_FRAME);
        cpu_invltlb();
 
+       /*
+        * We can safely map physical memory into SMPpt after
+        * mptable_pass1() completes.
+        */
+       mptable_pass1();
+
+       if (cpu_apic_address == 0)
+               panic("mp_enable: no local apic!");
+
        /* examine the MP table for needed info, uses physical addresses */
        x = mptable_pass2();
 
        *(int *)PTD = 0;
        cpu_invltlb();
 
+       /* local apic is mapped on last page */
+       SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N |
+           pmap_get_pgeflag() | (cpu_apic_address & PG_FRAME));
+
        /* can't process default configs till the CPU APIC is pmapped */
        if (x)
                default_mp_table(x);
@@ -708,6 +708,9 @@ mptable_pass1(void)
 
        POSTCODE(MPTABLE_PASS1_POST);
 
+       if (mpfps == NULL)
+               panic("mptable_pass1: MP float pointer is not found\n");
+
 #ifdef APIC_IO
        /* clear various tables */
        for (x = 0; x < NAPICID; ++x) {