Restore poweroff to some of it's former glory (on QEMU, at least)
This commit is contained in:
parent
0181ec6beb
commit
22fa466268
6 changed files with 27 additions and 5 deletions
|
@ -10,4 +10,4 @@ fi
|
|||
|
||||
PATH=/usr/bin:$PATH
|
||||
|
||||
exec shutdown -x off
|
||||
exec shutdown -p
|
||||
|
|
|
@ -34,7 +34,7 @@ char *reboot_code = "delay; boot";
|
|||
void
|
||||
usage()
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [-hrRfd] [-x reboot-code]\n", prog);
|
||||
fprintf(stderr, "Usage: %s [-hrRfpd] [-x reboot-code]\n", prog);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -66,6 +66,7 @@ char **argv;
|
|||
case 'r': flag = RBT_REBOOT; break;
|
||||
case 'R': flag = RBT_RESET; break;
|
||||
case 'd': flag = RBT_DEFAULT; break;
|
||||
case 'p': flag = RBT_POWEROFF; break;
|
||||
case 'f': fast = 1; break;
|
||||
case 'x':
|
||||
flag = RBT_MONITOR;
|
||||
|
|
|
@ -148,6 +148,7 @@ char *argv[];
|
|||
break;
|
||||
case 'h':
|
||||
case 'r':
|
||||
case 'p':
|
||||
case 'x':
|
||||
case 'd':
|
||||
reboot_flag = *opt;
|
||||
|
@ -273,10 +274,11 @@ char *argv[];
|
|||
|
||||
void usage()
|
||||
{
|
||||
fputs("Usage: shutdown [-hrRmkd] [-x code] [time [message]]\n", stderr);
|
||||
fputs("Usage: shutdown [-hrRpmkd] [-x code] [time [message]]\n", stderr);
|
||||
fputs(" -h -> halt system after shutdown\n", stderr);
|
||||
fputs(" -r -> reboot system after shutdown\n", stderr);
|
||||
fputs(" -R -> reset system after shutdown\n", stderr);
|
||||
fputs(" -p -> power system off after shutdown\n", stderr);
|
||||
fputs(" -x -> return to the monitor doing...\n", stderr);
|
||||
fputs(" -d -> default CTRL-ALT-DEL shutdown for current bootloader\n", stderr);
|
||||
fputs(" -m -> read a shutdown message from standard input\n", stderr);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define RBT_MONITOR 3 /* let the monitor do this */
|
||||
#define RBT_RESET 4 /* hard reset the system */
|
||||
#define RBT_DEFAULT 5 /* return to monitor, reset if not possible */
|
||||
#define RBT_INVALID 6 /* first invalid reboot flag */
|
||||
#define RBT_POWEROFF 6 /* power off, reset if not possible */
|
||||
#define RBT_INVALID 7 /* first invalid reboot flag */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,19 @@ reset(void)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
poweroff(void)
|
||||
{
|
||||
const char *shutdown_str;
|
||||
|
||||
/* Bochs/QEMU poweroff */
|
||||
shutdown_str = "Shutdown";
|
||||
while (*shutdown_str) outb(0x8900, *(shutdown_str++));
|
||||
|
||||
/* fallback option: reset */
|
||||
reset();
|
||||
}
|
||||
|
||||
__dead void arch_shutdown(int how)
|
||||
{
|
||||
unsigned char unused_ch;
|
||||
|
@ -115,6 +128,11 @@ __dead void arch_shutdown(int how)
|
|||
for (; ; ) halt_cpu();
|
||||
NOT_REACHABLE;
|
||||
|
||||
case RBT_POWEROFF:
|
||||
/* Power off if possible, reset otherwise */
|
||||
poweroff();
|
||||
NOT_REACHABLE;
|
||||
|
||||
default:
|
||||
case RBT_REBOOT:
|
||||
case RBT_RESET:
|
||||
|
|
|
@ -398,7 +398,7 @@ static void handle_vfs_reply()
|
|||
* the PM, will get a HARD_STOP notification. Await the
|
||||
* notification in the main loop.
|
||||
*/
|
||||
sys_abort(RBT_DEFAULT);
|
||||
sys_abort(abort_flag);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue