public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
@ 2019-01-07  4:37 Ashish Singhal
  2019-01-07  4:37 ` [PATCH v3 1/2] MdePkg/UefiLib: Abstract driver model " Ashish Singhal
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Ashish Singhal @ 2019-01-07  4:37 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ashish Singhal

An issue was seen in IScsiDxe in NetworkPkg where driver cleanup after
initialization failure was not done right. Bug 1428 was filed in this regard.
As per discussions with Mike, it was also discussed that having UEFILib
provide protocol uninstallation abstraction would help to avoid these
issues in the future. Bug 1429 was found to track this. The first 2 patches
take care of this.

Patch number 1 also simplifies the UEFILib protocol installation and
uninstallation abstraction by adding a helper function doing operations
instead of every public function.

Ashish Singhal (2):
  MdePkg/UefiLib: Abstract driver model protocol uninstallation
  NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols.

 MdePkg/Include/Library/UefiLib.h         |  103 +++
 MdePkg/Library/UefiLib/UefiDriverModel.c | 1186 ++++++++----------------------
 NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
 3 files changed, 435 insertions(+), 885 deletions(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v3 1/2] MdePkg/UefiLib: Abstract driver model protocol uninstallation
  2019-01-07  4:37 [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
@ 2019-01-07  4:37 ` Ashish Singhal
  2019-01-07  4:37 ` [PATCH v3 2/2] NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols Ashish Singhal
  2019-01-07 14:01 ` [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
  2 siblings, 0 replies; 11+ messages in thread
From: Ashish Singhal @ 2019-01-07  4:37 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ashish Singhal

Provided functions in UEFILib that abstract driver model protocol
uninstallation. This helps drivers to install and uninstall protocols
using a library to keep things seemless.

Also, add a helper function to operate upon protocol installation and
uninstallation instead of every function doing it by itself.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1429

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
---
 MdePkg/Include/Library/UefiLib.h         |  103 +++
 MdePkg/Library/UefiLib/UefiDriverModel.c | 1186 ++++++++----------------------
 2 files changed, 424 insertions(+), 865 deletions(-)

diff --git a/MdePkg/Include/Library/UefiLib.h b/MdePkg/Include/Library/UefiLib.h
index 468bffc..08222d4 100644
--- a/MdePkg/Include/Library/UefiLib.h
+++ b/MdePkg/Include/Library/UefiLib.h
@@ -12,6 +12,7 @@
   of size reduction when compiler optimization is disabled. If MDEPKG_NDEBUG is
   defined, then debug and assert related macros wrapped by it are the NULL implementations.
 
+Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials are licensed and made available under
 the terms and conditions of the BSD License that accompanies this distribution.
@@ -1283,6 +1284,7 @@ AsciiPrintXY (
   ...
   );
 
+
 /**
   Installs and completes the initialization of a Driver Binding Protocol instance.
 
@@ -1316,6 +1318,25 @@ EfiLibInstallDriverBinding (
 
 
 /**
+  Uninstalls a Driver Binding Protocol instance.
+
+  If DriverBinding is NULL, then ASSERT().
+  If DriverBinding can not be uninstalled, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallDriverBinding (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding
+  );
+
+
+/**
   Installs and completes the initialization of a Driver Binding Protocol instance and
   optionally installs the Component Name, Driver Configuration and Driver Diagnostics Protocols.
 
@@ -1354,6 +1375,31 @@ EfiLibInstallAllDriverProtocols (
   );
 
 
+/**
+  Uninstalls a Driver Binding Protocol instance and optionally uninstalls the
+  Component Name, Driver Configuration and Driver Diagnostics Protocols.
+
+  If DriverBinding is NULL, then ASSERT().
+  If the uninstallation fails, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.
+  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver produced.
+  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallAllDriverProtocols (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
+  );
+
 
 /**
   Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.
@@ -1391,6 +1437,29 @@ EfiLibInstallDriverBindingComponentName2 (
 
 
 /**
+  Uninstalls Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.
+
+  If DriverBinding is NULL, then ASSERT().
+  If the uninstallation fails, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.
+  @param  ComponentName2       A Component Name 2 Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol installation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallDriverBindingComponentName2 (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
+  );
+
+
+/**
   Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver
   Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.
 
@@ -1434,6 +1503,40 @@ EfiLibInstallAllDriverProtocols2 (
   IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
   );
 
+
+/**
+  Uninstalls Driver Binding Protocol with optional Component Name, Component Name 2, Driver
+  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.
+
+  If DriverBinding is NULL, then ASSERT().
+  If the installation fails, then ASSERT().
+
+
+  @param  DriverBinding         A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName         A Component Name Protocol instance that this driver produced.
+  @param  ComponentName2        A Component Name 2 Protocol instance that this driver produced.
+  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver produced.
+  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver produced.
+  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver produced.
+  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallAllDriverProtocols2 (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,        OPTIONAL
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,       OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,  OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,    OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
+  );
+
+
 /**
   Appends a formatted Unicode string to a Null-terminated Unicode string
 
diff --git a/MdePkg/Library/UefiLib/UefiDriverModel.c b/MdePkg/Library/UefiLib/UefiDriverModel.c
index 69581ae..07b23af 100644
--- a/MdePkg/Library/UefiLib/UefiDriverModel.c
+++ b/MdePkg/Library/UefiLib/UefiDriverModel.c
@@ -1,7 +1,8 @@
 /** @file
   Library functions that abstract driver model protocols
-  installation.
+  installation and uninstallation.
 
+  Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials are
   licensed and made available under the terms and conditions of the BSD License
@@ -16,6 +17,130 @@
 
 #include "UefiLibInternal.h"
 
+
+#define MAX_SUPPORTED_PROTOCOLS 7
+typedef struct {
+  EFI_GUID *Guid;
+  VOID     *Interface;
+} EFI_PROCESS_PROTOCOL;
+
+
+static
+EFI_STATUS
+EFIAPI
+EfiLibProcessProtocol (
+  IN CONST EFI_HANDLE                         ImageHandle,
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN EFI_HANDLE                               DriverBindingHandle,
+  IN BOOLEAN                                  Install,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,
+  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2,
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,
+  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2
+  )
+{
+  EFI_STATUS           Status;
+  EFI_PROCESS_PROTOCOL ProtocolArray[MAX_SUPPORTED_PROTOCOLS];
+  UINT8                ProtocolCount;
+
+  ASSERT (DriverBinding != NULL);
+
+  //
+  // ZI the ProtocolArray structure. Both InstallMultipleProtocolInterfaces
+  // and UninstallMultipleProtocolInterfaces would stop processing ProtocolArray
+  // elements as soon as they encounter a NULL.
+  //
+  ZeroMem(ProtocolArray, sizeof(ProtocolArray));
+  ProtocolCount = 0;
+
+  //
+  // Populate ProtocolArray with valid protocol interfaces.
+  //
+  ProtocolArray[ProtocolCount].Guid = &gEfiDriverBindingProtocolGuid;
+  ProtocolArray[ProtocolCount].Interface = DriverBinding;
+  ProtocolCount++;
+
+  if (ComponentName != NULL && !FeaturePcdGet(PcdComponentNameDisable)) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiComponentNameProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)ComponentName;
+    ProtocolCount++;
+  }
+
+  if (ComponentName2 != NULL && !FeaturePcdGet(PcdComponentName2Disable)) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiComponentName2ProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)ComponentName2;
+    ProtocolCount++;
+  }
+
+  if (DriverConfiguration != NULL) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiDriverConfigurationProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)DriverConfiguration;
+    ProtocolCount++;
+  }
+
+  if (DriverConfiguration2 != NULL) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiDriverConfiguration2ProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)DriverConfiguration2;
+    ProtocolCount++;
+  }
+
+  if (DriverDiagnostics != NULL && !FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiDriverDiagnosticsProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)DriverDiagnostics;
+    ProtocolCount++;
+  }
+
+  if (DriverDiagnostics2 != NULL && !FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
+    ProtocolArray[ProtocolCount].Guid = &gEfiDriverDiagnostics2ProtocolGuid;
+    ProtocolArray[ProtocolCount].Interface = (VOID *)DriverDiagnostics2;
+    ProtocolCount++;
+  }
+
+  if (Install) {
+    //
+    // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
+    //
+    DriverBinding->ImageHandle         = ImageHandle;
+    DriverBinding->DriverBindingHandle = DriverBindingHandle;
+
+    Status = gBS->InstallMultipleProtocolInterfaces (
+                    &DriverBinding->DriverBindingHandle,
+                    ProtocolArray[0].Guid, ProtocolArray[0].Interface,
+                    ProtocolArray[1].Guid, ProtocolArray[1].Interface,
+                    ProtocolArray[2].Guid, ProtocolArray[2].Interface,
+                    ProtocolArray[3].Guid, ProtocolArray[3].Interface,
+                    ProtocolArray[4].Guid, ProtocolArray[4].Interface,
+                    ProtocolArray[5].Guid, ProtocolArray[5].Interface,
+                    ProtocolArray[6].Guid, ProtocolArray[6].Interface,
+                    NULL
+                    );
+  } else {
+    Status = gBS->UninstallMultipleProtocolInterfaces (
+                    DriverBinding->DriverBindingHandle,
+                    ProtocolArray[0].Guid, ProtocolArray[0].Interface,
+                    ProtocolArray[1].Guid, ProtocolArray[1].Interface,
+                    ProtocolArray[2].Guid, ProtocolArray[2].Interface,
+                    ProtocolArray[3].Guid, ProtocolArray[3].Interface,
+                    ProtocolArray[4].Guid, ProtocolArray[4].Interface,
+                    ProtocolArray[5].Guid, ProtocolArray[5].Interface,
+                    ProtocolArray[6].Guid, ProtocolArray[6].Interface,
+                    NULL
+                    );
+  }
+
+  //
+  // ASSERT if the call to InstallMultipleProtocolInterfaces() or
+  // UninstallMultipleProtocolInterfaces() failed
+  //
+  ASSERT_EFI_ERROR (Status);
+
+  return Status;
+}
+
+
+
 /**
   Installs and completes the initialization of a Driver Binding Protocol instance.
 
@@ -47,30 +172,56 @@ EfiLibInstallDriverBinding (
   IN EFI_HANDLE                   DriverBindingHandle
   )
 {
-  EFI_STATUS  Status;
+  return EfiLibProcessProtocol (
+           ImageHandle,
+           DriverBinding,
+           DriverBindingHandle,
+           TRUE,
+           NULL,
+           NULL,
+           NULL,
+           NULL,
+           NULL,
+           NULL
+           );
+}
 
-  ASSERT (DriverBinding != NULL);
 
-  //
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
-  //
-  DriverBinding->ImageHandle         = ImageHandle;
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;
-
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &DriverBinding->DriverBindingHandle,
-                  &gEfiDriverBindingProtocolGuid, DriverBinding,
-                  NULL
-                  );
-  //
-  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
-  //
-  ASSERT_EFI_ERROR (Status);
 
-  return Status;
+/**
+  Uninstalls a Driver Binding Protocol instance.
+
+  If DriverBinding is NULL, then ASSERT().
+  If DriverBinding can not be uninstalled, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallDriverBinding (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding
+  )
+{
+  return EfiLibProcessProtocol (
+           NULL,
+           DriverBinding,
+           NULL,
+           FALSE,
+           NULL,
+           NULL,
+           NULL,
+           NULL,
+           NULL,
+           NULL
+           );
 }
 
 
+
 /**
   Installs and completes the initialization of a Driver Binding Protocol instance and
   optionally installs the Component Name, Driver Configuration and Driver Diagnostics Protocols.
@@ -109,96 +260,59 @@ EfiLibInstallAllDriverProtocols (
   IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
   )
 {
-  EFI_STATUS  Status;
+  return EfiLibProcessProtocol (
+           ImageHandle,
+           DriverBinding,
+           DriverBindingHandle,
+           TRUE,
+           ComponentName,
+           NULL,
+           DriverConfiguration,
+           NULL,
+           DriverDiagnostics,
+           NULL
+           );
+}
 
-  ASSERT (DriverBinding != NULL);
 
-  //
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
-  //
-  DriverBinding->ImageHandle         = ImageHandle;
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;
-
-  if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
-    if (DriverConfiguration == NULL) {
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid, DriverBinding,
-                        NULL
-                        );
-      } else {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid, DriverBinding,
-                        &gEfiComponentNameProtocolGuid, ComponentName,
-                        NULL
-                        );
-      }
-    } else {
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                        NULL
-                        );
-      } else {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
-                        &gEfiComponentNameProtocolGuid,       ComponentName,
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                        NULL
-                        );
-      }
-    }
-  } else {
-    if (DriverConfiguration == NULL) {
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
-                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                        NULL
-                        );
-      } else {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
-                        &gEfiComponentNameProtocolGuid,     ComponentName,
-                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                        NULL
-                        );
-      }
-    } else {
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-       Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
-                        NULL
-                        );
-      } else {
-        Status = gBS->InstallMultipleProtocolInterfaces (
-                        &DriverBinding->DriverBindingHandle,
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
-                        &gEfiComponentNameProtocolGuid,       ComponentName,
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
-                        NULL
-                        );
-      }
-    }
-  }
 
-  //
-  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
-  //
-  ASSERT_EFI_ERROR (Status);
+/**
+  Uninstalls a Driver Binding Protocol instance and optionally uninstalls the
+  Component Name, Driver Configuration and Driver Diagnostics Protocols.
 
-  return Status;
+  If DriverBinding is NULL, then ASSERT().
+  If the uninstallation fails, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.
+  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver produced.
+  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallAllDriverProtocols (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
+  )
+{
+  return EfiLibProcessProtocol (
+           NULL,
+           DriverBinding,
+           NULL,
+           FALSE,
+           ComponentName,
+           NULL,
+           DriverConfiguration,
+           NULL,
+           DriverDiagnostics,
+           NULL
+           );
 }
 
 
@@ -237,56 +351,56 @@ EfiLibInstallDriverBindingComponentName2 (
   IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
   )
 {
-  EFI_STATUS  Status;
+  return EfiLibProcessProtocol (
+           ImageHandle,
+           DriverBinding,
+           DriverBindingHandle,
+           TRUE,
+           ComponentName,
+           ComponentName2,
+           NULL,
+           NULL,
+           NULL,
+           NULL
+           );
+}
 
-  ASSERT (DriverBinding != NULL);
 
-  //
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
-  //
-  DriverBinding->ImageHandle         = ImageHandle;
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;
-
-  if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-    if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &DriverBinding->DriverBindingHandle,
-                      &gEfiDriverBindingProtocolGuid, DriverBinding,
-                      NULL
-                      );
-      } else {
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &DriverBinding->DriverBindingHandle,
-                      &gEfiDriverBindingProtocolGuid, DriverBinding,
-                      &gEfiComponentName2ProtocolGuid, ComponentName2,
-                      NULL
-                      );
-     }
-  } else {
-     if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-       Status = gBS->InstallMultipleProtocolInterfaces (
-                       &DriverBinding->DriverBindingHandle,
-                       &gEfiDriverBindingProtocolGuid, DriverBinding,
-                       &gEfiComponentNameProtocolGuid, ComponentName,
-                       NULL
-                       );
-     } else {
-       Status = gBS->InstallMultipleProtocolInterfaces (
-                       &DriverBinding->DriverBindingHandle,
-                       &gEfiDriverBindingProtocolGuid, DriverBinding,
-                       &gEfiComponentNameProtocolGuid, ComponentName,
-                       &gEfiComponentName2ProtocolGuid, ComponentName2,
-                       NULL
-                       );
-    }
-  }
 
-  //
-  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
-  //
-  ASSERT_EFI_ERROR (Status);
+/**
+  Uninstalls Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.
 
-  return Status;
+  If DriverBinding is NULL, then ASSERT().
+  If the uninstallation fails, then ASSERT().
+
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.
+  @param  ComponentName2       A Component Name 2 Protocol instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol installation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallDriverBindingComponentName2 (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
+  )
+{
+  return EfiLibProcessProtocol (
+           NULL,
+           DriverBinding,
+           NULL,
+           FALSE,
+           ComponentName,
+           ComponentName2,
+           NULL,
+           NULL,
+           NULL,
+           NULL
+           );
 }
 
 
@@ -335,722 +449,64 @@ EfiLibInstallAllDriverProtocols2 (
   IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
   )
 {
-  EFI_STATUS  Status;
+  return EfiLibProcessProtocol (
+           ImageHandle,
+           DriverBinding,
+           DriverBindingHandle,
+           TRUE,
+           ComponentName,
+           ComponentName2,
+           DriverConfiguration,
+           DriverConfiguration2,
+           DriverDiagnostics,
+           DriverDiagnostics2
+           );
+}
 
-  ASSERT (DriverBinding != NULL);
 
-  //
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
-  //
-  DriverBinding->ImageHandle         = ImageHandle;
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;
-
-  if (DriverConfiguration2 == NULL) {
-    if (DriverConfiguration == NULL) {
-      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      } else {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      }
-    } else {
-      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      } else {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      }
-    }
-  } else {
-    if (DriverConfiguration == NULL) {
-      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      } else {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      }
-    } else {
-      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      } else {
-        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              NULL
-                              );
-            }
-          }
-        } else {
-          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          } else {
-            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            } else {
-              Status = gBS->InstallMultipleProtocolInterfaces (
-                              &DriverBinding->DriverBindingHandle,
-                              &gEfiDriverBindingProtocolGuid, DriverBinding,
-                              &gEfiComponentNameProtocolGuid, ComponentName,
-                              &gEfiComponentName2ProtocolGuid, ComponentName2,
-                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
-                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
-                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
-                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
-                              NULL
-                              );
-            }
-          }
-        }
-      }
-    }
-  }
 
-  //
-  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
-  //
-  ASSERT_EFI_ERROR (Status);
+/**
+  Uninstalls Driver Binding Protocol with optional Component Name, Component Name 2, Driver
+  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.
 
-  return Status;
+  If DriverBinding is NULL, then ASSERT().
+  If the installation fails, then ASSERT().
+
+
+  @param  DriverBinding         A Driver Binding Protocol instance that this driver produced.
+  @param  ComponentName         A Component Name Protocol instance that this driver produced.
+  @param  ComponentName2        A Component Name 2 Protocol instance that this driver produced.
+  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver produced.
+  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver produced.
+  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver produced.
+  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver produced.
+
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().
+
+**/
+EFI_STATUS
+EFIAPI
+EfiLibUninstallAllDriverProtocols2 (
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,        OPTIONAL
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,       OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,  OPTIONAL
+  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,    OPTIONAL
+  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
+  )
+{
+  return EfiLibProcessProtocol (
+           NULL,
+           DriverBinding,
+           NULL,
+           FALSE,
+           ComponentName,
+           ComponentName2,
+           DriverConfiguration,
+           DriverConfiguration2,
+           DriverDiagnostics,
+           DriverDiagnostics2
+           );
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 2/2] NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols.
  2019-01-07  4:37 [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
  2019-01-07  4:37 ` [PATCH v3 1/2] MdePkg/UefiLib: Abstract driver model " Ashish Singhal
@ 2019-01-07  4:37 ` Ashish Singhal
  2019-01-07 14:01 ` [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
  2 siblings, 0 replies; 11+ messages in thread
From: Ashish Singhal @ 2019-01-07  4:37 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ashish Singhal

During cleanup in case of initialization failure, some driver
bindings are not installed. Using abstractions in UEFILib takes
care of it.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1428

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c b/NetworkPkg/IScsiDxe/IScsiDriver.c
index 91176e6..8747de7 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -1,6 +1,7 @@
 /** @file
   The entry point of IScsi driver.
 
+Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>
 
@@ -1861,28 +1862,18 @@ Error3:
          );
 
 Error2:
-  gBS->UninstallMultipleProtocolInterfaces (
-         gIScsiIp6DriverBinding.DriverBindingHandle,
-         &gEfiDriverBindingProtocolGuid,
-         &gIScsiIp6DriverBinding,
-         &gEfiComponentName2ProtocolGuid,
-         &gIScsiComponentName2,
-         &gEfiComponentNameProtocolGuid,
-         &gIScsiComponentName,
-         NULL
-         );
+  EfiLibUninstallDriverBindingComponentName2 (
+    &gIScsiIp6DriverBinding,
+    &gIScsiComponentName,
+    &gIScsiComponentName2
+    );
 
 Error1:
-  gBS->UninstallMultipleProtocolInterfaces (
-         ImageHandle,
-         &gEfiDriverBindingProtocolGuid,
-         &gIScsiIp4DriverBinding,
-         &gEfiComponentName2ProtocolGuid,
-         &gIScsiComponentName2,
-         &gEfiComponentNameProtocolGuid,
-         &gIScsiComponentName,
-         NULL
-         );
+  EfiLibUninstallDriverBindingComponentName2 (
+    &gIScsiIp4DriverBinding,
+    &gIScsiComponentName,
+    &gIScsiComponentName2
+    );
 
   return Status;
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-07  4:37 [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
  2019-01-07  4:37 ` [PATCH v3 1/2] MdePkg/UefiLib: Abstract driver model " Ashish Singhal
  2019-01-07  4:37 ` [PATCH v3 2/2] NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols Ashish Singhal
@ 2019-01-07 14:01 ` Ashish Singhal
  2019-01-07 22:22   ` Kinney, Michael D
  2 siblings, 1 reply; 11+ messages in thread
From: Ashish Singhal @ 2019-01-07 14:01 UTC (permalink / raw)
  To: edk2-devel@lists.01.org, Michael D Kinney, Liming Gao, Siyuan Fu,
	Jiaxin Wu

+ Maintainers

-----Original Message-----
From: Ashish Singhal <ashishsingha@nvidia.com> 
Sent: Sunday, January 6, 2019 9:38 PM
To: edk2-devel@lists.01.org
Cc: Ashish Singhal <ashishsingha@nvidia.com>
Subject: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

An issue was seen in IScsiDxe in NetworkPkg where driver cleanup after initialization failure was not done right. Bug 1428 was filed in this regard.
As per discussions with Mike, it was also discussed that having UEFILib provide protocol uninstallation abstraction would help to avoid these issues in the future. Bug 1429 was found to track this. The first 2 patches take care of this.

Patch number 1 also simplifies the UEFILib protocol installation and uninstallation abstraction by adding a helper function doing operations instead of every public function.

Ashish Singhal (2):
  MdePkg/UefiLib: Abstract driver model protocol uninstallation
  NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols.

 MdePkg/Include/Library/UefiLib.h         |  103 +++
 MdePkg/Library/UefiLib/UefiDriverModel.c | 1186 ++++++++----------------------
 NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
 3 files changed, 435 insertions(+), 885 deletions(-)

--
2.7.4

-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-07 14:01 ` [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
@ 2019-01-07 22:22   ` Kinney, Michael D
  2019-01-07 22:50     ` Ashish Singhal
  0 siblings, 1 reply; 11+ messages in thread
From: Kinney, Michael D @ 2019-01-07 22:22 UTC (permalink / raw)
  To: Ashish Singhal, edk2-devel@lists.01.org, Gao, Liming, Fu, Siyuan,
	Wu, Jiaxin, Kinney, Michael D

Hi Ashish,

My main concern with this patch is that the 
generated code for optimized RELEASE builds is
not as small.

>From a source maintenance perspective, the patch
you have provided is easier to maintain.  However,
the implementation of the APIs that install protocols
was done to make sure the optimizer produces the 
smallest number of instructions to install the 
protocols.

I would prefer the APIs that install protocols
remain unchanged, and that only the new APIs to
uninstall the protocols be added.  The same
approach could be taken in the implementation
to produce the exact right form of the uninstall
action that is guaranteed to succeed if the uninstall
API matches the API that was used to install.

Thanks,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Monday, January 7, 2019 6:02 AM
> To: edk2-devel@lists.01.org; Kinney, Michael D
> <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol uninstallation.
> 
> + Maintainers
> 
> -----Original Message-----
> From: Ashish Singhal <ashishsingha@nvidia.com>
> Sent: Sunday, January 6, 2019 9:38 PM
> To: edk2-devel@lists.01.org
> Cc: Ashish Singhal <ashishsingha@nvidia.com>
> Subject: [PATCH v3 0/2] Provide UEFILib functions for
> protocol uninstallation.
> 
> An issue was seen in IScsiDxe in NetworkPkg where
> driver cleanup after initialization failure was not
> done right. Bug 1428 was filed in this regard.
> As per discussions with Mike, it was also discussed
> that having UEFILib provide protocol uninstallation
> abstraction would help to avoid these issues in the
> future. Bug 1429 was found to track this. The first 2
> patches take care of this.
> 
> Patch number 1 also simplifies the UEFILib protocol
> installation and uninstallation abstraction by adding a
> helper function doing operations instead of every
> public function.
> 
> Ashish Singhal (2):
>   MdePkg/UefiLib: Abstract driver model protocol
> uninstallation
>   NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall
> protocols.
> 
>  MdePkg/Include/Library/UefiLib.h         |  103 +++
>  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> ++++++++----------------------
>  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
>  3 files changed, 435 insertions(+), 885 deletions(-)
> 
> --
> 2.7.4
> 
> -------------------------------------------------------
> ----------------------------
> This email message is for the sole use of the intended
> recipient(s) and may contain
> confidential information.  Any unauthorized review,
> use, disclosure or distribution
> is prohibited.  If you are not the intended recipient,
> please contact the sender by
> reply email and destroy all copies of the original
> message.
> -------------------------------------------------------
> ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-07 22:22   ` Kinney, Michael D
@ 2019-01-07 22:50     ` Ashish Singhal
  2019-01-08 16:25       ` Kinney, Michael D
  0 siblings, 1 reply; 11+ messages in thread
From: Ashish Singhal @ 2019-01-07 22:50 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org, Gao, Liming,
	Fu, Siyuan, Wu, Jiaxin

Hi Mike,

I build both DEBUG and RELEASE variant of the library and they both built a few KB less in size compared to what is in tip right now. Can you please help me with the optimization settings you have enabled so that I can try the same at my end? Also, if you want, we can look at the optimization part going forward and fix the issue first by pushing in PATCH v2 1/4 and PATCH v2 2/4 which just adds uninstallation APIs keeping the same code structure as for install.

Thanks
Ashish

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@intel.com> 
Sent: Monday, January 7, 2019 3:23 PM
To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>
Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

Hi Ashish,

My main concern with this patch is that the generated code for optimized RELEASE builds is not as small.

>From a source maintenance perspective, the patch you have provided is easier to maintain.  However, the implementation of the APIs that install protocols was done to make sure the optimizer produces the smallest number of instructions to install the protocols.

I would prefer the APIs that install protocols remain unchanged, and that only the new APIs to uninstall the protocols be added.  The same approach could be taken in the implementation to produce the exact right form of the uninstall action that is guaranteed to succeed if the uninstall API matches the API that was used to install.

Thanks,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Monday, January 7, 2019 6:02 AM
> To: edk2-devel@lists.01.org; Kinney, Michael D 
> <michael.d.kinney@intel.com>; Gao, Liming <liming.gao@intel.com>; Fu, 
> Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> + Maintainers
> 
> -----Original Message-----
> From: Ashish Singhal <ashishsingha@nvidia.com>
> Sent: Sunday, January 6, 2019 9:38 PM
> To: edk2-devel@lists.01.org
> Cc: Ashish Singhal <ashishsingha@nvidia.com>
> Subject: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> An issue was seen in IScsiDxe in NetworkPkg where driver cleanup after 
> initialization failure was not done right. Bug 1428 was filed in this 
> regard.
> As per discussions with Mike, it was also discussed that having 
> UEFILib provide protocol uninstallation abstraction would help to 
> avoid these issues in the future. Bug 1429 was found to track this. 
> The first 2 patches take care of this.
> 
> Patch number 1 also simplifies the UEFILib protocol installation and 
> uninstallation abstraction by adding a helper function doing 
> operations instead of every public function.
> 
> Ashish Singhal (2):
>   MdePkg/UefiLib: Abstract driver model protocol uninstallation
>   NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols.
> 
>  MdePkg/Include/Library/UefiLib.h         |  103 +++
>  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> ++++++++----------------------
>  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
>  3 files changed, 435 insertions(+), 885 deletions(-)
> 
> --
> 2.7.4
> 
> -------------------------------------------------------
> ----------------------------
> This email message is for the sole use of the intended
> recipient(s) and may contain
> confidential information.  Any unauthorized review, use, disclosure or 
> distribution is prohibited.  If you are not the intended recipient, 
> please contact the sender by reply email and destroy all copies of the 
> original message.
> -------------------------------------------------------
> ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-07 22:50     ` Ashish Singhal
@ 2019-01-08 16:25       ` Kinney, Michael D
  2019-01-08 17:24         ` Ashish Singhal
  0 siblings, 1 reply; 11+ messages in thread
From: Kinney, Michael D @ 2019-01-08 16:25 UTC (permalink / raw)
  To: Ashish Singhal, edk2-devel@lists.01.org, Gao, Liming, Fu, Siyuan,
	Wu, Jiaxin, Kinney, Michael D

Ashish,

Good point.  I was looking at the code size of a single
uncompressed UEFI Driver (DiskIoDxe).  I suspect that the
patch provides a more consistent pattern across all drivers
that use these UefiLib APIs, and then provides better
compression on an FV that contains many UEFI Drivers.

I also suspect there may be a small size increase for the
single compressed UEFI Driver use case for PCI Option ROMs.

I will run a few more experiments this morning.

Thanks,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Monday, January 7, 2019 2:51 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>;
> edk2-devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol uninstallation.
> 
> Hi Mike,
> 
> I build both DEBUG and RELEASE variant of the library
> and they both built a few KB less in size compared to
> what is in tip right now. Can you please help me with
> the optimization settings you have enabled so that I
> can try the same at my end? Also, if you want, we can
> look at the optimization part going forward and fix the
> issue first by pushing in PATCH v2 1/4 and PATCH v2 2/4
> which just adds uninstallation APIs keeping the same
> code structure as for install.
> 
> Thanks
> Ashish
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Monday, January 7, 2019 3:23 PM
> To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-
> devel@lists.01.org; Gao, Liming <liming.gao@intel.com>;
> Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol uninstallation.
> 
> Hi Ashish,
> 
> My main concern with this patch is that the generated
> code for optimized RELEASE builds is not as small.
> 
> From a source maintenance perspective, the patch you
> have provided is easier to maintain.  However, the
> implementation of the APIs that install protocols was
> done to make sure the optimizer produces the smallest
> number of instructions to install the protocols.
> 
> I would prefer the APIs that install protocols remain
> unchanged, and that only the new APIs to uninstall the
> protocols be added.  The same approach could be taken
> in the implementation to produce the exact right form
> of the uninstall action that is guaranteed to succeed
> if the uninstall API matches the API that was used to
> install.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> > Sent: Monday, January 7, 2019 6:02 AM
> > To: edk2-devel@lists.01.org; Kinney, Michael D
> > <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Fu,
> > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > + Maintainers
> >
> > -----Original Message-----
> > From: Ashish Singhal <ashishsingha@nvidia.com>
> > Sent: Sunday, January 6, 2019 9:38 PM
> > To: edk2-devel@lists.01.org
> > Cc: Ashish Singhal <ashishsingha@nvidia.com>
> > Subject: [PATCH v3 0/2] Provide UEFILib functions for
> protocol
> > uninstallation.
> >
> > An issue was seen in IScsiDxe in NetworkPkg where
> driver cleanup after
> > initialization failure was not done right. Bug 1428
> was filed in this
> > regard.
> > As per discussions with Mike, it was also discussed
> that having
> > UEFILib provide protocol uninstallation abstraction
> would help to
> > avoid these issues in the future. Bug 1429 was found
> to track this.
> > The first 2 patches take care of this.
> >
> > Patch number 1 also simplifies the UEFILib protocol
> installation and
> > uninstallation abstraction by adding a helper
> function doing
> > operations instead of every public function.
> >
> > Ashish Singhal (2):
> >   MdePkg/UefiLib: Abstract driver model protocol
> uninstallation
> >   NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall
> protocols.
> >
> >  MdePkg/Include/Library/UefiLib.h         |  103 +++
> >  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> > ++++++++----------------------
> >  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
> >  3 files changed, 435 insertions(+), 885 deletions(-)
> >
> > --
> > 2.7.4
> >
> > -----------------------------------------------------
> --
> > ----------------------------
> > This email message is for the sole use of the
> intended
> > recipient(s) and may contain
> > confidential information.  Any unauthorized review,
> use, disclosure or
> > distribution is prohibited.  If you are not the
> intended recipient,
> > please contact the sender by reply email and destroy
> all copies of the
> > original message.
> > -----------------------------------------------------
> --
> > ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-08 16:25       ` Kinney, Michael D
@ 2019-01-08 17:24         ` Ashish Singhal
  2019-01-09  2:57           ` Kinney, Michael D
  0 siblings, 1 reply; 11+ messages in thread
From: Ashish Singhal @ 2019-01-08 17:24 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org, Gao, Liming,
	Fu, Siyuan, Wu, Jiaxin

Thanks Mike. Please let me know if you have any more questions and/or comments.

Thanks
Ashish

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@intel.com> 
Sent: Tuesday, January 8, 2019 9:26 AM
To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>
Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

Ashish,

Good point.  I was looking at the code size of a single uncompressed UEFI Driver (DiskIoDxe).  I suspect that the patch provides a more consistent pattern across all drivers that use these UefiLib APIs, and then provides better compression on an FV that contains many UEFI Drivers.

I also suspect there may be a small size increase for the single compressed UEFI Driver use case for PCI Option ROMs.

I will run a few more experiments this morning.

Thanks,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Monday, January 7, 2019 2:51 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; 
> edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, 
> Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Hi Mike,
> 
> I build both DEBUG and RELEASE variant of the library and they both 
> built a few KB less in size compared to what is in tip right now. Can 
> you please help me with the optimization settings you have enabled so 
> that I can try the same at my end? Also, if you want, we can look at 
> the optimization part going forward and fix the issue first by pushing 
> in PATCH v2 1/4 and PATCH v2 2/4 which just adds uninstallation APIs 
> keeping the same code structure as for install.
> 
> Thanks
> Ashish
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Monday, January 7, 2019 3:23 PM
> To: Ashish Singhal <ashishsingha@nvidia.com>; edk2- 
> devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan 
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, 
> Michael D <michael.d.kinney@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Hi Ashish,
> 
> My main concern with this patch is that the generated code for 
> optimized RELEASE builds is not as small.
> 
> From a source maintenance perspective, the patch you have provided is 
> easier to maintain.  However, the implementation of the APIs that 
> install protocols was done to make sure the optimizer produces the 
> smallest number of instructions to install the protocols.
> 
> I would prefer the APIs that install protocols remain unchanged, and 
> that only the new APIs to uninstall the protocols be added.  The same 
> approach could be taken in the implementation to produce the exact 
> right form of the uninstall action that is guaranteed to succeed if 
> the uninstall API matches the API that was used to install.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> > Sent: Monday, January 7, 2019 6:02 AM
> > To: edk2-devel@lists.01.org; Kinney, Michael D 
> > <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Fu,
> > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > + Maintainers
> >
> > -----Original Message-----
> > From: Ashish Singhal <ashishsingha@nvidia.com>
> > Sent: Sunday, January 6, 2019 9:38 PM
> > To: edk2-devel@lists.01.org
> > Cc: Ashish Singhal <ashishsingha@nvidia.com>
> > Subject: [PATCH v3 0/2] Provide UEFILib functions for
> protocol
> > uninstallation.
> >
> > An issue was seen in IScsiDxe in NetworkPkg where
> driver cleanup after
> > initialization failure was not done right. Bug 1428
> was filed in this
> > regard.
> > As per discussions with Mike, it was also discussed
> that having
> > UEFILib provide protocol uninstallation abstraction
> would help to
> > avoid these issues in the future. Bug 1429 was found
> to track this.
> > The first 2 patches take care of this.
> >
> > Patch number 1 also simplifies the UEFILib protocol
> installation and
> > uninstallation abstraction by adding a helper
> function doing
> > operations instead of every public function.
> >
> > Ashish Singhal (2):
> >   MdePkg/UefiLib: Abstract driver model protocol
> uninstallation
> >   NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall
> protocols.
> >
> >  MdePkg/Include/Library/UefiLib.h         |  103 +++
> >  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> > ++++++++----------------------
> >  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
> >  3 files changed, 435 insertions(+), 885 deletions(-)
> >
> > --
> > 2.7.4
> >
> > -----------------------------------------------------
> --
> > ----------------------------
> > This email message is for the sole use of the
> intended
> > recipient(s) and may contain
> > confidential information.  Any unauthorized review,
> use, disclosure or
> > distribution is prohibited.  If you are not the
> intended recipient,
> > please contact the sender by reply email and destroy
> all copies of the
> > original message.
> > -----------------------------------------------------
> --
> > ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-08 17:24         ` Ashish Singhal
@ 2019-01-09  2:57           ` Kinney, Michael D
  2019-01-09  3:02             ` Ashish Singhal
  0 siblings, 1 reply; 11+ messages in thread
From: Kinney, Michael D @ 2019-01-09  2:57 UTC (permalink / raw)
  To: Ashish Singhal, edk2-devel@lists.01.org, Gao, Liming, Fu, Siyuan,
	Wu, Jiaxin, Kinney, Michael D

Ashish,

When I do full platform builds and individual driver
builds, the result is always a little bigger with the
V3 version of the patch.

                           	 DEBUG  DEBUG+Patch  Delta  RELEASE	RELEASE+Patch  Delta
                           	 *****  ***********  *****  *******	*************  *****
Quark IA32 FVMAIN            2337360      2339408   2048  1181168        1182992   1824
Quark IA32 FVMAIN_COMPACT     814664       815272    608   516208         516904    696
DiskIoDxe.efi                  18752        18880    128     5824           5952    128
DiskIoDxe.ROM                  10240        10240      0     3419           3569    150
OVMF X64 DXEFV               4447368      4456968   9600  2956808        2966312   9504
OVMF X64 FVMAIN_COMPACT      1164264      1164784    520   912528         913048    520

I recommend the install APIs remain unchanged, and the
uninstall APIs use the same logic as the install APIs.

Best regards,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Tuesday, January 8, 2019 9:24 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>;
> edk2-devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol uninstallation.
> 
> Thanks Mike. Please let me know if you have any more
> questions and/or comments.
> 
> Thanks
> Ashish
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Tuesday, January 8, 2019 9:26 AM
> To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-
> devel@lists.01.org; Gao, Liming <liming.gao@intel.com>;
> Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol uninstallation.
> 
> Ashish,
> 
> Good point.  I was looking at the code size of a single
> uncompressed UEFI Driver (DiskIoDxe).  I suspect that
> the patch provides a more consistent pattern across all
> drivers that use these UefiLib APIs, and then provides
> better compression on an FV that contains many UEFI
> Drivers.
> 
> I also suspect there may be a small size increase for
> the single compressed UEFI Driver use case for PCI
> Option ROMs.
> 
> I will run a few more experiments this morning.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> > Sent: Monday, January 7, 2019 2:51 PM
> > To: Kinney, Michael D <michael.d.kinney@intel.com>;
> > edk2-devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu,
> > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Mike,
> >
> > I build both DEBUG and RELEASE variant of the library
> and they both
> > built a few KB less in size compared to what is in
> tip right now. Can
> > you please help me with the optimization settings you
> have enabled so
> > that I can try the same at my end? Also, if you want,
> we can look at
> > the optimization part going forward and fix the issue
> first by pushing
> > in PATCH v2 1/4 and PATCH v2 2/4 which just adds
> uninstallation APIs
> > keeping the same code structure as for install.
> >
> > Thanks
> > Ashish
> >
> > -----Original Message-----
> > From: Kinney, Michael D <michael.d.kinney@intel.com>
> > Sent: Monday, January 7, 2019 3:23 PM
> > To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-
> > devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> > <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>; Kinney,
> > Michael D <michael.d.kinney@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Ashish,
> >
> > My main concern with this patch is that the generated
> code for
> > optimized RELEASE builds is not as small.
> >
> > From a source maintenance perspective, the patch you
> have provided is
> > easier to maintain.  However, the implementation of
> the APIs that
> > install protocols was done to make sure the optimizer
> produces the
> > smallest number of instructions to install the
> protocols.
> >
> > I would prefer the APIs that install protocols remain
> unchanged, and
> > that only the new APIs to uninstall the protocols be
> added.  The same
> > approach could be taken in the implementation to
> produce the exact
> > right form of the uninstall action that is guaranteed
> to succeed if
> > the uninstall API matches the API that was used to
> install.
> >
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Ashish Singhal
> [mailto:ashishsingha@nvidia.com]
> > > Sent: Monday, January 7, 2019 6:02 AM
> > > To: edk2-devel@lists.01.org; Kinney, Michael D
> > > <michael.d.kinney@intel.com>; Gao, Liming
> > <liming.gao@intel.com>; Fu,
> > > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> > <jiaxin.wu@intel.com>
> > > Subject: RE: [PATCH v3 0/2] Provide UEFILib
> functions
> > for protocol
> > > uninstallation.
> > >
> > > + Maintainers
> > >
> > > -----Original Message-----
> > > From: Ashish Singhal <ashishsingha@nvidia.com>
> > > Sent: Sunday, January 6, 2019 9:38 PM
> > > To: edk2-devel@lists.01.org
> > > Cc: Ashish Singhal <ashishsingha@nvidia.com>
> > > Subject: [PATCH v3 0/2] Provide UEFILib functions
> for
> > protocol
> > > uninstallation.
> > >
> > > An issue was seen in IScsiDxe in NetworkPkg where
> > driver cleanup after
> > > initialization failure was not done right. Bug 1428
> > was filed in this
> > > regard.
> > > As per discussions with Mike, it was also discussed
> > that having
> > > UEFILib provide protocol uninstallation abstraction
> > would help to
> > > avoid these issues in the future. Bug 1429 was
> found
> > to track this.
> > > The first 2 patches take care of this.
> > >
> > > Patch number 1 also simplifies the UEFILib protocol
> > installation and
> > > uninstallation abstraction by adding a helper
> > function doing
> > > operations instead of every public function.
> > >
> > > Ashish Singhal (2):
> > >   MdePkg/UefiLib: Abstract driver model protocol
> > uninstallation
> > >   NetworkPkg/IScsiDxe: Use UEFILib APIs to
> uninstall
> > protocols.
> > >
> > >  MdePkg/Include/Library/UefiLib.h         |  103
> +++
> > >  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> > > ++++++++----------------------
> > >  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
> > >  3 files changed, 435 insertions(+), 885
> deletions(-)
> > >
> > > --
> > > 2.7.4
> > >
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------
> > > This email message is for the sole use of the
> > intended
> > > recipient(s) and may contain
> > > confidential information.  Any unauthorized review,
> > use, disclosure or
> > > distribution is prohibited.  If you are not the
> > intended recipient,
> > > please contact the sender by reply email and
> destroy
> > all copies of the
> > > original message.
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-09  2:57           ` Kinney, Michael D
@ 2019-01-09  3:02             ` Ashish Singhal
  2019-02-04 20:18               ` Ashish Singhal
  0 siblings, 1 reply; 11+ messages in thread
From: Ashish Singhal @ 2019-01-09  3:02 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org, Gao, Liming,
	Fu, Siyuan, Wu, Jiaxin

Hi Mike,

Thanks for the analysis. I will investigate at my end what could be causing this. Meanwhile, to fix the issue do you want to submit PATCH v2 1/4 and 2/4 patches? These 2 patches are just what you suggested.

Thanks
Ashish

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@intel.com> 
Sent: Tuesday, January 8, 2019 7:58 PM
To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>
Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

Ashish,

When I do full platform builds and individual driver builds, the result is always a little bigger with the
V3 version of the patch.

                           	 DEBUG  DEBUG+Patch  Delta  RELEASE	RELEASE+Patch  Delta
                           	 *****  ***********  *****  *******	*************  *****
Quark IA32 FVMAIN            2337360      2339408   2048  1181168        1182992   1824
Quark IA32 FVMAIN_COMPACT     814664       815272    608   516208         516904    696
DiskIoDxe.efi                  18752        18880    128     5824           5952    128
DiskIoDxe.ROM                  10240        10240      0     3419           3569    150
OVMF X64 DXEFV               4447368      4456968   9600  2956808        2966312   9504
OVMF X64 FVMAIN_COMPACT      1164264      1164784    520   912528         913048    520

I recommend the install APIs remain unchanged, and the uninstall APIs use the same logic as the install APIs.

Best regards,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Tuesday, January 8, 2019 9:24 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; 
> edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, 
> Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Thanks Mike. Please let me know if you have any more questions and/or 
> comments.
> 
> Thanks
> Ashish
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Tuesday, January 8, 2019 9:26 AM
> To: Ashish Singhal <ashishsingha@nvidia.com>; edk2- 
> devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan 
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, 
> Michael D <michael.d.kinney@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Ashish,
> 
> Good point.  I was looking at the code size of a single uncompressed 
> UEFI Driver (DiskIoDxe).  I suspect that the patch provides a more 
> consistent pattern across all drivers that use these UefiLib APIs, and 
> then provides better compression on an FV that contains many UEFI 
> Drivers.
> 
> I also suspect there may be a small size increase for the single 
> compressed UEFI Driver use case for PCI Option ROMs.
> 
> I will run a few more experiments this morning.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> > Sent: Monday, January 7, 2019 2:51 PM
> > To: Kinney, Michael D <michael.d.kinney@intel.com>; 
> > edk2-devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu,
> > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Mike,
> >
> > I build both DEBUG and RELEASE variant of the library
> and they both
> > built a few KB less in size compared to what is in
> tip right now. Can
> > you please help me with the optimization settings you
> have enabled so
> > that I can try the same at my end? Also, if you want,
> we can look at
> > the optimization part going forward and fix the issue
> first by pushing
> > in PATCH v2 1/4 and PATCH v2 2/4 which just adds
> uninstallation APIs
> > keeping the same code structure as for install.
> >
> > Thanks
> > Ashish
> >
> > -----Original Message-----
> > From: Kinney, Michael D <michael.d.kinney@intel.com>
> > Sent: Monday, January 7, 2019 3:23 PM
> > To: Ashish Singhal <ashishsingha@nvidia.com>; edk2- 
> > devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> > <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>; Kinney,
> > Michael D <michael.d.kinney@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Ashish,
> >
> > My main concern with this patch is that the generated
> code for
> > optimized RELEASE builds is not as small.
> >
> > From a source maintenance perspective, the patch you
> have provided is
> > easier to maintain.  However, the implementation of
> the APIs that
> > install protocols was done to make sure the optimizer
> produces the
> > smallest number of instructions to install the
> protocols.
> >
> > I would prefer the APIs that install protocols remain
> unchanged, and
> > that only the new APIs to uninstall the protocols be
> added.  The same
> > approach could be taken in the implementation to
> produce the exact
> > right form of the uninstall action that is guaranteed
> to succeed if
> > the uninstall API matches the API that was used to
> install.
> >
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Ashish Singhal
> [mailto:ashishsingha@nvidia.com]
> > > Sent: Monday, January 7, 2019 6:02 AM
> > > To: edk2-devel@lists.01.org; Kinney, Michael D 
> > > <michael.d.kinney@intel.com>; Gao, Liming
> > <liming.gao@intel.com>; Fu,
> > > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> > <jiaxin.wu@intel.com>
> > > Subject: RE: [PATCH v3 0/2] Provide UEFILib
> functions
> > for protocol
> > > uninstallation.
> > >
> > > + Maintainers
> > >
> > > -----Original Message-----
> > > From: Ashish Singhal <ashishsingha@nvidia.com>
> > > Sent: Sunday, January 6, 2019 9:38 PM
> > > To: edk2-devel@lists.01.org
> > > Cc: Ashish Singhal <ashishsingha@nvidia.com>
> > > Subject: [PATCH v3 0/2] Provide UEFILib functions
> for
> > protocol
> > > uninstallation.
> > >
> > > An issue was seen in IScsiDxe in NetworkPkg where
> > driver cleanup after
> > > initialization failure was not done right. Bug 1428
> > was filed in this
> > > regard.
> > > As per discussions with Mike, it was also discussed
> > that having
> > > UEFILib provide protocol uninstallation abstraction
> > would help to
> > > avoid these issues in the future. Bug 1429 was
> found
> > to track this.
> > > The first 2 patches take care of this.
> > >
> > > Patch number 1 also simplifies the UEFILib protocol
> > installation and
> > > uninstallation abstraction by adding a helper
> > function doing
> > > operations instead of every public function.
> > >
> > > Ashish Singhal (2):
> > >   MdePkg/UefiLib: Abstract driver model protocol
> > uninstallation
> > >   NetworkPkg/IScsiDxe: Use UEFILib APIs to
> uninstall
> > protocols.
> > >
> > >  MdePkg/Include/Library/UefiLib.h         |  103
> +++
> > >  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> > > ++++++++----------------------
> > >  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
> > >  3 files changed, 435 insertions(+), 885
> deletions(-)
> > >
> > > --
> > > 2.7.4
> > >
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------
> > > This email message is for the sole use of the
> > intended
> > > recipient(s) and may contain
> > > confidential information.  Any unauthorized review,
> > use, disclosure or
> > > distribution is prohibited.  If you are not the
> > intended recipient,
> > > please contact the sender by reply email and
> destroy
> > all copies of the
> > > original message.
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.
  2019-01-09  3:02             ` Ashish Singhal
@ 2019-02-04 20:18               ` Ashish Singhal
  0 siblings, 0 replies; 11+ messages in thread
From: Ashish Singhal @ 2019-02-04 20:18 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org, Gao, Liming

Mike,

I have refactored my change and with this I am not seeing any size bloating in DEBUG or RELEASE images I am building for my platform. The new change has been submitted for consideration.

Thanks
Ashish

-----Original Message-----
From: Ashish Singhal 
Sent: Tuesday, January 8, 2019 8:02 PM
To: 'Kinney, Michael D' <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

Hi Mike,

Thanks for the analysis. I will investigate at my end what could be causing this. Meanwhile, to fix the issue do you want to submit PATCH v2 1/4 and 2/4 patches? These 2 patches are just what you suggested.

Thanks
Ashish

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@intel.com>
Sent: Tuesday, January 8, 2019 7:58 PM
To: Ashish Singhal <ashishsingha@nvidia.com>; edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>
Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation.

Ashish,

When I do full platform builds and individual driver builds, the result is always a little bigger with the
V3 version of the patch.

                           	 DEBUG  DEBUG+Patch  Delta  RELEASE	RELEASE+Patch  Delta
                           	 *****  ***********  *****  *******	*************  *****
Quark IA32 FVMAIN            2337360      2339408   2048  1181168        1182992   1824
Quark IA32 FVMAIN_COMPACT     814664       815272    608   516208         516904    696
DiskIoDxe.efi                  18752        18880    128     5824           5952    128
DiskIoDxe.ROM                  10240        10240      0     3419           3569    150
OVMF X64 DXEFV               4447368      4456968   9600  2956808        2966312   9504
OVMF X64 FVMAIN_COMPACT      1164264      1164784    520   912528         913048    520

I recommend the install APIs remain unchanged, and the uninstall APIs use the same logic as the install APIs.

Best regards,

Mike

> -----Original Message-----
> From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> Sent: Tuesday, January 8, 2019 9:24 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; 
> edk2-devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, 
> Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Thanks Mike. Please let me know if you have any more questions and/or 
> comments.
> 
> Thanks
> Ashish
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Tuesday, January 8, 2019 9:26 AM
> To: Ashish Singhal <ashishsingha@nvidia.com>; edk2- 
> devel@lists.01.org; Gao, Liming <liming.gao@intel.com>; Fu, Siyuan 
> <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>; Kinney, 
> Michael D <michael.d.kinney@intel.com>
> Subject: RE: [PATCH v3 0/2] Provide UEFILib functions for protocol 
> uninstallation.
> 
> Ashish,
> 
> Good point.  I was looking at the code size of a single uncompressed 
> UEFI Driver (DiskIoDxe).  I suspect that the patch provides a more 
> consistent pattern across all drivers that use these UefiLib APIs, and 
> then provides better compression on an FV that contains many UEFI 
> Drivers.
> 
> I also suspect there may be a small size increase for the single 
> compressed UEFI Driver use case for PCI Option ROMs.
> 
> I will run a few more experiments this morning.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Ashish Singhal [mailto:ashishsingha@nvidia.com]
> > Sent: Monday, January 7, 2019 2:51 PM
> > To: Kinney, Michael D <michael.d.kinney@intel.com>; 
> > edk2-devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu,
> > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Mike,
> >
> > I build both DEBUG and RELEASE variant of the library
> and they both
> > built a few KB less in size compared to what is in
> tip right now. Can
> > you please help me with the optimization settings you
> have enabled so
> > that I can try the same at my end? Also, if you want,
> we can look at
> > the optimization part going forward and fix the issue
> first by pushing
> > in PATCH v2 1/4 and PATCH v2 2/4 which just adds
> uninstallation APIs
> > keeping the same code structure as for install.
> >
> > Thanks
> > Ashish
> >
> > -----Original Message-----
> > From: Kinney, Michael D <michael.d.kinney@intel.com>
> > Sent: Monday, January 7, 2019 3:23 PM
> > To: Ashish Singhal <ashishsingha@nvidia.com>; edk2- 
> > devel@lists.01.org; Gao, Liming
> <liming.gao@intel.com>; Fu, Siyuan
> > <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>; Kinney,
> > Michael D <michael.d.kinney@intel.com>
> > Subject: RE: [PATCH v3 0/2] Provide UEFILib functions
> for protocol
> > uninstallation.
> >
> > Hi Ashish,
> >
> > My main concern with this patch is that the generated
> code for
> > optimized RELEASE builds is not as small.
> >
> > From a source maintenance perspective, the patch you
> have provided is
> > easier to maintain.  However, the implementation of
> the APIs that
> > install protocols was done to make sure the optimizer
> produces the
> > smallest number of instructions to install the
> protocols.
> >
> > I would prefer the APIs that install protocols remain
> unchanged, and
> > that only the new APIs to uninstall the protocols be
> added.  The same
> > approach could be taken in the implementation to
> produce the exact
> > right form of the uninstall action that is guaranteed
> to succeed if
> > the uninstall API matches the API that was used to
> install.
> >
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Ashish Singhal
> [mailto:ashishsingha@nvidia.com]
> > > Sent: Monday, January 7, 2019 6:02 AM
> > > To: edk2-devel@lists.01.org; Kinney, Michael D 
> > > <michael.d.kinney@intel.com>; Gao, Liming
> > <liming.gao@intel.com>; Fu,
> > > Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> > <jiaxin.wu@intel.com>
> > > Subject: RE: [PATCH v3 0/2] Provide UEFILib
> functions
> > for protocol
> > > uninstallation.
> > >
> > > + Maintainers
> > >
> > > -----Original Message-----
> > > From: Ashish Singhal <ashishsingha@nvidia.com>
> > > Sent: Sunday, January 6, 2019 9:38 PM
> > > To: edk2-devel@lists.01.org
> > > Cc: Ashish Singhal <ashishsingha@nvidia.com>
> > > Subject: [PATCH v3 0/2] Provide UEFILib functions
> for
> > protocol
> > > uninstallation.
> > >
> > > An issue was seen in IScsiDxe in NetworkPkg where
> > driver cleanup after
> > > initialization failure was not done right. Bug 1428
> > was filed in this
> > > regard.
> > > As per discussions with Mike, it was also discussed
> > that having
> > > UEFILib provide protocol uninstallation abstraction
> > would help to
> > > avoid these issues in the future. Bug 1429 was
> found
> > to track this.
> > > The first 2 patches take care of this.
> > >
> > > Patch number 1 also simplifies the UEFILib protocol
> > installation and
> > > uninstallation abstraction by adding a helper
> > function doing
> > > operations instead of every public function.
> > >
> > > Ashish Singhal (2):
> > >   MdePkg/UefiLib: Abstract driver model protocol
> > uninstallation
> > >   NetworkPkg/IScsiDxe: Use UEFILib APIs to
> uninstall
> > protocols.
> > >
> > >  MdePkg/Include/Library/UefiLib.h         |  103
> +++
> > >  MdePkg/Library/UefiLib/UefiDriverModel.c | 1186
> > > ++++++++----------------------
> > >  NetworkPkg/IScsiDxe/IScsiDriver.c        |   31 +-
> > >  3 files changed, 435 insertions(+), 885
> deletions(-)
> > >
> > > --
> > > 2.7.4
> > >
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------
> > > This email message is for the sole use of the
> > intended
> > > recipient(s) and may contain
> > > confidential information.  Any unauthorized review,
> > use, disclosure or
> > > distribution is prohibited.  If you are not the
> > intended recipient,
> > > please contact the sender by reply email and
> destroy
> > all copies of the
> > > original message.
> > > ---------------------------------------------------
> --
> > --
> > > ----------------------------


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2019-02-04 20:18 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-07  4:37 [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
2019-01-07  4:37 ` [PATCH v3 1/2] MdePkg/UefiLib: Abstract driver model " Ashish Singhal
2019-01-07  4:37 ` [PATCH v3 2/2] NetworkPkg/IScsiDxe: Use UEFILib APIs to uninstall protocols Ashish Singhal
2019-01-07 14:01 ` [PATCH v3 0/2] Provide UEFILib functions for protocol uninstallation Ashish Singhal
2019-01-07 22:22   ` Kinney, Michael D
2019-01-07 22:50     ` Ashish Singhal
2019-01-08 16:25       ` Kinney, Michael D
2019-01-08 17:24         ` Ashish Singhal
2019-01-09  2:57           ` Kinney, Michael D
2019-01-09  3:02             ` Ashish Singhal
2019-02-04 20:18               ` Ashish Singhal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox