UINT16 Revision;\r
UINT16 NumberPrmHandlers;\r
GUID ModuleGuid;\r
- PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[3];\r
+} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER;\r
+\r
+typedef struct {\r
+ PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header;\r
+ PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[1];\r
} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT;\r
\r
#pragma pack(pop)\r
\r
+#if defined(_MSC_VER)\r
+ #define PRM_PACKED_STRUCT(definition) \\r
+ __pragma(pack(push, 1)) typedef struct definition __pragma(pack(pop))\r
+#elif defined (__GNUC__) || defined (__clang__)\r
+ #define PRM_PACKED_STRUCT(definition) \\r
+ typedef struct __attribute__((packed)) definition\r
+#endif\r
+\r
/**\r
A macro that declares a PRM Handler Export Descriptor for a PRM Handler.\r
\r
this module.\r
\r
**/\r
-#define PRM_MODULE_EXPORT(...) \\r
- PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \\r
+#define PRM_MODULE_EXPORT(...) \\r
+ PRM_PACKED_STRUCT( \\r
+ { \\r
+ PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header; \\r
+ PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[VA_ARG_COUNT(__VA_ARGS__)]; \\r
+ } PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ \\r
+ ); \\r
+ \\r
+ PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \\r
{ \\r
PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE, \\r
PRM_MODULE_EXPORT_REVISION, \\r
return EFI_NOT_FOUND;\r
}\r
TempExportDescriptor = (PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *) ((UINTN) CurrentImageAddress + ExportAddressTable[PrmModuleExportDescriptorOrdinal]);\r
- if (TempExportDescriptor->Signature == PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE) {\r
+ if (TempExportDescriptor->Header.Signature == PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE) {\r
*ExportDescriptor = TempExportDescriptor;\r
DEBUG ((DEBUG_INFO, " %a %a: PRM Module Export Descriptor found at 0x%x.\n", _DBGMSGID_, __FUNCTION__, (UINTN) ExportDescriptor));\r
} else {\r
sizeof (*(PrmModuleImageContextListEntry->Context))\r
);\r
InsertTailList (&mPrmModuleList, &PrmModuleImageContextListEntry->Link);\r
- mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->NumberPrmHandlers;\r
+ mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->Header.NumberPrmHandlers;\r
mPrmModuleCount++; // Todo: Match with global variable refactor change in the future\r
DEBUG ((DEBUG_INFO, "%a %a: New PRM Module inserted into list to be processed.\n", _DBGMSGID_, __FUNCTION__));\r
}\r
_DBGMSGID_,\r
__FUNCTION__,\r
(CHAR8 *) ((UINTN) CurrentImageAddress + CurrentImageExportDirectory->Name),\r
- CurrentExportDescriptorStruct->NumberPrmHandlers\r
+ CurrentExportDescriptorStruct->Header.NumberPrmHandlers\r
));\r
\r
CurrentModuleInfoStruct->StructureRevision = PRM_MODULE_INFORMATION_STRUCT_REVISION;\r
CurrentModuleInfoStruct->StructureLength = (\r
OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure) +\r
- (CurrentExportDescriptorStruct->NumberPrmHandlers * sizeof (PRM_HANDLER_INFORMATION_STRUCT))\r
+ (CurrentExportDescriptorStruct->Header.NumberPrmHandlers * sizeof (PRM_HANDLER_INFORMATION_STRUCT))\r
);\r
- CopyGuid (&CurrentModuleInfoStruct->Identifier, &CurrentExportDescriptorStruct->ModuleGuid);\r
- CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->NumberPrmHandlers;\r
+ CopyGuid (&CurrentModuleInfoStruct->Identifier, &CurrentExportDescriptorStruct->Header.ModuleGuid);\r
+ CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->Header.NumberPrmHandlers;\r
CurrentModuleInfoStruct->HandlerInfoOffset = OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure);\r
\r
CurrentModuleInfoStruct->MajorRevision = 0;\r
//\r
// Iterate across all PRM handlers in the PRM Module\r
//\r
- for (HandlerIndex = 0; HandlerIndex < CurrentExportDescriptorStruct->NumberPrmHandlers; HandlerIndex++) {\r
+ for (HandlerIndex = 0; HandlerIndex < CurrentExportDescriptorStruct->Header.NumberPrmHandlers; HandlerIndex++) {\r
CurrentHandlerInfoStruct = &(CurrentModuleInfoStruct->HandlerInfoStructure[HandlerIndex]);\r
\r
CurrentHandlerInfoStruct->StructureRevision = PRM_HANDLER_INFORMATION_STRUCT_REVISION;\r