|
@@ -193,71 +193,29 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
|
|
|
}
|
|
|
EXPORT_SYMBOL(smp_call_function_single);
|
|
|
|
|
|
-static void do_send_stop(void)
|
|
|
+void smp_send_stop(void)
|
|
|
{
|
|
|
int cpu, rc;
|
|
|
|
|
|
- /* stop all processors */
|
|
|
- for_each_online_cpu(cpu) {
|
|
|
- if (cpu == smp_processor_id())
|
|
|
- continue;
|
|
|
- do {
|
|
|
- rc = signal_processor(cpu, sigp_stop);
|
|
|
- } while (rc == sigp_busy);
|
|
|
- }
|
|
|
-}
|
|
|
+ /* Disable all interrupts/machine checks */
|
|
|
+ __load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK);
|
|
|
|
|
|
-static void do_store_status(void)
|
|
|
-{
|
|
|
- int cpu, rc;
|
|
|
+ /* write magic number to zero page (absolute 0) */
|
|
|
+ lowcore_ptr[smp_processor_id()]->panic_magic = __PANIC_MAGIC;
|
|
|
|
|
|
- /* store status of all processors in their lowcores (real 0) */
|
|
|
+ /* stop all processors */
|
|
|
for_each_online_cpu(cpu) {
|
|
|
if (cpu == smp_processor_id())
|
|
|
continue;
|
|
|
do {
|
|
|
- rc = signal_processor_p(
|
|
|
- (__u32)(unsigned long) lowcore_ptr[cpu], cpu,
|
|
|
- sigp_store_status_at_address);
|
|
|
+ rc = signal_processor(cpu, sigp_stop);
|
|
|
} while (rc == sigp_busy);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-static void do_wait_for_stop(void)
|
|
|
-{
|
|
|
- int cpu;
|
|
|
-
|
|
|
- /* Wait for all other cpus to enter stopped state */
|
|
|
- for_each_online_cpu(cpu) {
|
|
|
- if (cpu == smp_processor_id())
|
|
|
- continue;
|
|
|
while (!smp_cpu_not_running(cpu))
|
|
|
cpu_relax();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * this function sends a 'stop' sigp to all other CPUs in the system.
|
|
|
- * it goes straight through.
|
|
|
- */
|
|
|
-void smp_send_stop(void)
|
|
|
-{
|
|
|
- /* Disable all interrupts/machine checks */
|
|
|
- __load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK);
|
|
|
-
|
|
|
- /* write magic number to zero page (absolute 0) */
|
|
|
- lowcore_ptr[smp_processor_id()]->panic_magic = __PANIC_MAGIC;
|
|
|
-
|
|
|
- /* stop other processors. */
|
|
|
- do_send_stop();
|
|
|
-
|
|
|
- /* wait until other processors are stopped */
|
|
|
- do_wait_for_stop();
|
|
|
-
|
|
|
- /* store status of other processors. */
|
|
|
- do_store_status();
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Reboot, halt and power_off routines for SMP.
|
|
|
*/
|