int (*probe)(void);
        int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
+       int (*apic_id_valid)(int apicid);
        int (*apic_id_registered)(void);
 
        u32 irq_delivery_mode;
        return apic->get_apic_id(reg);
 }
 
+static inline int default_apic_id_valid(int apicid)
+{
+       return x2apic_mode || (apicid < 255);
+}
+
 extern void default_setup_apic_routing(void);
 
 extern struct apic apic_noop;
 
        .name                           = "flat",
        .probe                          = flat_probe,
        .acpi_madt_oem_check            = flat_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = flat_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
        .name                           = "physical flat",
        .probe                          = physflat_probe,
        .acpi_madt_oem_check            = physflat_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = flat_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
        .probe                          = noop_probe,
        .acpi_madt_oem_check            = NULL,
 
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = noop_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
 
        return get_apic_id(apic_read(APIC_ID));
 }
 
+static int numachip_apic_id_valid(int apicid)
+{
+       /* Trust what bootloader passes in MADT */
+       return 1;
+}
+
 static int numachip_apic_id_registered(void)
 {
        return physid_isset(read_xapic_id(), phys_cpu_present_map);
 }
 early_initcall(numachip_system_init);
 
-static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
+static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 {
        if (!strncmp(oem_id, "NUMASC", 6)) {
                numachip_system = 1;
+               setup_force_cpu_cap(X86_FEATURE_X2APIC);
                return 1;
        }
 
        .name                           = "NumaConnect system",
        .probe                          = numachip_probe,
        .acpi_madt_oem_check            = numachip_acpi_madt_oem_check,
+       .apic_id_valid                  = numachip_apic_id_valid,
        .apic_id_registered             = numachip_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
        .name                           = "bigsmp",
        .probe                          = probe_bigsmp,
        .acpi_madt_oem_check            = NULL,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = bigsmp_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
        .name                           = "es7000",
        .probe                          = probe_es7000,
        .acpi_madt_oem_check            = es7000_acpi_madt_oem_check_cluster,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = es7000_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
        .name                           = "es7000",
        .probe                          = probe_es7000,
        .acpi_madt_oem_check            = es7000_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = es7000_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
        .name                           = "NUMAQ",
        .probe                          = probe_numaq,
        .acpi_madt_oem_check            = NULL,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = numaq_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
 
        .name                           = "default",
        .probe                          = probe_default,
        .acpi_madt_oem_check            = NULL,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = default_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
 
        .name                           = "summit",
        .probe                          = probe_summit,
        .acpi_madt_oem_check            = summit_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = summit_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
 
        .name                           = "cluster x2apic",
        .probe                          = x2apic_cluster_probe,
        .acpi_madt_oem_check            = x2apic_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = x2apic_apic_id_registered,
 
        .irq_delivery_mode              = dest_LowestPrio,
 
        .name                           = "physical x2apic",
        .probe                          = x2apic_phys_probe,
        .acpi_madt_oem_check            = x2apic_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = x2apic_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
        .name                           = "UV large system",
        .probe                          = uv_probe,
        .acpi_madt_oem_check            = uv_acpi_madt_oem_check,
+       .apic_id_valid                  = default_apic_id_valid,
        .apic_id_registered             = uv_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
 
 
        if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid ||
            !physid_isset(apicid, phys_cpu_present_map) ||
-           (!x2apic_mode && apicid >= 255)) {
+           !apic->apic_id_valid(apicid)) {
                printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu);
                return -EINVAL;
        }