int     apicid, ret;
 
        apicid = per_cpu(x86_cpu_to_apicid, cpu);
-       if (apicid == BAD_APICID) {
-               ret = -ENODEV;
-               goto exit;
-       }
 
        info.complete = &done;
        info.apicid = apicid;
 
 int __cpuinit native_cpu_up(unsigned int cpu)
 {
+       int apicid = cpu_present_to_apicid(cpu);
        unsigned long flags;
-#ifdef CONFIG_HOTPLUG_CPU
        int ret = 0;
 
+       WARN_ON(irqs_disabled());
+
+       Dprintk("++++++++++++++++++++=_---CPU UP  %u\n", cpu);
+
+       if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid ||
+           !physid_isset(apicid, phys_cpu_present_map)) {
+               printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu);
+               return -EINVAL;
+       }
+
+#ifdef CONFIG_HOTPLUG_CPU
+
        /*
         * We do warm boot only on cpus that had booted earlier
         * Otherwise cold boot is all handled from smp_boot_cpus().