From 7eaa2daf6f978c6aa16f66e03aa42dd3b5a190ae Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 28 Apr 2025 13:42:32 +0100 Subject: [PATCH] [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 --- src/arch/riscv/interface/sbi/sbi_reboot.c | 6 ++++-- src/arch/x86/interface/pcbios/bios_reboot.c | 10 +++++----- src/core/null_reboot.c | 4 ++-- src/hci/commands/reboot_cmd.c | 5 ++++- src/include/ipxe/reboot.h | 6 ++++-- src/interface/efi/efi_reboot.c | 8 +++++--- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/arch/riscv/interface/sbi/sbi_reboot.c b/src/arch/riscv/interface/sbi/sbi_reboot.c index 64365b0d3..3529c9d38 100644 --- a/src/arch/riscv/interface/sbi/sbi_reboot.c +++ b/src/arch/riscv/interface/sbi/sbi_reboot.c @@ -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 ); diff --git a/src/arch/x86/interface/pcbios/bios_reboot.c b/src/arch/x86/interface/pcbios/bios_reboot.c index 071173f19..463470245 100644 --- a/src/arch/x86/interface/pcbios/bios_reboot.c +++ b/src/arch/x86/interface/pcbios/bios_reboot.c @@ -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" ) : ); diff --git a/src/core/null_reboot.c b/src/core/null_reboot.c index 7be5612a3..63b6e127e 100644 --- a/src/core/null_reboot.c +++ b/src/core/null_reboot.c @@ -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 ) {} diff --git a/src/hci/commands/reboot_cmd.c b/src/hci/commands/reboot_cmd.c index 45d54cc2c..f34468401 100644 --- a/src/hci/commands/reboot_cmd.c +++ b/src/hci/commands/reboot_cmd.c @@ -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; } diff --git a/src/include/ipxe/reboot.h b/src/include/ipxe/reboot.h index 33606d9d5..2d8dadeca 100644 --- a/src/include/ipxe/reboot.h +++ b/src/include/ipxe/reboot.h @@ -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 diff --git a/src/interface/efi/efi_reboot.c b/src/interface/efi/efi_reboot.c index 35919221e..eb389a4b1 100644 --- a/src/interface/efi/efi_reboot.c +++ b/src/interface/efi/efi_reboot.c @@ -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 ); } /**