iPXE - Open Source Boot Firmware

[efi] Run at TPL_CALLBACK to protect against UEFI timers
authorMichael Brown <mcb30@ipxe.org>
Tue, 20 Feb 2018 10:56:31 +0000 (10:56 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 20 Feb 2018 10:56:31 +0000 (10:56 +0000)
commitc89a446cf09f30a121ae21d91f4a1aa071044084
treed9b8a253fc68ac4e97221ad5dfae8707c5bab873
parent8dbb73a779e5b11ee2b65f9d2af6dd9bd8998608
[efi] Run at TPL_CALLBACK to protect against UEFI timers

As noted in the comments, UEFI manages to combines the all of the
worst aspects of both a polling design (inefficiency and inability to
sleep until something interesting happens) and of an interrupt-driven
design (the complexity of code that could be preempted at any time,
thanks to UEFI timers).

This causes problems in particular for UEFI USB keyboards: the
keyboard driver calls UsbAsyncInterruptTransfer() to set up a periodic
timer which is used to poll the USB bus.  This poll may interrupt a
critical section within iPXE, typically resulting in list corruption
and either a hang or reboot.

Work around this problem by mirroring the BIOS design, in which we run
with interrupts disabled almost all of the time.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_snp.c
src/interface/efi/efi_timer.c
src/interface/efi/efi_usb.c