/* * __cpu_disable runs on the processor to be shutdown. */ int __cpu_disable(void) { unsigned int cpu = smp_processor_id(); int ret; ret = op_cpu_disable(cpu); if (ret) return ret; /* * Take this CPU offline. Once we clear this, we can't return, * and we must not schedule until we're ready to give up the cpu. */ set_cpu_online(cpu, false); /* * OK - migrate IRQs away from this CPU */ migrate_irqs(); /* * Stop the local timer for this CPU. */ percpu_timer_stop(); /* * Remove this CPU from the vm mask set of all processes. */ clear_tasks_mm_cpumask(cpu); return 0; }
int jzsoc_cpu_disable(void) { unsigned int cpu = smp_processor_id(); // unsigned int status; if (cpu == 0) /* FIXME */ return -EBUSY; cpu_clear(cpu, cpu_online_map); cpu_clear(cpu, cpu_callin_map); local_irq_disable(); percpu_timer_stop(); cpu_reim &= ~(1 << cpu); smp_disable_interrupt(cpu); smp_enable_interrupt(0); reset_irq_resp_fifo(cpu); return 0; }