__setup("apicpmtimer", setup_apicpmtimer);
 #endif
 
-unsigned long mp_lapic_addr __ro_after_init;
+static unsigned long mp_lapic_addr __ro_after_init;
 bool apic_is_disabled __ro_after_init;
 /* Disable local APIC timer from the kernel commandline or via dmi quirk */
 static int disable_apic_timer __initdata;
                return false;
        }
 
-       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
+       register_lapic_address(APIC_DEFAULT_PHYS_BASE);
        return true;
 }
 #else
 
-static bool __init apic_verify(void)
+static bool __init apic_verify(unsigned long addr)
 {
        u32 features, h, l;
 
                return false;
        }
        set_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC);
-       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
 
        /* The BIOS may have set up the APIC at some other address */
        if (boot_cpu_data.x86 >= 6) {
                rdmsr(MSR_IA32_APICBASE, l, h);
                if (l & MSR_IA32_APICBASE_ENABLE)
-                       mp_lapic_addr = l & MSR_IA32_APICBASE_BASE;
+                       addr = l & MSR_IA32_APICBASE_BASE;
        }
 
+       register_lapic_address(addr);
        pr_info("Found and enabled local APIC!\n");
        return true;
 }
                        enabled_via_apicbase = 1;
                }
        }
-       return apic_verify();
+       return apic_verify(addr);
 }
 
 /*
                if (!apic_force_enable(APIC_DEFAULT_PHYS_BASE))
                        return false;
        } else {
-               if (!apic_verify())
+               if (!apic_verify(APIC_DEFAULT_PHYS_BASE))
                        return false;
        }
 
        if (x2apic_mode)
                return;
 
-       /* If no local APIC can be found return early */
        if (!smp_found_config && !detect_init_APIC()) {
-               /* lets NOP'ify apic operations */
                pr_info("APIC: disable apic facility\n");
                apic_disable();
-       } else {
-               apic_phys = mp_lapic_addr;
-
-               /*
-                * If the system has ACPI MADT tables or MP info, the LAPIC
-                * address is already registered.
-                */
-               if (!acpi_lapic && !smp_found_config)
-                       register_lapic_address(apic_phys);
        }
 }
 
 static __init void apic_set_fixmap(void)
 {
        set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
-       apic_mmio_base = APIC_BASE;
+       apic_phys = apic_mmio_base = APIC_BASE;
        apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
                    apic_mmio_base, mp_lapic_addr);
        apic_read_boot_cpu_id(false);
 
 void __init register_lapic_address(unsigned long address)
 {
+       /* This should only happen once */
+       WARN_ON_ONCE(mp_lapic_addr);
        mp_lapic_addr = address;
 
        if (!x2apic_mode)
 
        int linttypes[2] = { mp_ExtINT, mp_NMI };
        int i;
 
-       /*
-        * local APIC has default address
-        */
-       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-
        /*
         * 2 CPUs, numbered 0 & 1.
         */
         */
        if (mpf->feature1) {
                if (early) {
-                       /*
-                        * local APIC has default address
-                        */
-                       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
+                       /* Local APIC has default address */
+                       register_lapic_address(APIC_DEFAULT_PHYS_BASE);
                        goto out;
                }