2 * Handle extern requests for shutdown, reboot and sysrq
5 #define pr_fmt(fmt) "xen:" KBUILD_MODNAME ": " fmt
7 #include <linux/kernel.h>
9 #include <linux/slab.h>
10 #include <linux/reboot.h>
11 #include <linux/sysrq.h>
12 #include <linux/stop_machine.h>
13 #include <linux/freezer.h>
14 #include <linux/syscore_ops.h>
15 #include <linux/export.h>
18 #include <xen/xenbus.h>
19 #include <xen/grant_table.h>
20 #include <xen/events.h>
21 #include <xen/hvc-console.h>
22 #include <xen/xen-ops.h>
24 #include <asm/xen/hypercall.h>
25 #include <asm/xen/page.h>
26 #include <asm/xen/hypervisor.h>
29 SHUTDOWN_INVALID
= -1,
30 SHUTDOWN_POWEROFF
= 0,
32 /* Code 3 is SHUTDOWN_CRASH, which we don't use because the domain can only
33 report a crash, not be instructed to crash!
34 HALT is the same as POWEROFF, as far as we're concerned. The tools use
35 the distinction when we return the reason code to them. */
39 /* Ignore multiple shutdown requests. */
40 static enum shutdown_state shutting_down
= SHUTDOWN_INVALID
;
46 static RAW_NOTIFIER_HEAD(xen_resume_notifier
);
48 void xen_resume_notifier_register(struct notifier_block
*nb
)
50 raw_notifier_chain_register(&xen_resume_notifier
, nb
);
52 EXPORT_SYMBOL_GPL(xen_resume_notifier_register
);
54 void xen_resume_notifier_unregister(struct notifier_block
*nb
)
56 raw_notifier_chain_unregister(&xen_resume_notifier
, nb
);
58 EXPORT_SYMBOL_GPL(xen_resume_notifier_unregister
);
60 #ifdef CONFIG_HIBERNATE_CALLBACKS
61 static int xen_suspend(void *data
)
63 struct suspend_info
*si
= data
;
66 BUG_ON(!irqs_disabled());
68 err
= syscore_suspend();
70 pr_err("%s: system core suspend failed: %d\n", __func__
, err
);
75 xen_arch_pre_suspend();
78 * This hypercall returns 1 if suspend was cancelled
79 * or the domain was merely checkpointed, and 0 if it
80 * is resuming in a new domain.
82 si
->cancelled
= HYPERVISOR_suspend(xen_pv_domain()
83 ? virt_to_mfn(xen_start_info
)
86 xen_arch_post_suspend(si
->cancelled
);
99 static void do_suspend(void)
102 struct suspend_info si
;
104 shutting_down
= SHUTDOWN_SUSPEND
;
106 #ifdef CONFIG_PREEMPT
107 /* If the kernel is preemptible, we need to freeze all the processes
108 to prevent them from being in the middle of a pagetable update
110 err
= freeze_processes();
112 pr_err("%s: freeze failed %d\n", __func__
, err
);
117 err
= dpm_suspend_start(PMSG_FREEZE
);
119 pr_err("%s: dpm_suspend_start %d\n", __func__
, err
);
123 printk(KERN_DEBUG
"suspending xenstore...\n");
126 err
= dpm_suspend_end(PMSG_FREEZE
);
128 pr_err("dpm_suspend_end failed: %d\n", err
);
135 err
= stop_machine(xen_suspend
, &si
, cpumask_of(0));
137 /* Resume console as early as possible. */
139 xen_console_resume();
141 raw_notifier_call_chain(&xen_resume_notifier
, 0, NULL
);
143 dpm_resume_start(si
.cancelled
? PMSG_THAW
: PMSG_RESTORE
);
146 pr_err("failed to start xen_suspend: %d\n", err
);
157 dpm_resume_end(si
.cancelled
? PMSG_THAW
: PMSG_RESTORE
);
160 #ifdef CONFIG_PREEMPT
164 shutting_down
= SHUTDOWN_INVALID
;
166 #endif /* CONFIG_HIBERNATE_CALLBACKS */
168 struct shutdown_handler
{
173 static int poweroff_nb(struct notifier_block
*cb
, unsigned long code
, void *unused
)
179 shutting_down
= SHUTDOWN_POWEROFF
;
185 static void do_poweroff(void)
187 switch (system_state
) {
189 orderly_poweroff(true);
192 orderly_poweroff(false);
195 /* Don't do it when we are halting/rebooting. */
196 pr_info("Ignoring Xen toolstack shutdown.\n");
201 static void do_reboot(void)
203 shutting_down
= SHUTDOWN_POWEROFF
; /* ? */
207 static void shutdown_handler(struct xenbus_watch
*watch
,
208 const char **vec
, unsigned int len
)
211 struct xenbus_transaction xbt
;
213 static struct shutdown_handler handlers
[] = {
214 { "poweroff", do_poweroff
},
215 { "halt", do_poweroff
},
216 { "reboot", do_reboot
},
217 #ifdef CONFIG_HIBERNATE_CALLBACKS
218 { "suspend", do_suspend
},
222 static struct shutdown_handler
*handler
;
224 if (shutting_down
!= SHUTDOWN_INVALID
)
228 err
= xenbus_transaction_start(&xbt
);
232 str
= (char *)xenbus_read(xbt
, "control", "shutdown", NULL
);
233 /* Ignore read errors and empty reads. */
234 if (XENBUS_IS_ERR_READ(str
)) {
235 xenbus_transaction_end(xbt
, 1);
239 for (handler
= &handlers
[0]; handler
->command
; handler
++) {
240 if (strcmp(str
, handler
->command
) == 0)
244 /* Only acknowledge commands which we are prepared to handle. */
246 xenbus_write(xbt
, "control", "shutdown", "");
248 err
= xenbus_transaction_end(xbt
, 0);
249 if (err
== -EAGAIN
) {
257 pr_info("Ignoring shutdown request: %s\n", str
);
258 shutting_down
= SHUTDOWN_INVALID
;
264 #ifdef CONFIG_MAGIC_SYSRQ
265 static void sysrq_handler(struct xenbus_watch
*watch
, const char **vec
,
268 char sysrq_key
= '\0';
269 struct xenbus_transaction xbt
;
273 err
= xenbus_transaction_start(&xbt
);
276 if (!xenbus_scanf(xbt
, "control", "sysrq", "%c", &sysrq_key
)) {
277 pr_err("Unable to read sysrq code in control/sysrq\n");
278 xenbus_transaction_end(xbt
, 1);
282 if (sysrq_key
!= '\0')
283 xenbus_printf(xbt
, "control", "sysrq", "%c", '\0');
285 err
= xenbus_transaction_end(xbt
, 0);
289 if (sysrq_key
!= '\0')
290 handle_sysrq(sysrq_key
);
293 static struct xenbus_watch sysrq_watch
= {
294 .node
= "control/sysrq",
295 .callback
= sysrq_handler
299 static struct xenbus_watch shutdown_watch
= {
300 .node
= "control/shutdown",
301 .callback
= shutdown_handler
304 static struct notifier_block xen_reboot_nb
= {
305 .notifier_call
= poweroff_nb
,
308 static int setup_shutdown_watcher(void)
312 err
= register_xenbus_watch(&shutdown_watch
);
314 pr_err("Failed to set shutdown watcher\n");
319 #ifdef CONFIG_MAGIC_SYSRQ
320 err
= register_xenbus_watch(&sysrq_watch
);
322 pr_err("Failed to set sysrq watcher\n");
330 static int shutdown_event(struct notifier_block
*notifier
,
334 setup_shutdown_watcher();
338 int xen_setup_shutdown_event(void)
340 static struct notifier_block xenstore_notifier
= {
341 .notifier_call
= shutdown_event
346 register_xenstore_notifier(&xenstore_notifier
);
347 register_reboot_notifier(&xen_reboot_nb
);
351 EXPORT_SYMBOL_GPL(xen_setup_shutdown_event
);
353 subsys_initcall(xen_setup_shutdown_event
);