I also offered a patch to the BaseTools project to fix the firmware when
linked at 0x0 in the past.
But my patch has been rejected and a new keyword has been introduced to fix
this BaseTools limitation.

In your Versatile Express A5 FDF file you have to replace:

[FV.FVMAIN_SEC]
FvAlignment        = 8

By:
[FV.FVMAIN_SEC]
FvBaseAddress      = 0x0
FvForceRebase      = TRUE
FvAlignment        = 8


> -----Original Message-----
> From: [email protected] [mailto:boot-
> [email protected]] On Behalf Of Ryan Harkin
> Sent: 21 June 2013 08:44
> To: [email protected]; [email protected]; edk2-
> [email protected]; [email protected]; boot-
> [email protected]
> Subject: [PATCH 1/1] BaseTools: Apply ARM GenFv patch
> 
> This patch is needed to fixup some builds, such as Versatile Express
> A5,
> otherwise they hang on boot due to the first instruction being zero.
> 
> Signed-off-by: Ryan Harkin <[email protected]>
> ---
>  BaseTools/Source/C/GenFv/GenFv.c            |    7 +---
>  BaseTools/Source/C/GenFv/GenFvInternalLib.c |   48 +++++++++++--------
> --------
>  2 files changed, 21 insertions(+), 34 deletions(-)
> 
> diff --git a/BaseTools/Source/C/GenFv/GenFv.c
> b/BaseTools/Source/C/GenFv/GenFv.c
> index fa86d00..a68c7b8 100644
> --- a/BaseTools/Source/C/GenFv/GenFv.c
> +++ b/BaseTools/Source/C/GenFv/GenFv.c
> @@ -623,12 +623,7 @@ Returns:
>                );
>    } else {
>      VerboseMsg ("Create Fv image and its map file");
> -    //
> -    // Will take rebase action at below situation:
> -    // 1. ForceRebase Flag specified to TRUE;
> -    // 2. ForceRebase Flag not specified, BaseAddress greater than
> zero.
> -    //
> -    if (((mFvDataInfo.BaseAddress > 0) && (mFvDataInfo.ForceRebase ==
> -1)) || (mFvDataInfo.ForceRebase == 1)) {
> +    if (mFvDataInfo.BaseAddressSet) {
>        VerboseMsg ("FvImage Rebase Address is 0x%llX", (unsigned long
> long) mFvDataInfo.BaseAddress);
>      }
>      //
> diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c
> b/BaseTools/Source/C/GenFv/GenFvInternalLib.c
> index c01e504..d143040 100644
> --- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c
> +++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c
> @@ -506,6 +506,7 @@ Returns:
> 
>  EFI_STATUS
>  AddPadFile (
> +  IN FV_INFO          *FvInfo,
>    IN OUT MEMORY_FILE  *FvImage,
>    IN UINT32           DataAlignment,
>    IN VOID             *FvEnd,
> @@ -537,6 +538,8 @@ Returns:
>  {
>    EFI_FFS_FILE_HEADER *PadFile;
>    UINTN               PadFileSize;
> +  UINTN               PadFileOffset;
> +  UINTN               ExtHeaderSize;
> 
>    //
>    // Verify input parameters.
> @@ -559,32 +562,29 @@ Returns:
>    // This is the earliest possible valid offset (current plus pad file
> header
>    // plus the next file header)
>    //
> -  PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage-
> >FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);
> +  // The padding is added into its own FFS file (which requires a
> header) added before the aligned file:
> +  // | ... FV data before AlignedFile ... | Pad File FFS Header |
> Padding | AlignedFile FFS Header (+ ExtHeader) | AlignedData
> 
>    //
> -  // Add whatever it takes to get to the next aligned address
> +  // Calculate the Offset of the Pad File from the beginning of the FV
> file
>    //
> -  while ((PadFileSize % DataAlignment) != 0) {
> -    PadFileSize++;
> -  }
> -  //
> -  // Subtract the next file header size
> -  //
> -  PadFileSize -= sizeof (EFI_FFS_FILE_HEADER);
> -
> -  //
> -  // Subtract the starting offset to get size
> -  //
> -  PadFileSize -= (UINTN) FvImage->CurrentFilePointer - (UINTN)
> FvImage->FileImage;
> +  PadFileOffset = (UINTN) FvImage->CurrentFilePointer - (UINTN)
> FvImage->FileImage;
> 
>    //
> -  // Append extension header size
> +  // Get the size of the extension header if exists
>    //
>    if (ExtHeader != NULL) {
> -    PadFileSize = PadFileSize + ExtHeader->ExtHeaderSize;
> +    ExtHeaderSize = ExtHeader->ExtHeaderSize;
> +  } else {
> +    ExtHeaderSize = 0;
>    }
> 
>    //
> +  // Calculate the Size of the Padding to ensure the alignment of the
> data of the Next file
> +  //
> +  PadFileSize = DataAlignment - ((FvInfo->BaseAddress + PadFileOffset
> + sizeof (EFI_FFS_FILE_HEADER) + ExtHeaderSize) & (DataAlignment - 1));
> +
> +  //
>    // Verify that we have enough space for the file header
>    //
>    if (((UINTN) FvImage->CurrentFilePointer + PadFileSize) > (UINTN)
> FvEnd) {
> @@ -1115,7 +1115,7 @@ Returns:
>    //
>    // Add pad file if necessary
>    //
> -  Status = AddPadFile (FvImage, 1 << CurrentFileAlignment,
> *VtfFileImage, NULL);
> +  Status = AddPadFile (FvInfo, FvImage, 1 << CurrentFileAlignment,
> *VtfFileImage, NULL);
>    if (EFI_ERROR (Status)) {
>      Error (NULL, 0, 4002, "Resource", "FV space is full, could not add
> pad file for data alignment property.");
>      free (FileBuffer);
> @@ -2304,7 +2304,7 @@ Returns:
>      //
>      // Add FV Extended Header contents to the FV as a PAD file
>      //
> -    AddPadFile (&FvImageMemoryFile, 4, VtfFileImage, FvExtHeader);
> +    AddPadFile (&mFvDataInfo, &FvImageMemoryFile, 4, VtfFileImage,
> FvExtHeader);
> 
>      //
>      // Fv Extension header change update Fv Header Check sum
> @@ -2825,19 +2825,11 @@ Returns:
>    PeFileBuffer       = NULL;
> 
>    //
> -  // Don't need to relocate image when BaseAddress is zero and no
> ForceRebase Flag specified.
> +  // Don't need to relocate image when BaseAddress is not set.
>    //
> -  if ((FvInfo->BaseAddress == 0) && (FvInfo->ForceRebase == -1)) {
> +  if (FvInfo->BaseAddressSet == FALSE) {
>      return EFI_SUCCESS;
>    }
> -
> -  //
> -  // If ForceRebase Flag specified to FALSE, will always not take
> rebase action.
> -  //
> -  if (FvInfo->ForceRebase == 0) {
> -    return EFI_SUCCESS;
> -  }
> -
> 
>    XipBase = FvInfo->BaseAddress + XipOffset;
> 
> --
> 1.7.9.5
> 
> 
> _______________________________________________
> boot-architecture mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/boot-architecture





------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
edk2-buildtools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-buildtools-devel

Reply via email to