//\r
EFI_FV_FILETYPE mSmmFileTypes[] = {\r
EFI_FV_FILETYPE_SMM,\r
- EFI_FV_FILETYPE_COMBINED_SMM_DXE\r
+ EFI_FV_FILETYPE_COMBINED_SMM_DXE,\r
+ EFI_FV_FILETYPE_SMM_CORE,\r
//\r
// Note: DXE core will process the FV image file, so skip it in SMM core\r
// EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\r
//\r
// Discover Drivers in FV and add them to the Discovered Driver List.\r
// Process EFI_FV_FILETYPE_SMM type and then EFI_FV_FILETYPE_COMBINED_SMM_DXE\r
+ // EFI_FV_FILETYPE_SMM_CORE is processed to produce a Loaded Image protocol for the core\r
//\r
for (SmmTypeIndex = 0; SmmTypeIndex < sizeof (mSmmFileTypes)/sizeof (EFI_FV_FILETYPE); SmmTypeIndex++) {\r
//\r
&Size\r
);\r
if (!EFI_ERROR (GetNextFileStatus)) {\r
- SmmAddToDriverList (Fv, FvHandle, &NameGuid);\r
+ if (Type == EFI_FV_FILETYPE_SMM_CORE) {\r
+ //\r
+ // If this is the SMM core fill in it's DevicePath & DeviceHandle\r
+ //\r
+ if (mSmmCoreLoadedImage->FilePath == NULL) {\r
+ //\r
+ // Maybe one special FV contains only one SMM_CORE module, so its device path must\r
+ // be initialized completely.\r
+ //\r
+ EfiInitializeFwVolDevicepathNode (&mFvDevicePath.File, &NameGuid);\r
+ SetDevicePathEndNode (&mFvDevicePath.End);\r
+\r
+ //\r
+ // Make an EfiBootServicesData buffer copy of FilePath\r
+ //\r
+ Status = gBS->AllocatePool (\r
+ EfiBootServicesData,\r
+ GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *)&mFvDevicePath),\r
+ (VOID **)&mSmmCoreLoadedImage->FilePath\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ CopyMem (mSmmCoreLoadedImage->FilePath, &mFvDevicePath, GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *)&mFvDevicePath));\r
+\r
+ mSmmCoreLoadedImage->DeviceHandle = FvHandle;\r
+ }\r
+ } else {\r
+ SmmAddToDriverList (Fv, FvHandle, &NameGuid);\r
+ }\r
}\r
} while (!EFI_ERROR (GetNextFileStatus));\r
}\r
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
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
\r
RegisterSmramProfileHandler ();\r
\r
+ SmmCoreInstallLoadedImage ();\r
+\r
return EFI_SUCCESS;\r
}\r