lguest: Reboot support
Reboot Implemented (Prevent fd leak, fix style and fix documentation --RR) Signed-off-by: Balaji Rao <balajirrao@gmail.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Rusty Russell
parent
5c55841d16
commit
ec04b13f67
@@ -67,6 +67,7 @@
|
||||
#include <asm/mce.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/i387.h>
|
||||
#include <asm/reboot.h> /* for struct machine_ops */
|
||||
|
||||
/*G:010 Welcome to the Guest!
|
||||
*
|
||||
@@ -812,7 +813,7 @@ static void lguest_safe_halt(void)
|
||||
* rather than virtual addresses, so we use __pa() here. */
|
||||
static void lguest_power_off(void)
|
||||
{
|
||||
hcall(LHCALL_CRASH, __pa("Power down"), 0, 0);
|
||||
hcall(LHCALL_SHUTDOWN, __pa("Power down"), LGUEST_SHUTDOWN_POWEROFF, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -822,7 +823,7 @@ static void lguest_power_off(void)
|
||||
*/
|
||||
static int lguest_panic(struct notifier_block *nb, unsigned long l, void *p)
|
||||
{
|
||||
hcall(LHCALL_CRASH, __pa(p), 0, 0);
|
||||
hcall(LHCALL_SHUTDOWN, __pa(p), LGUEST_SHUTDOWN_POWEROFF, 0);
|
||||
/* The hcall won't return, but to keep gcc happy, we're "done". */
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
@@ -926,6 +927,11 @@ static unsigned lguest_patch(u8 type, u16 clobber, void *ibuf,
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
static void lguest_restart(char *reason)
|
||||
{
|
||||
hcall(LHCALL_SHUTDOWN, __pa(reason), LGUEST_SHUTDOWN_RESTART, 0);
|
||||
}
|
||||
|
||||
/*G:030 Once we get to lguest_init(), we know we're a Guest. The pv_ops
|
||||
* structures in the kernel provide points for (almost) every routine we have
|
||||
* to override to avoid privileged instructions. */
|
||||
@@ -1059,6 +1065,7 @@ __init void lguest_init(void)
|
||||
* the Guest routine to power off. */
|
||||
pm_power_off = lguest_power_off;
|
||||
|
||||
machine_ops.restart = lguest_restart;
|
||||
/* Now we're set up, call start_kernel() in init/main.c and we proceed
|
||||
* to boot as normal. It never returns. */
|
||||
start_kernel();
|
||||
|
Reference in New Issue
Block a user