Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[cmdline] Add ability to perform a warm reboot
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 22, 2013
1 parent 71cd508 commit e68a6ca
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 9 deletions.
2 changes: 2 additions & 0 deletions src/arch/i386/include/bios.h
Expand Up @@ -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 */
9 changes: 8 additions & 1 deletion src/arch/i386/interface/pcbios/bios_reboot.c
Expand Up @@ -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" ) : : );
Expand Down
3 changes: 2 additions & 1 deletion src/core/null_reboot.c
Expand Up @@ -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 ) {}
Expand Down
15 changes: 11 additions & 4 deletions src/hci/commands/reboot_cmd.c
Expand Up @@ -17,6 +17,7 @@
* 02110-1301, USA.
*/

#include <getopt.h>
#include <ipxe/command.h>
#include <ipxe/parseopt.h>
#include <ipxe/reboot.h>
Expand All @@ -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
Expand All @@ -55,7 +62,7 @@ static int reboot_exec ( int argc, char **argv ) {
return rc;

/* Reboot system */
reboot();
reboot ( opts.warm );

return 0;
}
Expand Down
3 changes: 2 additions & 1 deletion src/include/ipxe/reboot.h
Expand Up @@ -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 */
5 changes: 3 additions & 2 deletions src/interface/efi/efi_reboot.c
Expand Up @@ -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 );

0 comments on commit e68a6ca

Please sign in to comment.