summaryrefslogtreecommitdiffstats
path: root/src/interface/efi/efiprefix.c
diff options
context:
space:
mode:
authorMichael Brown2019-02-19 19:47:12 +0100
committerMichael Brown2019-02-19 20:02:11 +0100
commit64b4452bca04af433f1c98ab782c0e93cd5c88c0 (patch)
treeaad8c645e893ac233481e64de6ea8b3a69a817f9 /src/interface/efi/efiprefix.c
parent[init] Show startup and shutdown function names in debug messages (diff)
downloadipxe-64b4452bca04af433f1c98ab782c0e93cd5c88c0.tar.gz
ipxe-64b4452bca04af433f1c98ab782c0e93cd5c88c0.tar.xz
ipxe-64b4452bca04af433f1c98ab782c0e93cd5c88c0.zip
[efi] Blacklist the Dell Ip4ConfigDxe driver
On a Dell OptiPlex 7010, calling DisconnectController() on the LOM device handle will lock up the system. Debugging shows that execution is trapped in an infinite loop that is somehow trying to reconnect drivers (without going via ConnectController()). The problem can be reproduced in the UEFI shell with no iPXE code present, by using the "disconnect" command. Experimentation shows that the only fix is to unload (rather than just disconnect) the "Ip4ConfigDxe" driver. Add the concept of a blacklist of UEFI drivers that will be automatically unloaded when iPXE runs as an application, and add the Dell Ip4ConfigDxe driver to this blacklist. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/efi/efiprefix.c')
-rw-r--r--src/interface/efi/efiprefix.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/interface/efi/efiprefix.c b/src/interface/efi/efiprefix.c
index 18b931e6..de3572c7 100644
--- a/src/interface/efi/efiprefix.c
+++ b/src/interface/efi/efiprefix.c
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/efi/efi_snp.h>
#include <ipxe/efi/efi_autoboot.h>
#include <ipxe/efi/efi_watchdog.h>
+#include <ipxe/efi/efi_blacklist.h>
/**
* EFI entry point
@@ -75,6 +76,10 @@ EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
*/
static int efi_probe ( struct root_device *rootdev __unused ) {
+ /* Unloaded any blacklisted drivers */
+ efi_unload_blacklist();
+
+ /* Connect our drivers */
return efi_driver_connect_all();
}
@@ -85,6 +90,7 @@ static int efi_probe ( struct root_device *rootdev __unused ) {
*/
static void efi_remove ( struct root_device *rootdev __unused ) {
+ /* Disconnect our drivers */
efi_driver_disconnect_all();
}