]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
Install LoadedImage protocol for PiSmmCore.
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / PiSmmCore.c
index cc7ccec248c0c321ca970b3cfb81dfcdf92da880..7245f201fbdf78ca965208c2563f67918bc69509 100644 (file)
@@ -87,6 +87,8 @@ SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = {
 UINTN                           mFullSmramRangeCount;\r
 EFI_SMRAM_DESCRIPTOR            *mFullSmramRanges;\r
 \r
+EFI_LOADED_IMAGE_PROTOCOL       *mSmmCoreLoadedImage;\r
+\r
 /**\r
   Place holder function until all the SMM System Table Service are available.\r
 \r
@@ -520,6 +522,51 @@ SmmEntryPoint (
   PERF_END (NULL, "SMM", NULL, 0) ;\r
 }\r
 \r
+/**\r
+  Install LoadedImage protocol for SMM Core.\r
+**/\r
+VOID\r
+SmmCoreInstallLoadedImage (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_HANDLE                 Handle;\r
+\r
+  //\r
+  // Allocate a Loaded Image Protocol in EfiBootServicesData\r
+  //\r
+  Status = gBS->AllocatePool (EfiBootServicesData, sizeof(EFI_LOADED_IMAGE_PROTOCOL), (VOID **)&mSmmCoreLoadedImage);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  ZeroMem (mSmmCoreLoadedImage, sizeof (EFI_LOADED_IMAGE_PROTOCOL));\r
+  //\r
+  // Fill in the remaining fields of the Loaded Image Protocol instance.\r
+  // Note: ImageBase is an SMRAM address that can not be accessed outside of SMRAM if SMRAM window is closed.\r
+  //\r
+  mSmmCoreLoadedImage->Revision      = EFI_LOADED_IMAGE_PROTOCOL_REVISION;\r
+  mSmmCoreLoadedImage->ParentHandle  = gSmmCorePrivate->SmmIplImageHandle;\r
+  mSmmCoreLoadedImage->SystemTable   = gST;\r
+\r
+  mSmmCoreLoadedImage->ImageBase     = (VOID *)(UINTN)gSmmCorePrivate->PiSmmCoreImageBase;\r
+  mSmmCoreLoadedImage->ImageSize     = gSmmCorePrivate->PiSmmCoreImageSize;\r
+  mSmmCoreLoadedImage->ImageCodeType = EfiRuntimeServicesCode;\r
+  mSmmCoreLoadedImage->ImageDataType = EfiRuntimeServicesData;\r
+\r
+  //\r
+  // Create a new image handle in the UEFI handle database for the SMM Driver\r
+  //\r
+  Handle = NULL;\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &Handle,\r
+                  &gEfiLoadedImageProtocolGuid, mSmmCoreLoadedImage,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return ;\r
+}\r
+\r
 /**\r
   The Entry Point for SMM Core\r
 \r
@@ -586,5 +633,7 @@ SmmMain (
 \r
   RegisterSmramProfileHandler ();\r
 \r
+  SmmCoreInstallLoadedImage ();\r
+\r
   return EFI_SUCCESS;\r
 }\r