MP table: Don't mix lapic/ioapic/imcr configuration information extraction
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 22 Jun 2009 10:42:34 +0000 (18:42 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 22 Jun 2009 11:39:56 +0000 (19:39 +0800)
sys/platform/pc32/i386/mp_machdep.c

index 24919fd..afdccd0 100644 (file)
@@ -648,34 +648,21 @@ mp_enable(u_int boot_addr)
        u_int   ux;
 #endif /* APIC_IO */
        vm_paddr_t mpfps_paddr;
+       struct mptable_pos mpt;
 
        POSTCODE(MP_ENABLE_POST);
 
-       if (madt_probe_test) {
+       /*
+        * Enumerate Local APIC
+        */
+       if (madt_probe_test)
                mpfps_paddr = 0;
-       } else {
+       else
                mpfps_paddr = mptable_probe();
-       }
-
        if (mpfps_paddr) {
-               struct mptable_pos mpt;
-
                mptable_map(&mpt, mpfps_paddr);
-
                mptable_lapic_enumerate(&mpt);
-
-               mptable_imcr(&mpt);
-
-               /*
-                * Examine the MP table for needed info
-                */
-               mptable_pass1(&mpt);
-               mptable_pass2(&mpt);
-
                mptable_unmap(&mpt);
-
-               /* Post scan cleanup */
-               mptable_fix();
        } else {
                vm_paddr_t madt_paddr;
                vm_offset_t lapic_addr;
@@ -696,8 +683,30 @@ mp_enable(u_int boot_addr)
                        panic("mp_enable: madt_pass2 failed\n");
        }
 
+       mpfps_paddr = mptable_probe();
+       if (mpfps_paddr) {
+               mptable_map(&mpt, mpfps_paddr);
+               mptable_imcr(&mpt);
+               mptable_unmap(&mpt);
+       }
 #if defined(APIC_IO)
 
+       if (!mpfps_paddr)
+               panic("no MP table, disable APIC_IO!\n");
+
+       mptable_map(&mpt, mpfps_paddr);
+
+       /*
+        * Examine the MP table for needed info
+        */
+       mptable_pass1(&mpt);
+       mptable_pass2(&mpt);
+
+       mptable_unmap(&mpt);
+
+       /* Post scan cleanup */
+       mptable_fix();
+
        setup_apic_irq_mapping();
 
        /* fill the LOGICAL io_apic_versions table */