PrmPkg: Enable variable growth for the PRM_MODULE_EXPORT macro

The PRM_MODULE_EXPORT parameterized macro allows a caller to produce
a static PRM module export descriptor structure in the binary by
simply passing PRM_HANDLER_EXPORT_ENTRY arguments with each argument
representing a PRM handler to be exported by the module.

Previously, the PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT used in the
PRM_MODULE_EXPORT macro was fixed to a maximum of three handlers.

This change removes that restriction and allows the structure to
grow based on the number of PRM handlers given to the macro. This
means a local type will be customized per PRM module. The reference
type PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT keeps a field at the end
that allows array access to PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT
members.

Cc: Andrew Fish <afish@apple.com>
Cc: Kang Gao <kang.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Benjamin You <benjamin.you@intel.com>
Cc: Liu Yun <yun.y.liu@intel.com>
Cc: Ankit Sinha <ankit.sinha@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
Acked-by: Leif Lindholm <quic_llindhol@quicinc.com>
Reviewed-by: Ankit Sinha <ankit.sinha@intel.com>
This commit is contained in:
Michael Kubacki 2020-04-22 18:06:23 -07:00 committed by mergify[bot]
parent e846797662
commit a6f8946bc9
2 changed files with 29 additions and 10 deletions

View File

@ -31,11 +31,23 @@ typedef struct {
UINT16 Revision; UINT16 Revision;
UINT16 NumberPrmHandlers; UINT16 NumberPrmHandlers;
GUID ModuleGuid; GUID ModuleGuid;
PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[3]; } PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER;
typedef struct {
PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header;
PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[1];
} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT; } PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT;
#pragma pack(pop) #pragma pack(pop)
#if defined(_MSC_VER)
#define PRM_PACKED_STRUCT(definition) \
__pragma(pack(push, 1)) typedef struct definition __pragma(pack(pop))
#elif defined (__GNUC__) || defined (__clang__)
#define PRM_PACKED_STRUCT(definition) \
typedef struct __attribute__((packed)) definition
#endif
/** /**
A macro that declares a PRM Handler Export Descriptor for a PRM Handler. A macro that declares a PRM Handler Export Descriptor for a PRM Handler.
@ -74,7 +86,14 @@ typedef struct {
**/ **/
#define PRM_MODULE_EXPORT(...) \ #define PRM_MODULE_EXPORT(...) \
PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \ PRM_PACKED_STRUCT( \
{ \
PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header; \
PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[VA_ARG_COUNT(__VA_ARGS__)]; \
} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ \
); \
\
PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \
{ \ { \
PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE, \ PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE, \
PRM_MODULE_EXPORT_REVISION, \ PRM_MODULE_EXPORT_REVISION, \

View File

@ -122,7 +122,7 @@ GetPrmModuleExportDescriptorTable (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
TempExportDescriptor = (PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *) ((UINTN) CurrentImageAddress + ExportAddressTable[PrmModuleExportDescriptorOrdinal]); TempExportDescriptor = (PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *) ((UINTN) CurrentImageAddress + ExportAddressTable[PrmModuleExportDescriptorOrdinal]);
if (TempExportDescriptor->Signature == PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE) { if (TempExportDescriptor->Header.Signature == PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE) {
*ExportDescriptor = TempExportDescriptor; *ExportDescriptor = TempExportDescriptor;
DEBUG ((DEBUG_INFO, " %a %a: PRM Module Export Descriptor found at 0x%x.\n", _DBGMSGID_, __FUNCTION__, (UINTN) ExportDescriptor)); DEBUG ((DEBUG_INFO, " %a %a: PRM Module Export Descriptor found at 0x%x.\n", _DBGMSGID_, __FUNCTION__, (UINTN) ExportDescriptor));
} else { } else {
@ -528,7 +528,7 @@ DiscoverPrmModules (
sizeof (*(PrmModuleImageContextListEntry->Context)) sizeof (*(PrmModuleImageContextListEntry->Context))
); );
InsertTailList (&mPrmModuleList, &PrmModuleImageContextListEntry->Link); InsertTailList (&mPrmModuleList, &PrmModuleImageContextListEntry->Link);
mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->NumberPrmHandlers; mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->Header.NumberPrmHandlers;
mPrmModuleCount++; // Todo: Match with global variable refactor change in the future mPrmModuleCount++; // Todo: Match with global variable refactor change in the future
DEBUG ((DEBUG_INFO, "%a %a: New PRM Module inserted into list to be processed.\n", _DBGMSGID_, __FUNCTION__)); DEBUG ((DEBUG_INFO, "%a %a: New PRM Module inserted into list to be processed.\n", _DBGMSGID_, __FUNCTION__));
} }
@ -684,16 +684,16 @@ ProcessPrmModules (
_DBGMSGID_, _DBGMSGID_,
__FUNCTION__, __FUNCTION__,
(CHAR8 *) ((UINTN) CurrentImageAddress + CurrentImageExportDirectory->Name), (CHAR8 *) ((UINTN) CurrentImageAddress + CurrentImageExportDirectory->Name),
CurrentExportDescriptorStruct->NumberPrmHandlers CurrentExportDescriptorStruct->Header.NumberPrmHandlers
)); ));
CurrentModuleInfoStruct->StructureRevision = PRM_MODULE_INFORMATION_STRUCT_REVISION; CurrentModuleInfoStruct->StructureRevision = PRM_MODULE_INFORMATION_STRUCT_REVISION;
CurrentModuleInfoStruct->StructureLength = ( CurrentModuleInfoStruct->StructureLength = (
OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure) + OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure) +
(CurrentExportDescriptorStruct->NumberPrmHandlers * sizeof (PRM_HANDLER_INFORMATION_STRUCT)) (CurrentExportDescriptorStruct->Header.NumberPrmHandlers * sizeof (PRM_HANDLER_INFORMATION_STRUCT))
); );
CopyGuid (&CurrentModuleInfoStruct->Identifier, &CurrentExportDescriptorStruct->ModuleGuid); CopyGuid (&CurrentModuleInfoStruct->Identifier, &CurrentExportDescriptorStruct->Header.ModuleGuid);
CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->NumberPrmHandlers; CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->Header.NumberPrmHandlers;
CurrentModuleInfoStruct->HandlerInfoOffset = OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure); CurrentModuleInfoStruct->HandlerInfoOffset = OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure);
CurrentModuleInfoStruct->MajorRevision = 0; CurrentModuleInfoStruct->MajorRevision = 0;
@ -737,7 +737,7 @@ ProcessPrmModules (
// //
// Iterate across all PRM handlers in the PRM Module // Iterate across all PRM handlers in the PRM Module
// //
for (HandlerIndex = 0; HandlerIndex < CurrentExportDescriptorStruct->NumberPrmHandlers; HandlerIndex++) { for (HandlerIndex = 0; HandlerIndex < CurrentExportDescriptorStruct->Header.NumberPrmHandlers; HandlerIndex++) {
CurrentHandlerInfoStruct = &(CurrentModuleInfoStruct->HandlerInfoStructure[HandlerIndex]); CurrentHandlerInfoStruct = &(CurrentModuleInfoStruct->HandlerInfoStructure[HandlerIndex]);
CurrentHandlerInfoStruct->StructureRevision = PRM_HANDLER_INFORMATION_STRUCT_REVISION; CurrentHandlerInfoStruct->StructureRevision = PRM_HANDLER_INFORMATION_STRUCT_REVISION;