diff --git a/PrmPkg/Include/PrmExportDescriptor.h b/PrmPkg/Include/PrmExportDescriptor.h index 95198cef65..fc313fd1ac 100644 --- a/PrmPkg/Include/PrmExportDescriptor.h +++ b/PrmPkg/Include/PrmExportDescriptor.h @@ -31,11 +31,23 @@ typedef struct { UINT16 Revision; UINT16 NumberPrmHandlers; 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; #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. @@ -73,8 +85,15 @@ typedef struct { this module. **/ -#define PRM_MODULE_EXPORT(...) \ - PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \ +#define PRM_MODULE_EXPORT(...) \ + 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_REVISION, \ diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c index 85fffdcbd9..5fda4c1b01 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -122,7 +122,7 @@ GetPrmModuleExportDescriptorTable ( return EFI_NOT_FOUND; } 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; DEBUG ((DEBUG_INFO, " %a %a: PRM Module Export Descriptor found at 0x%x.\n", _DBGMSGID_, __FUNCTION__, (UINTN) ExportDescriptor)); } else { @@ -528,7 +528,7 @@ DiscoverPrmModules ( sizeof (*(PrmModuleImageContextListEntry->Context)) ); InsertTailList (&mPrmModuleList, &PrmModuleImageContextListEntry->Link); - mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->NumberPrmHandlers; + mPrmHandlerCount += TempPrmModuleImageContext.ExportDescriptor->Header.NumberPrmHandlers; 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__)); } @@ -684,16 +684,16 @@ ProcessPrmModules ( _DBGMSGID_, __FUNCTION__, (CHAR8 *) ((UINTN) CurrentImageAddress + CurrentImageExportDirectory->Name), - CurrentExportDescriptorStruct->NumberPrmHandlers + CurrentExportDescriptorStruct->Header.NumberPrmHandlers )); CurrentModuleInfoStruct->StructureRevision = PRM_MODULE_INFORMATION_STRUCT_REVISION; CurrentModuleInfoStruct->StructureLength = ( 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); - CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->NumberPrmHandlers; + CopyGuid (&CurrentModuleInfoStruct->Identifier, &CurrentExportDescriptorStruct->Header.ModuleGuid); + CurrentModuleInfoStruct->HandlerCount = (UINT32) CurrentExportDescriptorStruct->Header.NumberPrmHandlers; CurrentModuleInfoStruct->HandlerInfoOffset = OFFSET_OF (PRM_MODULE_INFORMATION_STRUCT, HandlerInfoStructure); CurrentModuleInfoStruct->MajorRevision = 0; @@ -737,7 +737,7 @@ ProcessPrmModules ( // // 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->StructureRevision = PRM_HANDLER_INFORMATION_STRUCT_REVISION;