x86_64 EFI runtime service support: EFI runtime services
PATCH 2/4 x86_64 EFI runtime service support: EFI runtime services
This patch adds support for several EFI runtime services for EFI x86_64 system.
The EFI support for emergency_restart is added.
Signed-off-by Chandramouli Narayanan <[email protected]>
Signed-off-by Huang Ying <[email protected]>
--- arch/x86/kernel/reboot_64.c | 20 +++++++++++++------- include/asm-x86/emergency-restart.h | 9 +++++++++ 2 files changed, 22 insertions(+), 7 deletions(-)
arch/x86/kernel/reboot_64.c +13 -7
@@ -9,6 +9,7 @@#include <linux/pm.h> #include <linux/kdebug.h> #include <linux/sched.h> +#include <linux/efi.h> #include <acpi/reboot.h> #include <asm/io.h> #include <asm/delay.h>
@@ -27,20 +28,17 @@ void (*pm_power_off)(void);EXPORT_SYMBOL (pm_power_off);static long no_idt[3 ]; -static enum { -BOOT_TRIPLE ='t' , -BOOT_KBD ='k' , -BOOT_ACPI ='a' -} reboot_type =BOOT_KBD ; +enum reboot_type reboot_type =BOOT_KBD ;static int reboot_mode =0 ;int reboot_force; -/* reboot=t[riple] | k[bd] [, [w]arm | [c]old] +/* reboot=t[riple] | k[bd] | e[fi] [, [w]arm | [c]old] warm Don't set the cold reboot flag cold Set the cold reboot flag triple Force a triple fault (init) kbd Use the keyboard controller. cold reset (default) acpi Use the RESET_REG in the FADT +efi Use efi reset_system runtime service force Avoid anything that could hang. */ static int __init reboot_setup (char *str)
@@ -59,6 +57,7 @@ static int __init reboot_setup(char *strcase 'a' :case 'b' :case 'k' : +case 'e' : reboot_type = *str;break ;case 'f' :
@@ -151,7 +150,14 @@ void machine_emergency_restart(void)acpi_reboot (); reboot_type =BOOT_KBD ;break ; - } + +case BOOT_EFI : +if (efi_enabled) + efi.reset_system (reboot_mode ?EFI_RESET_WARM :EFI_RESET_COLD , +EFI_SUCCESS ,0 ,NULL ); + reboot_type =BOOT_KBD ; +break ; + } } }
include/asm-x86/emergency-restart.h +9 -0
@@ -1,6 +1,15 @@#ifndef _ASM_EMERGENCY_RESTART_H#define _ASM_EMERGENCY_RESTART_H +enum reboot_type { +BOOT_TRIPLE ='t' , +BOOT_KBD ='k' , +BOOT_ACPI ='a' , +BOOT_EFI ='e' +}; + +extern enum reboot_type reboot_type; +extern void machine_emergency_restart (void );#endif /* _ASM_EMERGENCY_RESTART_H */