]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[cmdline] Add ability to perform a warm reboot
authorMichael Brown <mcb30@ipxe.org>
Fri, 22 Mar 2013 13:54:44 +0000 (13:54 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 22 Mar 2013 13:54:44 +0000 (13:54 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/include/bios.h
src/arch/i386/interface/pcbios/bios_reboot.c
src/core/null_reboot.c
src/hci/commands/reboot_cmd.c
src/include/ipxe/reboot.h
src/interface/efi/efi_reboot.c

index fadb9f1b74b084ed651893f8a0596d421ef5b820..3e6a845e3ef896d8292ab39445027eb2d186fdd7 100644 (file)
@@ -6,6 +6,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #define BDA_SEG 0x0040
 #define BDA_EQUIPMENT_WORD 0x0010
 #define BDA_FBMS 0x0013
+#define BDA_REBOOT 0x0072
+#define BDA_REBOOT_WARM 0x1234
 #define BDA_NUM_DRIVES 0x0075
 
 #endif /* BIOS_H */
index 86f4e3eb303ffbe6e8a5506f89db02edb8ad0072..68546b2e54e984738f58e8a15603d5fcba3c94ec 100644 (file)
@@ -27,12 +27,19 @@ FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <ipxe/reboot.h>
 #include <realmode.h>
+#include <bios.h>
 
 /**
  * Reboot system
  *
+ * @v warm             Perform a warm reboot
  */
-static void bios_reboot ( void ) {
+static void bios_reboot ( int warm ) {
+       uint16_t flag;
+
+       /* Configure BIOS for cold/warm reboot */
+       flag = ( warm ? BDA_REBOOT_WARM : 0 );
+       put_real ( flag, BDA_SEG, BDA_REBOOT );
 
        /* Jump to system reset vector */
        __asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) : : );
index b7e55bce85e0191812e4375501a533e091747d2e..8e3ed0bb6132aeefd057b472aa47afc4c3374dbd 100644 (file)
@@ -32,8 +32,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /**
  * Reboot system
  *
+ * @v warm             Perform a warm reboot
  */
-static void null_reboot ( void ) {
+static void null_reboot ( int warm __unused ) {
 
        printf ( "Cannot reboot; not implemented\n" );
        while ( 1 ) {}
index 19d3d6df455591331c7560df6ed96457753eb4f4..44dcfc71c7dd6cedfdfc0abade83336969ee54a0 100644 (file)
@@ -17,6 +17,7 @@
  * 02110-1301, USA.
  */
 
+#include <getopt.h>
 #include <ipxe/command.h>
 #include <ipxe/parseopt.h>
 #include <ipxe/reboot.h>
@@ -30,14 +31,20 @@ FILE_LICENCE ( GPL2_OR_LATER );
  */
 
 /** "reboot" options */
-struct reboot_options {};
+struct reboot_options {
+       /** Perform a warm reboot */
+       int warm;
+};
 
 /** "reboot" option list */
-static struct option_descriptor reboot_opts[] = {};
+static struct option_descriptor reboot_opts[] = {
+       OPTION_DESC ( "warm", 'w', no_argument,
+                     struct reboot_options, warm, parse_flag ),
+};
 
 /** "reboot" command descriptor */
 static struct command_descriptor reboot_cmd =
-       COMMAND_DESC ( struct reboot_options, reboot_opts, 0, 0, "" );
+       COMMAND_DESC ( struct reboot_options, reboot_opts, 0, 0, "[--warm]" );
 
 /**
  * The "reboot" command
@@ -55,7 +62,7 @@ static int reboot_exec ( int argc, char **argv ) {
                return rc;
 
        /* Reboot system */
-       reboot();
+       reboot ( opts.warm );
 
        return 0;
 }
index 043c5e10bfd9ff9a5ddf34fa555ecb7541e14860..5d882d3dd927e58c8bc1335c83dcd7bf52cafa7b 100644 (file)
@@ -51,7 +51,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /**
  * Reboot system
  *
+ * @v warm             Perform a warm reboot
  */
-void reboot ( void );
+void reboot ( int warm );
 
 #endif /* _IPXE_REBOOT_H */
index 1ecccc4600a220ad8aabc7b4647997ff65b9af76..bfee36aa3b1c23e822409c096bed6ab017e7500c 100644 (file)
@@ -32,12 +32,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /**
  * Reboot system
  *
+ * @v warm             Perform a warm reboot
  */
-static void efi_reboot ( void ) {
+static void efi_reboot ( int warm ) {
        EFI_RUNTIME_SERVICES *rs = efi_systab->RuntimeServices;
 
        /* Use runtime services to reset system */
-       rs->ResetSystem ( EfiResetCold, 0, 0, NULL );
+       rs->ResetSystem ( ( warm ? EfiResetWarm : EfiResetCold ), 0, 0, NULL );
 }
 
 PROVIDE_REBOOT ( efi, reboot, efi_reboot );