ArmPkg Compression

Jordan Justen edited this page Sep 4, 2014 · 1 revision

Introduction

To reduce the size of the firmware and also to speed up the boot process (it is sometimes faster to decompress a compressed file than to copy the original file from a block storage), it is often common to compress the DXE & BDS modules.

Disable compression

To speed up the boot process on platform with slow CPU (eg: FPGA platform), it might help to disable the decompression and copy the image directly into DRAM.
This section will use ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-AEMv8Ax4.fdf as an example.

At the end of the build process you will see these three FVs (Firmware Volume):

FV Space Information
FVMAIN_SEC [14%Full] 524288 total, 77504 used, 446784 free
FVMAIN_COMPACT [45%Full] 2621440 total, 1184312 used, 1437128 free
FVMAIN [99%Full] 4004224 total, 4004168 used, 56 free
FVMAIN_SEC is the secure part of the firmware that should live into Trusted Memory.
FVMAIN is the compressed image. This FV image is added in FVMAIN_COMPACT.

The compression is driven by the Guided Section in the FDF file. See the section '[FV.FVMAIN_COMPACT]':

  FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
      SECTION FV_IMAGE = FVMAIN
    }
  }

The GUID 'EE4E5898-3914-4259-9D6E-DC7BD79403CF' corresponds to the LZMA decompression (defined in IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec).
This section says it will compress the FV image named 'FVMAIN' into a file named 'FV_IMAGE'.

The FVMAIN FV image is defined above by the section '[FV.FvMain]'.

To disable the compression:

1. Flatten the FDF file: Move the content of FVMAIN into FVMAIN_COMPACT:

- remove FV_IMAGE file from FVMAIN_COMPACT
- move all the files from FVMAIN to FVMAIN_COMPACT
If you build the UEFI firmware after this step, you might see your firmware does not fit anymore in the size defined by the FDF file:
Generating FVMAIN_COMPACT FV
########################################
########################################
########################################
###Return Value = 2
GenFv: ERROR 3000: Invalid
  the required fv image size 0x46ede8 exceeds the set fv image size 0x280000

2. Increase the size of the FDF file

From:

[FD.RTSM_VE_AEMv8_EFI]
BaseAddress   = 0x00000000|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
Size          = 0x00300000|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
(...)
BlockSize     = 0x00001000
NumBlocks     = 0x300
(...)
0x00080000|0x00280000
gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize

To:

[FD.RTSM_VE_AEMv8_EFI]
BaseAddress   = 0x00000000|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
Size          = 0x00580000|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
(...)
BlockSize     = 0x00001000
NumBlocks     = 0x580
(...)
0x00080000|0x00500000
gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize

3. Build the new firmware:

FV Space Information
FVMAIN_SEC [14%Full] 524288 total, 77504 used, 446784 free
FVMAIN_COMPACT [88%Full] 5242880 total, 4648424 used, 594456 free
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.