]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/UefiBootManager: Add EfiBootManagerDispatchDeferredImages
authorRuiyu Ni <ruiyu.ni@intel.com>
Mon, 31 Oct 2016 08:34:41 +0000 (16:34 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Thu, 10 Nov 2016 07:55:37 +0000 (15:55 +0800)
The API dispatches the deferred images that are returned from all
DeferredImageLoad instances.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Chao B Zhang <chao.b.zhang@intel.com>
Reviewed-by: Sunny Wang <sunnywang@hpe.com>
MdeModulePkg/Include/Library/UefiBootManagerLib.h
MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c
MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf

index e333ffd86bcef712a797013a782a73bac7247361..97ac1f233ce9489e7995931264f24f081ba64152 100644 (file)
@@ -777,4 +777,17 @@ EfiBootManagerIsValidLoadOptionVariableName (
   OUT UINT16                            *OptionNumber OPTIONAL\r
   );\r
 \r
+\r
+/**\r
+  Dispatch the deferred images that are returned from all DeferredImageLoad instances.\r
+\r
+  @retval EFI_SUCCESS       At least one deferred image is loaded successfully and started.\r
+  @retval EFI_NOT_FOUND     There is no deferred image.\r
+  @retval EFI_ACCESS_DENIED There are deferred images but all of them are failed to load.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiBootManagerDispatchDeferredImages (\r
+  VOID\r
+  );\r
 #endif\r
index 2a60f0643e44078f28f01a52bdd9870fb186fa11..09e421135205d2fcc166840243e4a314e18a67e6 100644 (file)
@@ -417,3 +417,116 @@ BmCharToUint (
   return (UINTN) -1;\r
 }\r
 \r
+/**\r
+  Dispatch the deferred images that are returned from all DeferredImageLoad instances.\r
+\r
+  @retval EFI_SUCCESS       At least one deferred image is loaded successfully and started.\r
+  @retval EFI_NOT_FOUND     There is no deferred image.\r
+  @retval EFI_ACCESS_DENIED There are deferred images but all of them are failed to load.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiBootManagerDispatchDeferredImages (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EFI_DEFERRED_IMAGE_LOAD_PROTOCOL   *DeferredImage;\r
+  UINTN                              HandleCount;\r
+  EFI_HANDLE                         *Handles;\r
+  UINTN                              Index;\r
+  UINTN                              ImageIndex;\r
+  EFI_DEVICE_PATH_PROTOCOL           *ImageDevicePath;\r
+  VOID                               *Image;\r
+  UINTN                              ImageSize;\r
+  BOOLEAN                            BootOption;\r
+  EFI_HANDLE                         ImageHandle;\r
+  UINTN                              ExitDataSize;\r
+  CHAR16                             *ExitData;\r
+  UINTN                              ImageCount;\r
+  UINTN                              LoadCount;\r
+\r
+  //\r
+  // Find all the deferred image load protocols.\r
+  //\r
+  HandleCount = 0;\r
+  Handles = NULL;\r
+  Status = gBS->LocateHandleBuffer (\r
+    ByProtocol,\r
+    &gEfiDeferredImageLoadProtocolGuid,\r
+    NULL,\r
+    &HandleCount,\r
+    &Handles\r
+  );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  ImageCount = 0;\r
+  LoadCount  = 0;\r
+  for (Index = 0; Index < HandleCount; Index++) {\r
+    Status = gBS->HandleProtocol (Handles[Index], &gEfiDeferredImageLoadProtocolGuid, (VOID **) &DeferredImage);\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+\r
+    for (ImageIndex = 0; ;ImageIndex++) {\r
+      //\r
+      // Load all the deferred images in this protocol instance.\r
+      //\r
+      Status = DeferredImage->GetImageInfo (\r
+                                DeferredImage,\r
+                                ImageIndex,\r
+                                &ImageDevicePath,\r
+                                (VOID **) &Image,\r
+                                &ImageSize,\r
+                                &BootOption\r
+                                );\r
+      if (EFI_ERROR (Status)) {\r
+        break;\r
+      }\r
+      ImageCount++;\r
+      //\r
+      // Load and start the image.\r
+      //\r
+      Status = gBS->LoadImage (\r
+        BootOption,\r
+        gImageHandle,\r
+        ImageDevicePath,\r
+        NULL,\r
+        0,\r
+        &ImageHandle\r
+      );\r
+      if (!EFI_ERROR (Status)) {\r
+        LoadCount++;\r
+        //\r
+        // Before calling the image, enable the Watchdog Timer for\r
+        // a 5 Minute period\r
+        //\r
+        gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);\r
+        Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);\r
+        if (ExitData != NULL) {\r
+          FreePool (ExitData);\r
+        }\r
+\r
+        //\r
+        // Clear the Watchdog Timer after the image returns.\r
+        //\r
+        gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
+      }\r
+    }\r
+  }\r
+  if (Handles != NULL) {\r
+    FreePool (Handles);\r
+  }\r
+\r
+  if (ImageCount == 0) {\r
+    return EFI_NOT_FOUND;\r
+  } else {\r
+    if (LoadCount == 0) {\r
+      return EFI_ACCESS_DENIED;\r
+    } else {\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+}\r
index cb719e9d580a7f7003908284fab12fa2b2540dbc..444d4a5c07f70d477fe685ef92113fb6a5770cbc 100644 (file)
@@ -44,6 +44,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/FormBrowser2.h>\r
 #include <Protocol/VariableLock.h>\r
 #include <Protocol/RamDisk.h>\r
+#include <Protocol/DeferredImageLoad.h>\r
 \r
 #include <Guid/MemoryTypeInformation.h>\r
 #include <Guid/FileInfo.h>\r
index 8c3fd7f3766e94691a4d0da195d940751dfd4fc2..bb7c00d4bb2b90276efa33cbac8ce4b4923b3d19 100644 (file)
   gEfiDriverHealthProtocolGuid                  ## SOMETIMES_CONSUMES\r
   gEfiFormBrowser2ProtocolGuid                  ## SOMETIMES_CONSUMES\r
   gEfiRamDiskProtocolGuid                       ## SOMETIMES_CONSUMES\r
+  gEfiDeferredImageLoadProtocolGuid             ## CONSUMES\r
 \r
 [Pcd]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange      ## SOMETIMES_CONSUMES\r