Fix exit to EFI firmware
The current code for EFI grub_exit() calls grub_efi_fini() before returning to firmware. In the case of ARM, this leaves a timer event running which could lead to a firmware crash. This patch changes this so that grub_machine_fini() is called with a NORETURN flag. This allows machine-specific shutdown to happen as well as the shutdown done by grub_efi_fini(). Signed-off-by: Mark Salter <msalter@redhat.com>
This commit is contained in:
parent
f4b1b48a83
commit
c945ca75c3
2 changed files with 3 additions and 2 deletions
|
@ -67,7 +67,7 @@ grub_machine_fini (int flags)
|
||||||
|
|
||||||
b = grub_efi_system_table->boot_services;
|
b = grub_efi_system_table->boot_services;
|
||||||
|
|
||||||
efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 0);
|
efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_CANCEL, 0);
|
||||||
efi_call_1 (b->close_event, tmr_evt);
|
efi_call_1 (b->close_event, tmr_evt);
|
||||||
|
|
||||||
grub_efi_fini ();
|
grub_efi_fini ();
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <grub/term.h>
|
#include <grub/term.h>
|
||||||
#include <grub/kernel.h>
|
#include <grub/kernel.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
|
#include <grub/loader.h>
|
||||||
|
|
||||||
/* The handle of GRUB itself. Filled in by the startup code. */
|
/* The handle of GRUB itself. Filled in by the startup code. */
|
||||||
grub_efi_handle_t grub_efi_image_handle;
|
grub_efi_handle_t grub_efi_image_handle;
|
||||||
|
@ -156,7 +157,7 @@ grub_efi_get_loaded_image (grub_efi_handle_t image_handle)
|
||||||
void
|
void
|
||||||
grub_exit (void)
|
grub_exit (void)
|
||||||
{
|
{
|
||||||
grub_efi_fini ();
|
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||||
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
||||||
grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
|
grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
|
||||||
for (;;) ;
|
for (;;) ;
|
||||||
|
|
Loading…
Reference in a new issue