]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Raise TPL during driver unload entry point
authorMichael Brown <mcb30@ipxe.org>
Mon, 22 Nov 2021 12:50:38 +0000 (12:50 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 22 Nov 2021 12:50:38 +0000 (12:50 +0000)
The efi_unload() function is currently missing the calls to raise and
restore the TPL.  This has the side effect of causing iPXE to return
from the driver unload entry point at TPL_CALLBACK, which will cause
unexpected behaviour (typically a system lockup) shortly afterwards.

Fix by adding the missing calls to raise and restore the TPL.

Debugged-by: Petr Borsodi <petr.borsodi@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_init.c

index b7cac16e59c4574ff69b196b372d501d02260d25..1c6e9d440469c900078f1fae5af59b4bb4184f00 100644 (file)
@@ -316,9 +316,13 @@ EFI_STATUS efi_init ( EFI_HANDLE image_handle,
 static EFI_STATUS EFIAPI efi_unload ( EFI_HANDLE image_handle __unused ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        EFI_SYSTEM_TABLE *systab = efi_systab;
+       struct efi_saved_tpl tpl;
 
        DBGC ( systab, "EFI image unloading\n" );
 
+       /* Raise TPL */
+       efi_raise_tpl ( &tpl );
+
        /* Shut down */
        shutdown_exit();
 
@@ -336,6 +340,9 @@ static EFI_STATUS EFIAPI efi_unload ( EFI_HANDLE image_handle __unused ) {
 
        DBGC ( systab, "EFI image unloaded\n" );
 
+       /* Restore TPL */
+       efi_restore_tpl ( &tpl );
+
        return 0;
 }