]> Zhao Yanbai Git Server - minix.git/commitdiff
Restore poweroff to some of it's former glory (on QEMU, at least)
authorErik van der Kouwe <erik@minix3.org>
Wed, 21 Nov 2012 19:28:37 +0000 (20:28 +0100)
committerErik van der Kouwe <erik@minix3.org>
Wed, 21 Nov 2012 19:28:37 +0000 (20:28 +0100)
commands/poweroff/poweroff.sh
commands/reboot/halt.c
commands/reboot/shutdown.c
include/sys/reboot.h
kernel/arch/i386/arch_reset.c
servers/pm/main.c

index 92c563fba23c6764e976531e4c216f783265fe27..366baac4e33104afa2fcc8a5b6ff82c94722c54c 100644 (file)
@@ -10,4 +10,4 @@ fi
 
 PATH=/usr/bin:$PATH
 
-exec shutdown -x off
+exec shutdown -p
index 361d6835edced361fc51ef7667520786e6d1cafc..60d1ad9c22f91f086c492285f065bddf3cfae8b2 100644 (file)
@@ -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;
index 418aab8c2c852d475d4e87cc9aaf9f65777dd91e..57e00f1323ee3621e773179d792bb1c000d47066 100644 (file)
@@ -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);
index 6a4edd8258445aa8ccb34c030472e96262c74da5..3e8f6d44ecaf4101552c5baa7d696902c9258556 100644 (file)
@@ -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
index 26e579a60c74ac88390702ad3eff0f8ece997c8a..565a542f7674d5ccf18c7a155ac9c340a61e5caa 100644 (file)
@@ -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;
@@ -114,6 +127,11 @@ __dead void arch_shutdown(int how)
                        /* Stop */
                        for (; ; ) halt_cpu();
                        NOT_REACHABLE;
+                       
+               case RBT_POWEROFF:
+                       /* Power off if possible, reset otherwise */
+                       poweroff();
+                       NOT_REACHABLE;
 
                default:        
                case RBT_REBOOT:
index e870d77036cd3b84c621c464c837bfbdb18e719f..d3c50f2d5ff71dad90935846a3972d8038119013 100644 (file)
@@ -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;
   }