|
@@ -553,7 +553,7 @@ out:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static void ipl_run(struct shutdown_trigger *trigger)
|
|
|
+static void __ipl_run(void *unused)
|
|
|
{
|
|
|
diag308(DIAG308_IPL, NULL);
|
|
|
if (MACHINE_IS_VM)
|
|
@@ -562,6 +562,11 @@ static void ipl_run(struct shutdown_trigger *trigger)
|
|
|
reipl_ccw_dev(&ipl_info.data.ccw.dev_id);
|
|
|
}
|
|
|
|
|
|
+static void ipl_run(struct shutdown_trigger *trigger)
|
|
|
+{
|
|
|
+ smp_switch_to_ipl_cpu(__ipl_run, NULL);
|
|
|
+}
|
|
|
+
|
|
|
static int __init ipl_init(void)
|
|
|
{
|
|
|
int rc;
|
|
@@ -1039,7 +1044,7 @@ static void get_ipl_string(char *dst, struct ipl_parameter_block *ipb,
|
|
|
sprintf(dst + pos, " PARM %s", vmparm);
|
|
|
}
|
|
|
|
|
|
-static void reipl_run(struct shutdown_trigger *trigger)
|
|
|
+static void __reipl_run(void *unused)
|
|
|
{
|
|
|
struct ccw_dev_id devid;
|
|
|
static char buf[128];
|
|
@@ -1087,6 +1092,11 @@ static void reipl_run(struct shutdown_trigger *trigger)
|
|
|
disabled_wait((unsigned long) __builtin_return_address(0));
|
|
|
}
|
|
|
|
|
|
+static void reipl_run(struct shutdown_trigger *trigger)
|
|
|
+{
|
|
|
+ smp_switch_to_ipl_cpu(__reipl_run, NULL);
|
|
|
+}
|
|
|
+
|
|
|
static void reipl_block_ccw_init(struct ipl_parameter_block *ipb)
|
|
|
{
|
|
|
ipb->hdr.len = IPL_PARM_BLK_CCW_LEN;
|
|
@@ -1369,20 +1379,18 @@ static struct kobj_attribute dump_type_attr =
|
|
|
|
|
|
static struct kset *dump_kset;
|
|
|
|
|
|
-static void dump_run(struct shutdown_trigger *trigger)
|
|
|
+static void __dump_run(void *unused)
|
|
|
{
|
|
|
struct ccw_dev_id devid;
|
|
|
static char buf[100];
|
|
|
|
|
|
switch (dump_method) {
|
|
|
case DUMP_METHOD_CCW_CIO:
|
|
|
- smp_send_stop();
|
|
|
devid.devno = dump_block_ccw->ipl_info.ccw.devno;
|
|
|
devid.ssid = 0;
|
|
|
reipl_ccw_dev(&devid);
|
|
|
break;
|
|
|
case DUMP_METHOD_CCW_VM:
|
|
|
- smp_send_stop();
|
|
|
sprintf(buf, "STORE STATUS");
|
|
|
__cpcmd(buf, NULL, 0, NULL);
|
|
|
sprintf(buf, "IPL %X", dump_block_ccw->ipl_info.ccw.devno);
|
|
@@ -1396,10 +1404,17 @@ static void dump_run(struct shutdown_trigger *trigger)
|
|
|
diag308(DIAG308_SET, dump_block_fcp);
|
|
|
diag308(DIAG308_DUMP, NULL);
|
|
|
break;
|
|
|
- case DUMP_METHOD_NONE:
|
|
|
- return;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
- printk(KERN_EMERG "Dump failed!\n");
|
|
|
+}
|
|
|
+
|
|
|
+static void dump_run(struct shutdown_trigger *trigger)
|
|
|
+{
|
|
|
+ if (dump_method == DUMP_METHOD_NONE)
|
|
|
+ return;
|
|
|
+ smp_send_stop();
|
|
|
+ smp_switch_to_ipl_cpu(__dump_run, NULL);
|
|
|
}
|
|
|
|
|
|
static int __init dump_ccw_init(void)
|