VirtualBox

Ignore:
Timestamp:
Aug 14, 2024 1:16:30 PM (7 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164367
Message:

Devices/EFI/FirmwareNew: Merge edk2-stable-202405 and make it build on aarch64, bugref:4643

Location:
trunk/src/VBox/Devices/EFI/FirmwareNew
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/FirmwareNew

  • trunk/src/VBox/Devices/EFI/FirmwareNew/IntelFsp2Pkg/Tools/SplitFspBin.py

    r99404 r105670  
    470470            self.FvExtHdr = None
    471471        self.FfsList  = []
     472        self.ChildFvList  = []
    472473
    473474    def ParseFv(self):
     
    484485            else:
    485486                ffs = FirmwareFile (offset, self.FvData[offset:offset + int(ffshdr.Size)])
    486                 ffs.ParseFfs()
    487                 self.FfsList.append(ffs)
     487                # check if there is child fv
     488                childfvfound = 0
     489                if (ffs.FfsHdr.Type == EFI_FV_FILETYPE.FIRMWARE_VOLUME_IMAGE):
     490                    csoffset = offset + sizeof (EFI_FFS_FILE_HEADER)
     491                    csoffset = AlignPtr(csoffset, 4)
     492                    # find fv section
     493                    while csoffset < (offset + int(ffs.FfsHdr.Size)):
     494                        cshdr = EFI_COMMON_SECTION_HEADER.from_buffer (self.FvData, csoffset)
     495                        if (cshdr.Type == EFI_SECTION_TYPE.FIRMWARE_VOLUME_IMAGE):
     496                            childfvfound = 1
     497                            break
     498                        else:
     499                            # check next section
     500                            csoffset += int(cshdr.Size)
     501                            csoffset = AlignPtr(csoffset, 4)
     502                if (childfvfound):
     503                    childfvoffset = csoffset + sizeof (EFI_COMMON_SECTION_HEADER)
     504                    childfvhdr = EFI_FIRMWARE_VOLUME_HEADER.from_buffer (self.FvData, childfvoffset)
     505                    childfv = FirmwareVolume (childfvoffset, self.FvData[childfvoffset:childfvoffset + int(childfvhdr.FvLength)])
     506                    childfv.ParseFv ()
     507                    self.ChildFvList.append(childfv)
     508                else:
     509                    ffs.ParseFfs()
     510                    self.FfsList.append(ffs)
    488511                offset += int(ffshdr.Size)
    489512                offset = AlignPtr(offset)
     
    790813        hfsp.close()
    791814
     815def GetImageFromFv (fd, parentfvoffset, fv, imglist):
     816    for ffs in fv.FfsList:
     817        for sec in ffs.SecList:
     818            if sec.SecHdr.Type in [EFI_SECTION_TYPE.TE, EFI_SECTION_TYPE.PE32]:   # TE or PE32
     819                offset = fd.Offset + parentfvoffset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr)
     820                imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr)))
     821
    792822def RebaseFspBin (FspBinary, FspComponent, FspBase, OutputDir, OutputFile):
    793823    fd = FirmwareDevice(0, FspBinary)
     
    833863        for fvidx in fsp.FvIdxList:
    834864            fv = fd.FvList[fvidx]
    835             for ffs in fv.FfsList:
    836                 for sec in ffs.SecList:
    837                     if sec.SecHdr.Type in [EFI_SECTION_TYPE.TE, EFI_SECTION_TYPE.PE32]:   # TE or PE32
    838                         offset = fd.Offset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr)
    839                         imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr)))
     865            GetImageFromFv (fd, 0, fv, imglist)
     866            # get image from child fv
     867            for childfv in fv.ChildFvList:
     868                print ("Get image from child fv of fv%d, parent fv offset: 0x%x" % (fvidx, fv.Offset))
     869                GetImageFromFv (fd, fv.Offset, childfv, imglist)
    840870
    841871        fcount  = 0
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette