]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/Tools/SplitFspBin.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / Tools / SplitFspBin.py
index b326241fa9daf080ecd7900d22198a277a1ca680..419e5ba9850ef42057c43dfa549fa59d434c2b1c 100644 (file)
@@ -1,6 +1,6 @@
-## @ FspTool.py\r
+## @ SplitFspBin.py\r
 #\r
-# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>\r
 # SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 ##\r
@@ -103,26 +103,31 @@ class FSP_COMMON_HEADER(Structure):
 \r
 class FSP_INFORMATION_HEADER(Structure):\r
      _fields_ = [\r
-        ('Signature',            ARRAY(c_char, 4)),\r
-        ('HeaderLength',         c_uint32),\r
-        ('Reserved1',            c_uint16),\r
-        ('SpecVersion',          c_uint8),\r
-        ('HeaderRevision',       c_uint8),\r
-        ('ImageRevision',        c_uint32),\r
-        ('ImageId',              ARRAY(c_char, 8)),\r
-        ('ImageSize',            c_uint32),\r
-        ('ImageBase',            c_uint32),\r
-        ('ImageAttribute',       c_uint16),\r
-        ('ComponentAttribute',   c_uint16),\r
-        ('CfgRegionOffset',      c_uint32),\r
-        ('CfgRegionSize',        c_uint32),\r
-        ('Reserved2',            c_uint32),\r
-        ('TempRamInitEntryOffset',     c_uint32),\r
-        ('Reserved3',                  c_uint32),\r
-        ('NotifyPhaseEntryOffset',     c_uint32),\r
-        ('FspMemoryInitEntryOffset',   c_uint32),\r
-        ('TempRamExitEntryOffset',     c_uint32),\r
-        ('FspSiliconInitEntryOffset',  c_uint32)\r
+        ('Signature',                       ARRAY(c_char, 4)),\r
+        ('HeaderLength',                    c_uint32),\r
+        ('Reserved1',                       c_uint16),\r
+        ('SpecVersion',                     c_uint8),\r
+        ('HeaderRevision',                  c_uint8),\r
+        ('ImageRevision',                   c_uint32),\r
+        ('ImageId',                         ARRAY(c_char, 8)),\r
+        ('ImageSize',                       c_uint32),\r
+        ('ImageBase',                       c_uint32),\r
+        ('ImageAttribute',                  c_uint16),\r
+        ('ComponentAttribute',              c_uint16),\r
+        ('CfgRegionOffset',                 c_uint32),\r
+        ('CfgRegionSize',                   c_uint32),\r
+        ('Reserved2',                       c_uint32),\r
+        ('TempRamInitEntryOffset',          c_uint32),\r
+        ('Reserved3',                       c_uint32),\r
+        ('NotifyPhaseEntryOffset',          c_uint32),\r
+        ('FspMemoryInitEntryOffset',        c_uint32),\r
+        ('TempRamExitEntryOffset',          c_uint32),\r
+        ('FspSiliconInitEntryOffset',       c_uint32),\r
+        ('FspMultiPhaseSiInitEntryOffset',  c_uint32),\r
+        ('ExtendedImageRevision',           c_uint16),\r
+        ('Reserved4',                       c_uint16),\r
+        ('FspMultiPhaseMemInitEntryOffset', c_uint32),\r
+        ('FspSmmInitEntryOffset',           c_uint32)\r
     ]\r
 \r
 class FSP_PATCH_TABLE(Structure):\r
@@ -390,7 +395,26 @@ def OutputStruct (obj, indent = 0, plen = 0):
             if IsStrType (val):\r
                 rep = HandleNameStr (val)\r
             elif IsIntegerType (val):\r
-                rep = '0x%X' % val\r
+                if (key == 'ImageRevision'):\r
+                    FspImageRevisionMajor       = ((val >> 24) & 0xFF)\r
+                    FspImageRevisionMinor       = ((val >> 16) & 0xFF)\r
+                    FspImageRevisionRevision    = ((val >> 8) & 0xFF)\r
+                    FspImageRevisionBuildNumber = (val & 0xFF)\r
+                    rep = '0x%08X' % val\r
+                elif (key == 'ExtendedImageRevision'):\r
+                    FspImageRevisionRevision    |= (val & 0xFF00)\r
+                    FspImageRevisionBuildNumber |= ((val << 8) & 0xFF00)\r
+                    rep = "0x%04X ('%02X.%02X.%04X.%04X')" % (val, FspImageRevisionMajor, FspImageRevisionMinor, FspImageRevisionRevision, FspImageRevisionBuildNumber)\r
+                elif field[1] == c_uint64:\r
+                    rep = '0x%016X' % val\r
+                elif field[1] == c_uint32:\r
+                    rep = '0x%08X' % val\r
+                elif field[1] == c_uint16:\r
+                    rep = '0x%04X' % val\r
+                elif field[1] == c_uint8:\r
+                    rep = '0x%02X' % val\r
+                else:\r
+                    rep = '0x%X' % val\r
             elif isinstance(val, c_uint24):\r
                 rep = '0x%X' % val.get_value()\r
             elif 'c_ubyte_Array' in str(type(val)):\r
@@ -428,7 +452,7 @@ class FirmwareFile:
         ffssize = len(self.FfsData)\r
         offset  = sizeof(self.FfsHdr)\r
         if self.FfsHdr.Name != '\xff' * 16:\r
-            while offset < ffssize:\r
+            while offset < (ffssize - sizeof (EFI_COMMON_SECTION_HEADER)):\r
                 sechdr = EFI_COMMON_SECTION_HEADER.from_buffer (self.FfsData, offset)\r
                 sec = Section (offset, self.FfsData[offset:offset + int(sechdr.Size)])\r
                 self.SecList.append(sec)\r
@@ -453,7 +477,7 @@ class FirmwareVolume:
         else:\r
             offset = self.FvHdr.HeaderLength\r
         offset = AlignPtr(offset)\r
-        while offset < fvsize:\r
+        while offset < (fvsize - sizeof (EFI_FFS_FILE_HEADER)):\r
             ffshdr = EFI_FFS_FILE_HEADER.from_buffer (self.FvData, offset)\r
             if (ffshdr.Name == '\xff' * 16) and (int(ffshdr.Size) == 0xFFFFFF):\r
                 offset = fvsize\r
@@ -470,7 +494,7 @@ class FspImage:
         self.FihOffset = fihoff\r
         self.Offset    = offset\r
         self.FvIdxList = []\r
-        self.Type      = "XTMSXXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]\r
+        self.Type      = "XTMSIXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]\r
         self.PatchList = patch\r
         self.PatchList.append(fihoff + 0x1C)\r
 \r
@@ -515,7 +539,7 @@ class FirmwareDevice:
         offset = 0\r
         fdsize = len(self.FdData)\r
         self.FvList  = []\r
-        while offset < fdsize:\r
+        while offset < (fdsize - sizeof (EFI_FIRMWARE_VOLUME_HEADER)):\r
             fvh = EFI_FIRMWARE_VOLUME_HEADER.from_buffer (self.FdData, offset)\r
             if b'_FVH' != fvh.Signature:\r
                 raise Exception("ERROR: Invalid FV header !")\r
@@ -619,10 +643,10 @@ class PeTeImage:
             rsize   = self.TeHdr.DataDirectoryBaseReloc.Size\r
             roffset = sizeof(self.TeHdr) - self.TeHdr.StrippedSize + self.TeHdr.DataDirectoryBaseReloc.VirtualAddress\r
         else:\r
-            if self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b: # PE32 image\r
-                rsize   = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
-                roffset = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
-            if self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x20b: # PE32+ image\r
+            # Assuming PE32 image type (self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b)\r
+            rsize   = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
+            roffset = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
+            if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image\r
                 rsize   = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
                 roffset = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
 \r
@@ -677,8 +701,12 @@ class PeTeImage:
         else:\r
             offset  = self.Offset + self.DosHdr.e_lfanew\r
             offset += EFI_IMAGE_NT_HEADERS32.OptionalHeader.offset\r
-            offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset\r
-            size    = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size\r
+            if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image\r
+                offset += EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.offset\r
+                size    = EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.size\r
+            else:\r
+                offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset\r
+                size    = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size\r
 \r
         value  = Bytes2Val(fdbin[offset:offset+size]) + delta\r
         fdbin[offset:offset+size] = Val2Bytes(value, size)\r
@@ -838,12 +866,12 @@ def RebaseFspBin (FspBinary, FspComponent, FspBase, OutputDir, OutputFile):
 \r
 def main ():\r
     parser     = argparse.ArgumentParser()\r
-    subparsers = parser.add_subparsers(title='commands')\r
+    subparsers = parser.add_subparsers(title='commands', dest="which")\r
 \r
     parser_rebase  = subparsers.add_parser('rebase',  help='rebase a FSP into a new base address')\r
     parser_rebase.set_defaults(which='rebase')\r
     parser_rebase.add_argument('-f',  '--fspbin' , dest='FspBinary',  type=str, help='FSP binary file path', required = True)\r
-    parser_rebase.add_argument('-c',  '--fspcomp', choices=['t','m','s','o'],  nargs='+', dest='FspComponent', type=str, help='FSP component to rebase', default = "['t']", required = True)\r
+    parser_rebase.add_argument('-c',  '--fspcomp', choices=['t','m','s','o','i'],  nargs='+', dest='FspComponent', type=str, help='FSP component to rebase', default = "['t']", required = True)\r
     parser_rebase.add_argument('-b',  '--newbase', dest='FspBase', nargs='+', type=str, help='Rebased FSP binary file name', default = '', required = True)\r
     parser_rebase.add_argument('-o',  '--outdir' , dest='OutputDir',  type=str, help='Output directory path', default = '.')\r
     parser_rebase.add_argument('-n',  '--outfile', dest='OutputFile', type=str, help='Rebased FSP binary file name', default = '')\r
@@ -880,7 +908,7 @@ def main ():
     elif args.which == 'info':\r
         ShowFspInfo (args.FspBinary)\r
     else:\r
-        pass\r
+        parser.print_help()\r
 \r
     return 0\r
 \r