]> xenbits.xensource.com Git - people/aperard/ovmf.git/commitdiff
UefiPayloadPkg: Make UPL build script arch agnostic
authorDhaval <dhaval@rivosinc.com>
Thu, 22 Feb 2024 09:13:05 +0000 (14:43 +0530)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 23 Feb 2024 12:44:58 +0000 (12:44 +0000)
Current implementation makes assumptions about arch it will be built
for. Need to make it more generic to add follow up support for RISCV.
Right now it does not build for RV until relevant dsc file is available.

Cc: Guo Dong <guo.dong@intel.com>
Cc: Sean Rhodes <sean@starlabs.systems>
Cc: James Lu <james.lu@intel.com>
Reviewed-by: Gua Guo <gua.guo@intel.com>
Signed-off-by: Dhaval Sharma <dhaval@rivosinc.com>
UefiPayloadPkg/Tools/MkFitImage.py
UefiPayloadPkg/UefiPayloadPkg.ci.yaml
UefiPayloadPkg/UefiPayloadPkg.dsc
UefiPayloadPkg/UniversalPayloadBuild.py

index 41a259960b2bfdbf7cd0ec4b5384014f60ea5218..b76c2156dd188b0440a56e30aae194b84e3933ce 100644 (file)
@@ -59,16 +59,16 @@ def BuildConfNode(Fdt, ParentNode, MultiImage):
     libfdt.fdt_setprop(Fdt, ConfNode1, 'require-fit', b'', 0)\r
     libfdt.fdt_setprop(Fdt, ConfNode1, 'firmware', bytes('tianocore', 'utf-8'), len('tianocore') + 1)\r
 \r
-def BuildFvImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Description):\r
+def BuildFvImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Description, Arch):\r
     libfdt.fdt_setprop_u32(Fdt, ParentNode, 'data-size', DataSize)\r
     libfdt.fdt_setprop_u32(Fdt, ParentNode, 'data-offset', DataOffset)\r
     libfdt.fdt_setprop(Fdt, ParentNode, 'compression', bytes('none',                'utf-8'), len('none') + 1)\r
     libfdt.fdt_setprop(Fdt, ParentNode, 'project ',    bytes('tianocore',           'utf-8'), len('tianocore') + 1)\r
-    libfdt.fdt_setprop(Fdt, ParentNode, 'arch',        bytes('x86_64',              'utf-8'), len('x86_64') + 1)\r
+    libfdt.fdt_setprop(Fdt, ParentNode, 'arch',        bytes(Arch,                  'utf-8'), len(Arch) + 1)\r
     libfdt.fdt_setprop(Fdt, ParentNode, 'type',        bytes('flat-binary',         'utf-8'), len('flat-binary') + 1)\r
     libfdt.fdt_setprop(Fdt, ParentNode, 'description', bytes(Description,           'utf-8'), len(Description) + 1)\r
 \r
-def BuildTianoImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Description):\r
+def BuildTianoImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Description, Arch):\r
     #\r
     # Set 'load' and 'data-offset' to reserve the memory first.\r
     # They would be set again when Fdt completes or this function parses target binary file.\r
@@ -100,7 +100,7 @@ def BuildTianoImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Descr
 #\r
 # The subnode would be inserted from bottom to top of structure block.\r
 #\r
-def BuildFitImage(Fdt, InfoHeader):\r
+def BuildFitImage(Fdt, InfoHeader, Arch):\r
     MultiImage = [\r
         ["tianocore",   InfoHeader.Binary,        BuildTianoImageNode , InfoHeader.Description,     None, 0 ],\r
         ["uefi-fv",     InfoHeader.UefifvPath,    BuildFvImageNode,     "UEFI Firmware Volume",     None, 0 ],\r
@@ -143,7 +143,7 @@ def BuildFitImage(Fdt, InfoHeader):
         if os.path.exists (Item[1]) == False:\r
             continue\r
         FvNode = libfdt.fdt_add_subnode(Fdt, ImageNode, Name)\r
-        BuildFvNode (Fdt, InfoHeader, FvNode, DataOffset, len(BinaryData), Description)\r
+        BuildFvNode (Fdt, InfoHeader, FvNode, DataOffset, len(BinaryData), Description, Arch)\r
 \r
     #\r
     # Create new image file and combine all binary.\r
@@ -160,7 +160,7 @@ def BuildFitImage(Fdt, InfoHeader):
 \r
     return True\r
 \r
-def MakeFitImage(InfoHeader):\r
+def MakeFitImage(InfoHeader, Arch):\r
     #\r
     # Allocate fdt byte array.\r
     #\r
@@ -175,9 +175,9 @@ def MakeFitImage(InfoHeader):
     #\r
     # Parse args to build fit image.\r
     #\r
-    return BuildFitImage(Fdt, InfoHeader)\r
+    return BuildFitImage(Fdt, InfoHeader, Arch)\r
 \r
-def ReplaceFv (UplBinary, SectionFvFile, SectionName):\r
+def ReplaceFv (UplBinary, SectionFvFile, SectionName, Arch):\r
     try:\r
         #\r
         # Get Original Multi Fv\r
@@ -231,7 +231,7 @@ def ReplaceFv (UplBinary, SectionFvFile, SectionName):
                 SectionFvFileBinary = File.read ()\r
             MultiFvList.append ([SectionName, SectionFvFileBinary])\r
             FvNode = libfdt.fdt_add_subnode(NewFitHeader, ImagesNode, SectionName)\r
-            BuildFvImageNode (NewFitHeader, None, FvNode, FitSize, len(SectionFvFileBinary), SectionName + " Firmware Volume")\r
+            BuildFvImageNode (NewFitHeader, None, FvNode, FitSize, len(SectionFvFileBinary), SectionName + " Firmware Volume", Arch)\r
             FitSize += len(SectionFvFileBinary)\r
         else:\r
             for Index in range (0, len (MultiFvList)):\r
index 278f271c3671037a7c2e5b4d52a4bc91a45ce0a4..0ceff5b2a54e7e51689d7bc3b5acf1d588ac8e8a 100644 (file)
@@ -92,5 +92,6 @@
         "BLD_*_EMU_VARIABLE_ENABLE": "FALSE",\r
         "BLD_*_DISABLE_RESET_SYSTEM": "TRUE",\r
         "BLD_*_SERIAL_DRIVER_ENABLE": "FALSE",\r
+        "BLD_*_BUILD_ARCH": "",\r
     }\r
 }\r
index 0e142bb7c2a2784bb3f45865c5fbc7f50e97abd0..95417cec6aff0dd99001f75a15b3db95ca5602eb 100644 (file)
@@ -22,7 +22,7 @@
   SUPPORTED_ARCHITECTURES             = IA32|X64\r
   BUILD_TARGETS                       = DEBUG|RELEASE|NOOPT\r
   SKUID_IDENTIFIER                    = DEFAULT\r
-  OUTPUT_DIRECTORY                    = Build/UefiPayloadPkgX64\r
+  OUTPUT_DIRECTORY                    = Build/UefiPayloadPkg$(BUILD_ARCH)\r
   FLASH_DEFINITION                    = UefiPayloadPkg/UefiPayloadPkg.fdf\r
   PCD_DYNAMIC_AS_DYNAMICEX            = TRUE\r
 \r
index 046c62e21ce41197f6edf7433ab4ebe7f7ce53c1..49de8827988b4533af6e92cc441520841a471640 100644 (file)
@@ -125,18 +125,20 @@ def BuildUniversalPayload(Args):
         Args.Macro.append("UNIVERSAL_PAYLOAD_FORMAT=ELF")\r
         UpldEntryFile = "UniversalPayloadEntry"\r
 \r
-    BuildDir     = os.path.join(os.environ['WORKSPACE'], os.path.normpath("Build/UefiPayloadPkgX64"))\r
+    BuildDir     = os.path.join(os.environ['WORKSPACE'], os.path.normpath("Build/UefiPayloadPkg{}").format (Args.Arch))\r
     if Args.Arch == 'X64':\r
         BuildArch      = "X64"\r
         FitArch        = "x86_64"\r
-        ObjCopyFlag    = "elf64-x86-64"\r
-        EntryOutputDir = os.path.join(BuildDir, "{}_{}".format (BuildTarget, PayloadEntryToolChain), os.path.normpath("X64/UefiPayloadPkg/UefiPayloadEntry/{}/DEBUG/{}.dll".format (UpldEntryFile, UpldEntryFile)))\r
-    else:\r
+    elif Args.Arch == 'IA32':\r
         BuildArch      = "IA32 -a X64"\r
         FitArch        = "x86"\r
-        ObjCopyFlag    = "elf32-i386"\r
-        EntryOutputDir = os.path.join(BuildDir, "{}_{}".format (BuildTarget, PayloadEntryToolChain), os.path.normpath("IA32/UefiPayloadPkg/UefiPayloadEntry/{}/DEBUG/{}.dll".format (UpldEntryFile, UpldEntryFile)))\r
+    elif Args.Arch == 'RISCV64':\r
+        BuildArch      = "RISCV64"\r
+        FitArch        = "RISCV64"\r
+    else:\r
+        print("Incorrect arch option provided")\r
 \r
+    EntryOutputDir = os.path.join(BuildDir, "{}_{}".format (BuildTarget, PayloadEntryToolChain), os.path.normpath("{}/UefiPayloadPkg/UefiPayloadEntry/{}/DEBUG/{}.dll".format (Args.Arch, UpldEntryFile, UpldEntryFile)))\r
     EntryModuleInf = os.path.normpath("UefiPayloadPkg/UefiPayloadEntry/{}.inf".format (UpldEntryFile))\r
     DscPath = os.path.normpath("UefiPayloadPkg/UefiPayloadPkg.dsc")\r
     DxeFvOutputDir = os.path.join(BuildDir, "{}_{}".format (BuildTarget, ToolChain), os.path.normpath("FV/DXEFV.Fv"))\r
@@ -152,6 +154,7 @@ def BuildUniversalPayload(Args):
             Pcds += " --pcd {}".format (PcdItem)\r
 \r
     Defines = ""\r
+    Defines += " -D BUILD_ARCH={}".format(Args.Arch)\r
     if (Args.Macro != None):\r
         for MacroItem in Args.Macro:\r
             Defines += " -D {}".format (MacroItem)\r
@@ -160,7 +163,7 @@ def BuildUniversalPayload(Args):
     # Building DXE core and DXE drivers as DXEFV.\r
     #\r
     if Args.BuildEntryOnly == False:\r
-        BuildPayload = "build -p {} -b {} -a X64 -t {} -y {} {}".format (DscPath, BuildTarget, ToolChain, PayloadReportPath, Quiet)\r
+        BuildPayload = "build -p {} -b {} -a {} -t {} -y {} {}".format (DscPath, BuildTarget, BuildArch, ToolChain, PayloadReportPath, Quiet)\r
         BuildPayload += Pcds\r
         BuildPayload += Defines\r
         RunCommand(BuildPayload)\r
@@ -292,7 +295,7 @@ def BuildUniversalPayload(Args):
         fit_image_info_header.DataSize   = TianoEntryBinarySize\r
         fit_image_info_header.Binary     = TargetRebaseEntryFile\r
 \r
-        if MkFitImage.MakeFitImage(fit_image_info_header) is True:\r
+        if MkFitImage.MakeFitImage(fit_image_info_header, Args.Arch) is True:\r
             print('\nSuccessfully build Fit Image')\r
         else:\r
             sys.exit(1)\r
@@ -304,7 +307,7 @@ def main():
     parser = argparse.ArgumentParser(description='For building Universal Payload')\r
     parser.add_argument('-t', '--ToolChain')\r
     parser.add_argument('-b', '--Target', default='DEBUG')\r
-    parser.add_argument('-a', '--Arch', choices=['IA32', 'X64'], help='Specify the ARCH for payload entry module. Default build X64 image.', default ='X64')\r
+    parser.add_argument('-a', '--Arch', choices=['IA32', 'X64', 'RISCV64'], help='Specify the ARCH for payload entry module. Default build X64 image.', default ='X64')\r
     parser.add_argument("-D", "--Macro", action="append", default=["UNIVERSAL_PAYLOAD=TRUE"])\r
     parser.add_argument('-i', '--ImageId', type=str, help='Specify payload ID (16 bytes maximal).', default ='UEFI')\r
     parser.add_argument('-q', '--Quiet', action='store_true', help='Disable all build messages except FATAL ERRORS.')\r
@@ -331,14 +334,14 @@ def main():
         for (SectionName, SectionFvFile) in args.AddFv:\r
             MultiFvList.append ([SectionName, SectionFvFile])\r
 \r
-    def ReplaceFv (UplBinary, SectionFvFile, SectionName):\r
+    def ReplaceFv (UplBinary, SectionFvFile, SectionName, Arch):\r
         print (bcolors.OKGREEN + "Patch {}={} into {}".format (SectionName, SectionFvFile, UplBinary) + bcolors.ENDC)\r
         if (args.Fit == False):\r
             import Tools.ElfFv as ElfFv\r
             return ElfFv.ReplaceFv (UplBinary, SectionFvFile, '.upld.{}'.format (SectionName))\r
         else:\r
             import Tools.MkFitImage as MkFitImage\r
-            return MkFitImage.ReplaceFv (UplBinary, SectionFvFile, SectionName)\r
+            return MkFitImage.ReplaceFv (UplBinary, SectionFvFile, SectionName, Arch)\r
 \r
     if (UniversalPayloadBinary != None):\r
         for (SectionName, SectionFvFile) in MultiFvList:\r
@@ -347,7 +350,7 @@ def main():
             if (args.Fit == False):\r
                 status = ReplaceFv (UniversalPayloadBinary, SectionFvFile, SectionName)\r
             else:\r
-                status = ReplaceFv (UniversalPayloadBinary, SectionFvFile, SectionName.replace ("_", "-"))\r
+                status = ReplaceFv (UniversalPayloadBinary, SectionFvFile, SectionName.replace ("_", "-"), args.Arch)\r
             if status != 0:\r
                 print (bcolors.FAIL + "[Fail] Patch {}={}".format (SectionName, SectionFvFile) + bcolors.ENDC)\r
                 return status\r