#include "drivers.h"
#include "util.h"
-static VOID efi_unload_image(EFI_HANDLE *h) {
+static void efi_unload_image(EFI_HANDLE *h) {
if (*h)
- (VOID) uefi_call_wrapper(BS->UnloadImage, 1, *h);
+ (void) BS->UnloadImage(*h);
}
static EFI_STATUS load_one_driver(
assert(loaded_image);
assert(fname);
- spath = PoolPrint(L"\\EFI\\systemd\\drivers\\%s", fname);
- if (!spath)
- return log_oom();
-
+ spath = xpool_print(L"\\EFI\\systemd\\drivers\\%s", fname);
path = FileDevicePath(loaded_image->DeviceHandle, spath);
if (!path)
return log_oom();
- err = uefi_call_wrapper(
- BS->LoadImage, 6,
- FALSE,
- parent_image,
- path,
- NULL, 0,
- &image);
+ err = BS->LoadImage(FALSE, parent_image, path, NULL, 0, &image);
if (EFI_ERROR(err))
return log_error_status_stall(err, L"Failed to load image %s: %r", fname, err);
- err = uefi_call_wrapper(
- BS->HandleProtocol, 3,
- image,
- &LoadedImageProtocol,
- (VOID **)&loaded_image);
+ err = BS->HandleProtocol(image, &LoadedImageProtocol, (void **)&loaded_image);
if (EFI_ERROR(err))
return log_error_status_stall(err, L"Failed to find protocol in driver image s: %r", fname, err);
loaded_image->ImageCodeType != EfiRuntimeServicesCode)
return log_error_status_stall(EFI_INVALID_PARAMETER, L"Image %s is not a driver, refusing: %r", fname);
- err = uefi_call_wrapper(
- BS->StartImage, 3,
- image,
- NULL,
- NULL);
- if (EFI_ERROR(err))
- return log_error_status_stall(err, L"Failed to start image %s: %r", fname, err);
+ err = BS->StartImage(image, NULL, NULL);
+ if (EFI_ERROR(err)) {
+ /* EFI_ABORTED signals an initializing driver. It uses this error code on success
+ * so that it is unloaded after. */
+ if (err != EFI_ABORTED)
+ log_error_stall(L"Failed to start image %s: %r", fname, err);
+ return err;
+ }
TAKE_PTR(image);
return EFI_SUCCESS;
}
-static EFI_STATUS reconnect(VOID) {
+static EFI_STATUS reconnect(void) {
_cleanup_freepool_ EFI_HANDLE *handles = NULL;
UINTN n_handles = 0;
EFI_STATUS err;
/* Reconnects all handles, so that any loaded drivers can take effect. */
- err = uefi_call_wrapper(
- BS->LocateHandleBuffer, 5,
- AllHandles,
- NULL,
- NULL,
- &n_handles,
- &handles);
+ err = BS->LocateHandleBuffer(AllHandles, NULL, NULL, &n_handles, &handles);
if (EFI_ERROR(err))
return log_error_status_stall(err, L"Failed to get list of handles: %r", err);
for (UINTN i = 0; i < n_handles; i++) {
- err = uefi_call_wrapper(
- BS->ConnectController, 4,
- handles[i],
- NULL,
- NULL,
- TRUE);
+ err = BS->ConnectController(handles[i], NULL, NULL, TRUE);
if (err == EFI_NOT_FOUND) /* No drivers for this handle */
continue;
if (EFI_ERROR(err))
EFI_LOADED_IMAGE *loaded_image,
EFI_FILE_HANDLE root_dir) {
- _cleanup_(FileHandleClosep) EFI_FILE_HANDLE drivers_dir = NULL;
+ _cleanup_(file_handle_closep) EFI_FILE_HANDLE drivers_dir = NULL;
_cleanup_freepool_ EFI_FILE_INFO *dirent = NULL;
- _cleanup_freepool_ EFI_DEVICE_PATH *path = NULL;
UINTN dirent_size = 0, n_succeeded = 0;
EFI_STATUS err;
return log_error_status_stall(err, L"Failed to open \\EFI\\systemd\\drivers: %r", err);
for (;;) {
- _cleanup_freepool_ CHAR16 *d = NULL;
-
err = readdir_harder(drivers_dir, &dirent, &dirent_size);
if (EFI_ERROR(err))
return log_error_status_stall(err, L"Failed to read extra directory of loaded image: %r", err);
if (dirent->FileName[0] == '.')
continue;
- if (dirent->Attribute & EFI_FILE_DIRECTORY)
+ if (FLAGS_SET(dirent->Attribute, EFI_FILE_DIRECTORY))
continue;
if (!endswith_no_case(dirent->FileName, EFI_MACHINE_TYPE_NAME L".efi"))
continue;
}
if (n_succeeded > 0)
- (VOID) reconnect();
+ (void) reconnect();
return EFI_SUCCESS;
}