/**
* 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 );
/**
* 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" ) : );
/**
* 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 ) {}
*/
static int reboot_exec ( int argc, char **argv ) {
struct reboot_options opts;
+ int flags = 0;
int rc;
/* Parse options */
return rc;
/* Reboot system */
- reboot ( opts.warm );
+ if ( opts.warm )
+ flags |= REBOOT_WARM;
+ reboot ( flags );
return 0;
}
/**
* 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
/**
* 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 );
}
/**