]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Drop to TPL_APPLICATION when gathering entropy
authorMichael Brown <mcb30@ipxe.org>
Mon, 12 Mar 2018 10:55:28 +0000 (10:55 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 12 Mar 2018 11:02:19 +0000 (11:02 +0000)
Commit c89a446 ("[efi] Run at TPL_CALLBACK to protect against UEFI
timers") introduced a regression in the EFI entropy gathering code.
When the EFI_RNG_PROTOCOL is not present, we fall back to using timer
interrupts (as for the BIOS build).  Since timer interrupts are
disabled at TPL_CALLBACK, WaitForEvent() fails and no entropy can be
gathered.

Fix by dropping to TPL_APPLICATION while entropy gathering is enabled.

Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_entropy.c

index 881c4c9a221e3205f4cbd8e0786eda30ededc84a..2a2fc905497efeb3b9bc0a60fd31a9a4869e9045 100644 (file)
@@ -79,6 +79,9 @@ static int efi_entropy_enable ( void ) {
        DBGC ( &tick, "ENTROPY %s RNG protocol\n",
               ( efirng ? "has" : "has no" ) );
 
+       /* Drop to TPL_APPLICATION to allow timer tick event to take place */
+       bs->RestoreTPL ( TPL_APPLICATION );
+
        /* Create timer tick event */
        if ( ( efirc = bs->CreateEvent ( EVT_TIMER, TPL_NOTIFY, NULL, NULL,
                                         &tick ) ) != 0 ) {
@@ -100,6 +103,9 @@ static void efi_entropy_disable ( void ) {
 
        /* Close timer tick event */
        bs->CloseEvent ( tick );
+
+       /* Return to TPL_CALLBACK */
+       bs->RaiseTPL ( TPL_CALLBACK );
 }
 
 /**