efi_loader: implement InstallMultipleProtocolInterfaces
authorxypron.glpk@gmx.de <xypron.glpk@gmx.de>
Tue, 11 Jul 2017 20:06:20 +0000 (22:06 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Jul 2017 12:14:39 +0000 (14:14 +0200)
Implement InstallMultipleProtocolInterfaces in function
efi_install_multiple_protocol_interfaces by repeatedly
calling efi_install_protocol_interface.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_boottime.c

index 91db12e..08eddbd 100644 (file)
@@ -783,7 +783,44 @@ static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces(
                        void **handle, ...)
 {
        EFI_ENTRY("%p", handle);
-       return EFI_EXIT(EFI_OUT_OF_RESOURCES);
+
+       va_list argptr;
+       efi_guid_t *protocol;
+       void *protocol_interface;
+       efi_status_t r = EFI_SUCCESS;
+       int i = 0;
+
+       if (!handle)
+               return EFI_EXIT(EFI_INVALID_PARAMETER);
+
+       va_start(argptr, handle);
+       for (;;) {
+               protocol = va_arg(argptr, efi_guid_t*);
+               if (!protocol)
+                       break;
+               protocol_interface = va_arg(argptr, void*);
+               r = efi_install_protocol_interface(handle, protocol,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  protocol_interface);
+               if (r != EFI_SUCCESS)
+                       break;
+               i++;
+       }
+       va_end(argptr);
+       if (r == EFI_SUCCESS)
+               return EFI_EXIT(r);
+
+       /* If an error occured undo all changes. */
+       va_start(argptr, handle);
+       for (; i; --i) {
+               protocol = va_arg(argptr, efi_guid_t*);
+               protocol_interface = va_arg(argptr, void*);
+               efi_uninstall_protocol_interface(handle, protocol,
+                                                protocol_interface);
+       }
+       va_end(argptr);
+
+       return EFI_EXIT(r);
 }
 
 static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces(