mirror of https://github.com/acidanthera/audk.git
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:
parent
e846797662
commit
a6f8946bc9
|
@ -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, \
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue