mirror of
https://github.com/ipxe/ipxe
synced 2025-12-07 09:50:26 +03:00
[reboot] Generalise warm reboot indicator to a flags bitmask
Allow for the possibility of additional reboot types by extending the reboot() function to use a flags bitmask rather than a single flag. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -37,13 +37,15 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
/**
|
||||
* Reboot system
|
||||
*
|
||||
* @v warm Perform a warm reboot
|
||||
* @v flags Reboot flags
|
||||
*/
|
||||
static void sbi_reboot ( int warm ) {
|
||||
static void sbi_reboot ( int flags ) {
|
||||
struct sbi_return ret;
|
||||
int warm;
|
||||
int rc;
|
||||
|
||||
/* Reboot system */
|
||||
warm = ( flags & REBOOT_WARM );
|
||||
ret = sbi_ecall_2 ( SBI_SRST, SBI_SRST_SYSTEM_RESET,
|
||||
( warm ? SBI_RESET_WARM : SBI_RESET_COLD ), 0 );
|
||||
|
||||
|
||||
@@ -38,14 +38,14 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
/**
|
||||
* Reboot system
|
||||
*
|
||||
* @v warm Perform a warm reboot
|
||||
* @v flags Reboot flags
|
||||
*/
|
||||
static void bios_reboot ( int warm ) {
|
||||
uint16_t flag;
|
||||
static void bios_reboot ( int flags ) {
|
||||
uint16_t type;
|
||||
|
||||
/* Configure BIOS for cold/warm reboot */
|
||||
flag = ( warm ? BDA_REBOOT_WARM : 0 );
|
||||
put_real ( flag, BDA_SEG, BDA_REBOOT );
|
||||
type = ( ( flags & REBOOT_WARM ) ? BDA_REBOOT_WARM : 0 );
|
||||
put_real ( type, BDA_SEG, BDA_REBOOT );
|
||||
|
||||
/* Jump to system reset vector */
|
||||
__asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) : );
|
||||
|
||||
@@ -37,9 +37,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
/**
|
||||
* Reboot system
|
||||
*
|
||||
* @v warm Perform a warm reboot
|
||||
* @v flags Reboot flags
|
||||
*/
|
||||
static void null_reboot ( int warm __unused ) {
|
||||
static void null_reboot ( int flags __unused ) {
|
||||
|
||||
printf ( "Cannot reboot; not implemented\n" );
|
||||
while ( 1 ) {}
|
||||
|
||||
@@ -59,6 +59,7 @@ static struct command_descriptor reboot_cmd =
|
||||
*/
|
||||
static int reboot_exec ( int argc, char **argv ) {
|
||||
struct reboot_options opts;
|
||||
int flags = 0;
|
||||
int rc;
|
||||
|
||||
/* Parse options */
|
||||
@@ -66,7 +67,9 @@ static int reboot_exec ( int argc, char **argv ) {
|
||||
return rc;
|
||||
|
||||
/* Reboot system */
|
||||
reboot ( opts.warm );
|
||||
if ( opts.warm )
|
||||
flags |= REBOOT_WARM;
|
||||
reboot ( flags );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -51,9 +51,11 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
/**
|
||||
* Reboot system
|
||||
*
|
||||
* @v warm Perform a warm reboot
|
||||
* @v flags Reboot flags
|
||||
*/
|
||||
void reboot ( int warm );
|
||||
void reboot ( int flags );
|
||||
|
||||
#define REBOOT_WARM 0x00000001 /**< Perform a warm reboot */
|
||||
|
||||
/**
|
||||
* Power off system
|
||||
|
||||
@@ -37,13 +37,15 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
/**
|
||||
* Reboot system
|
||||
*
|
||||
* @v warm Perform a warm reboot
|
||||
* @v flags Reboot flags
|
||||
*/
|
||||
static void efi_reboot ( int warm ) {
|
||||
static void efi_reboot ( int flags ) {
|
||||
EFI_RUNTIME_SERVICES *rs = efi_systab->RuntimeServices;
|
||||
EFI_RESET_TYPE type;
|
||||
|
||||
/* Use runtime services to reset system */
|
||||
rs->ResetSystem ( ( warm ? EfiResetWarm : EfiResetCold ), 0, 0, NULL );
|
||||
type = ( ( flags & REBOOT_WARM ) ? EfiResetWarm : EfiResetCold );
|
||||
rs->ResetSystem ( type, 0, 0, NULL );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user