]> git.proxmox.com Git - mirror_edk2.git/commitdiff
PrmPkg: Enable variable growth for the PRM_MODULE_EXPORT macro
authorMichael Kubacki <michael.kubacki@microsoft.com>
Thu, 23 Apr 2020 01:06:23 +0000 (18:06 -0700)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 5 Apr 2022 00:42:38 +0000 (00:42 +0000)
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>
PrmPkg/Include/PrmExportDescriptor.h
PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c

index 95198cef659c460b8951766a5e6040d372182c68..fc313fd1acc76c6c3289678499f82ea7a73c3f27 100644 (file)
@@ -31,11 +31,23 @@ typedef struct {
   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
@@ -73,8 +85,15 @@ typedef struct {
                                     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
index 85fffdcbd9f1ba9ce79b155c43340f56e58845b2..5fda4c1b01daf38f784fe5f8391e80b3bd580f31 100644 (file)
@@ -122,7 +122,7 @@ GetPrmModuleExportDescriptorTable (
         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
@@ -528,7 +528,7 @@ DiscoverPrmModules (
       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
@@ -684,16 +684,16 @@ ProcessPrmModules (
       _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
@@ -737,7 +737,7 @@ ProcessPrmModules (
     //\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