diff options
| author | Michael Brown | 2020-07-14 19:24:02 +0200 |
|---|---|---|
| committer | Michael Brown | 2020-07-15 11:09:46 +0200 |
| commit | 1832f8a9b02d00977ca1e079bd9e0369763df14c (patch) | |
| tree | 82949d1fbea42353809cde2e1634112ce04a5885 /src/net/ping.c | |
| parent | [efi] Ensure NUL byte is at lowest address within stack cookie (diff) | |
| download | ipxe-1832f8a9b02d00977ca1e079bd9e0369763df14c.tar.gz ipxe-1832f8a9b02d00977ca1e079bd9e0369763df14c.tar.xz ipxe-1832f8a9b02d00977ca1e079bd9e0369763df14c.zip | |
[efi] Claim SNP devices early in efi_download_start()
Claiming the SNP devices has the side effect of raising the TPL to
iPXE's normal operating level of TPL_CALLBACK (see the commit message
for c89a446 ("[efi] Run at TPL_CALLBACK to protect against UEFI
timers") for details). This must happen before executing any code
that relies upon the TPL having been raised to TPL_CALLBACK.
The call to efi_snp_claim() in efi_download_start() currently happens
only after the call to xfer_open(). Calling xfer_open() will
typically result in a retry timer being started, which will result in
a call to currticks() in order to initialise the timer. The call to
currticks() will drop to TPL_APPLICATION and restore to TPL_CALLBACK
in order to allow a timer tick to occur. Since this call happened
before the call to efi_snp_claim(), the restored TPL is incorrect.
This in turn results in efi_snp_claim() recording the incorrect
original TPL, causing efi_snp_release() to eventually restore the
incorrect TPL, causing the system to lock up when ExitBootServices()
is called at TPL_CALLBACK.
Fix by moving the call to efi_snp_claim() to the start of
efi_download_start().
Debugged-by: Jarrod Johnson <jjohnson2@lenovo.com>
Debugged-by: He He4 Huang <huanghe4@lenovo.com>
Debugged-by: James Wang <jameswang@ami.com.tw>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/ping.c')
0 files changed, 0 insertions, 0 deletions
