[S390] Add PSW restart shutdown trigger
With this patch a new S390 shutdown trigger "restart" is added. If under z/VM "systerm restart" is entered or under the HMC the "PSW restart" button is pressed, the PSW located at 0 (31 bit) or 0x1a0 (64 bit) bit is loaded. Now we execute do_restart() that processes the restart action that is defined under /sys/firmware/shutdown_actions/on_restart. Currently the following actions are possible: reipl (default), stop, vmcmd, dump, and dump_reipl. Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:

committed by
Heiko Carstens

parent
944291de33
commit
7dd6b3343f
@@ -45,11 +45,13 @@
|
||||
* - halt
|
||||
* - power off
|
||||
* - reipl
|
||||
* - restart
|
||||
*/
|
||||
#define ON_PANIC_STR "on_panic"
|
||||
#define ON_HALT_STR "on_halt"
|
||||
#define ON_POFF_STR "on_poff"
|
||||
#define ON_REIPL_STR "on_reboot"
|
||||
#define ON_RESTART_STR "on_restart"
|
||||
|
||||
struct shutdown_action;
|
||||
struct shutdown_trigger {
|
||||
@@ -1544,17 +1546,20 @@ static char vmcmd_on_reboot[128];
|
||||
static char vmcmd_on_panic[128];
|
||||
static char vmcmd_on_halt[128];
|
||||
static char vmcmd_on_poff[128];
|
||||
static char vmcmd_on_restart[128];
|
||||
|
||||
DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);
|
||||
DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);
|
||||
DEFINE_IPL_ATTR_STR_RW(vmcmd, on_halt, "%s\n", "%s\n", vmcmd_on_halt);
|
||||
DEFINE_IPL_ATTR_STR_RW(vmcmd, on_poff, "%s\n", "%s\n", vmcmd_on_poff);
|
||||
DEFINE_IPL_ATTR_STR_RW(vmcmd, on_restart, "%s\n", "%s\n", vmcmd_on_restart);
|
||||
|
||||
static struct attribute *vmcmd_attrs[] = {
|
||||
&sys_vmcmd_on_reboot_attr.attr,
|
||||
&sys_vmcmd_on_panic_attr.attr,
|
||||
&sys_vmcmd_on_halt_attr.attr,
|
||||
&sys_vmcmd_on_poff_attr.attr,
|
||||
&sys_vmcmd_on_restart_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -1576,6 +1581,8 @@ static void vmcmd_run(struct shutdown_trigger *trigger)
|
||||
cmd = vmcmd_on_halt;
|
||||
else if (strcmp(trigger->name, ON_POFF_STR) == 0)
|
||||
cmd = vmcmd_on_poff;
|
||||
else if (strcmp(trigger->name, ON_RESTART_STR) == 0)
|
||||
cmd = vmcmd_on_restart;
|
||||
else
|
||||
return;
|
||||
|
||||
@@ -1707,6 +1714,34 @@ static void do_panic(void)
|
||||
stop_run(&on_panic_trigger);
|
||||
}
|
||||
|
||||
/* on restart */
|
||||
|
||||
static struct shutdown_trigger on_restart_trigger = {ON_RESTART_STR,
|
||||
&reipl_action};
|
||||
|
||||
static ssize_t on_restart_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return sprintf(page, "%s\n", on_restart_trigger.action->name);
|
||||
}
|
||||
|
||||
static ssize_t on_restart_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
return set_trigger(buf, &on_restart_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_restart_attr =
|
||||
__ATTR(on_restart, 0644, on_restart_show, on_restart_store);
|
||||
|
||||
void do_restart(void)
|
||||
{
|
||||
smp_send_stop();
|
||||
on_restart_trigger.action->fn(&on_restart_trigger);
|
||||
stop_run(&on_restart_trigger);
|
||||
}
|
||||
|
||||
/* on halt */
|
||||
|
||||
static struct shutdown_trigger on_halt_trigger = {ON_HALT_STR, &stop_action};
|
||||
@@ -1783,7 +1818,9 @@ static void __init shutdown_triggers_init(void)
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_poff_attr.attr))
|
||||
goto fail;
|
||||
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_restart_attr.attr))
|
||||
goto fail;
|
||||
return;
|
||||
fail:
|
||||
panic("shutdown_triggers_init failed\n");
|
||||
|
Reference in New Issue
Block a user