]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/boot/efi/drivers.c
Merge pull request #21981 from medhefgo/boot-cleanup
[thirdparty/systemd.git] / src / boot / efi / drivers.c
index a876c3df7fbfc6a4e048d506f5eee9b219e5d61d..851203e694d3342943270a72187cded96812e754 100644 (file)
@@ -6,9 +6,9 @@
 #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(
@@ -25,29 +25,16 @@ 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);
 
@@ -55,42 +42,32 @@ static EFI_STATUS load_one_driver(
             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))
@@ -105,9 +82,8 @@ EFI_STATUS load_drivers(
                 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;
 
@@ -121,8 +97,6 @@ EFI_STATUS load_drivers(
                 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);
@@ -131,7 +105,7 @@ EFI_STATUS load_drivers(
 
                 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;
@@ -144,7 +118,7 @@ EFI_STATUS load_drivers(
         }
 
         if (n_succeeded > 0)
-                (VOID) reconnect();
+                (void) reconnect();
 
         return EFI_SUCCESS;
 }