mirror of https://github.com/acidanthera/audk.git
Not needed
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@588 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
cc7f0a9111
commit
ecbc84213c
|
@ -1,87 +0,0 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
|
||||
This software and associated documentation (if any) is furnished
|
||||
under a license and may only be used or copied in accordance
|
||||
with the terms of the license. Except as permitted by such
|
||||
license, no part of this software or documentation may be
|
||||
reproduced, stored in a retrieval system, or transmitted in any
|
||||
form or by any means without the express written consent of
|
||||
Intel Corporation.
|
||||
|
||||
|
||||
Module Name:
|
||||
|
||||
GenFdImage.h
|
||||
|
||||
Abstract:
|
||||
|
||||
This file contains the relevant declarations required
|
||||
to generate the Firmware Device
|
||||
|
||||
--*/
|
||||
|
||||
//
|
||||
// Coded to EFI 2.0 Coding Standard
|
||||
//
|
||||
#ifndef _EFI_GEN_FD_IMAGE_H
|
||||
#define _EFI_GEN_FD_IMAGE_H
|
||||
|
||||
//
|
||||
// Included Header files
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "ParseInf.h"
|
||||
|
||||
//
|
||||
// Defines
|
||||
//
|
||||
#define FILE_NAME_SIZE 256
|
||||
|
||||
//
|
||||
// Type Definition
|
||||
//
|
||||
typedef struct {
|
||||
UINT64 FdSize;
|
||||
UINT64 FdBaseAddress;
|
||||
UINT8 PadValue;
|
||||
CHAR8 OutFileName[FILE_NAME_SIZE];
|
||||
} FDINFO;
|
||||
|
||||
//
|
||||
// Exported Function Prototype
|
||||
//
|
||||
EFI_STATUS
|
||||
GenerateFdImage (
|
||||
IN UINT64 BaseAddress,
|
||||
IN UINT64 Size,
|
||||
IN UINT8 PadByte,
|
||||
IN CHAR8 *OutFile,
|
||||
IN CHAR8 **FileList
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
BaseAddress - GC_TODO: add argument description
|
||||
Size - GC_TODO: add argument description
|
||||
PadByte - GC_TODO: add argument description
|
||||
OutFile - GC_TODO: add argument description
|
||||
FileList - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
|
@ -1,864 +0,0 @@
|
|||
/*++
|
||||
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
|
||||
This software and associated documentation (if any) is furnished
|
||||
under a license and may only be used or copied in accordance
|
||||
with the terms of the license. Except as permitted by such
|
||||
license, no part of this software or documentation may be
|
||||
reproduced, stored in a retrieval system, or transmitted in any
|
||||
form or by any means without the express written consent of
|
||||
Intel Corporation.
|
||||
|
||||
|
||||
Module Name:
|
||||
GenFdImageDll.C
|
||||
|
||||
Abstarct:
|
||||
This file contains the relevant functions required to complete
|
||||
the API to generate Firmware Device
|
||||
--*/
|
||||
|
||||
// GC_TODO: fix comment to add: Abstract:
|
||||
//
|
||||
// This tells the compiler to export the DLL functions
|
||||
//
|
||||
#define GEN_FD_IMAGE_EXPORTS
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <Common/UefiBaseTypes.h>
|
||||
|
||||
#include "GenFdImage.h"
|
||||
#include "ParseInf.h"
|
||||
|
||||
//
|
||||
// Global declaration
|
||||
//
|
||||
UINTN ValidLineNum = 0;
|
||||
|
||||
UINTN NumFvFiles = 0;
|
||||
static UINT64 LastAddress = 0;
|
||||
|
||||
CHAR8 **TokenStr;
|
||||
CHAR8 **OrgStrTokPtr;
|
||||
|
||||
FDINFO *FdInfo;
|
||||
FDINFO *OrgFdInfoPtr;
|
||||
|
||||
FVINFO **FvInfo;
|
||||
FVINFO **OrgFvInfoPtr;
|
||||
|
||||
//
|
||||
// Global function declarations
|
||||
//
|
||||
EFI_STATUS
|
||||
BuildFirmwareDeviceBinaryFromFwVolumes (
|
||||
IN UINT64 FvBaseAddress,
|
||||
IN CHAR8 *FvFileName,
|
||||
IN CHAR8 *FdFileName
|
||||
);
|
||||
|
||||
INTN
|
||||
CompareItems (
|
||||
IN const VOID *Arg1,
|
||||
IN const VOID *Arg2
|
||||
)
|
||||
/*++
|
||||
Description:
|
||||
|
||||
This function is used by qsort to sort the Fv list based on FvBaseAddress
|
||||
|
||||
Input:
|
||||
Arg1
|
||||
Arg2
|
||||
|
||||
Return:
|
||||
|
||||
None
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: Arg1 - add argument and description to function comment
|
||||
// GC_TODO: Arg2 - add argument and description to function comment
|
||||
{
|
||||
if ((*(FVINFO **) Arg1)->FvBaseAddress > (*(FVINFO **) Arg2)->FvBaseAddress) {
|
||||
return 1;
|
||||
} else if ((*(FVINFO **) Arg1)->FvBaseAddress < (*(FVINFO **) Arg2)->FvBaseAddress) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
BuildTokenList (
|
||||
IN CHAR8 *Token
|
||||
)
|
||||
/*++
|
||||
Description:
|
||||
|
||||
This function builds the token list in an array which will be parsed later
|
||||
|
||||
Input:
|
||||
Token String,
|
||||
|
||||
Return:
|
||||
|
||||
None
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: Token - add argument and description to function comment
|
||||
{
|
||||
|
||||
strcpy (*TokenStr, Token);
|
||||
TokenStr++;
|
||||
}
|
||||
|
||||
VOID
|
||||
TrimLine (
|
||||
IN CHAR8 *Line
|
||||
)
|
||||
/*++
|
||||
Description:
|
||||
|
||||
This function cleans up the line by removing all whitespace and
|
||||
comments
|
||||
|
||||
Input:
|
||||
|
||||
Line String,
|
||||
|
||||
Return:
|
||||
None
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: Line - add argument and description to function comment
|
||||
{
|
||||
CHAR8 TmpLine[FILE_NAME_SIZE];
|
||||
CHAR8 c;
|
||||
CHAR8 *Ptr0;
|
||||
UINTN i;
|
||||
UINTN j;
|
||||
|
||||
//
|
||||
// Change '#' to '//' for Comment style
|
||||
//
|
||||
// if((Ptr0=strchr(Line, '#')) != NULL) {
|
||||
//
|
||||
if ((Ptr0 = strstr (Line, "//")) != NULL) {
|
||||
Line[Ptr0 - Line] = 0;
|
||||
}
|
||||
|
||||
i = j = 0;
|
||||
|
||||
while ((c = Line[i]) != 0) {
|
||||
if ((c != ' ') && (c != '\t') && (c != '\n')) {
|
||||
TmpLine[j++] = c;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
TmpLine[j] = 0;
|
||||
strcpy (Line, TmpLine);
|
||||
}
|
||||
|
||||
VOID
|
||||
ValidLineCount (
|
||||
IN FILE *Fp
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function calculated number of valid lines in a input file.
|
||||
|
||||
Input:
|
||||
|
||||
Fp Pointer to a file handle which has been opened.
|
||||
|
||||
Return:
|
||||
|
||||
None
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: Fp - add argument and description to function comment
|
||||
{
|
||||
CHAR8 Buff[FILE_NAME_SIZE];
|
||||
|
||||
while (fgets (Buff, sizeof (Buff), Fp)) {
|
||||
TrimLine (Buff);
|
||||
if (Buff[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ValidLineNum++;
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ParseInputFile (
|
||||
IN FILE *Fp
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function parses the input file and tokenize the string
|
||||
|
||||
Input:
|
||||
|
||||
Fp Pointer to a file handle which has been opened.
|
||||
|
||||
Return:
|
||||
|
||||
None
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: Fp - add argument and description to function comment
|
||||
{
|
||||
CHAR8 *Token;
|
||||
CHAR8 Buff[FILE_NAME_SIZE];
|
||||
CHAR8 OrgLine[FILE_NAME_SIZE];
|
||||
CHAR8 Str[FILE_NAME_SIZE];
|
||||
CHAR8 Delimit[] = "=";
|
||||
|
||||
while (fgets (Buff, sizeof (Buff), Fp) != NULL) {
|
||||
strcpy (OrgLine, Buff);
|
||||
TrimLine (Buff);
|
||||
|
||||
if (Buff[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Token = strtok (Buff, Delimit);
|
||||
|
||||
while (Token != NULL) {
|
||||
strcpy (Str, Token);
|
||||
BuildTokenList (Str);
|
||||
Token = strtok (NULL, Delimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
InitializeComps (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function intializes the relevant global variable which is being
|
||||
used to store the information retrieved from INF file.
|
||||
|
||||
Input:
|
||||
|
||||
None
|
||||
|
||||
Return:
|
||||
|
||||
EFI_STATUS
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
FdInfo = malloc (sizeof (FDINFO));
|
||||
|
||||
if (FdInfo == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
OrgFdInfoPtr = FdInfo;
|
||||
|
||||
FvInfo = malloc (sizeof (int) * NumFvFiles);
|
||||
|
||||
if (FvInfo == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
OrgFvInfoPtr = FvInfo;
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
*FvInfo = malloc (sizeof (FVINFO));
|
||||
|
||||
if (*FvInfo == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
memset (*FvInfo, 0, sizeof (FVINFO));
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
InitializeInFileInfo (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function intializes the relevant global variable which is being
|
||||
used to store the information retrieved from INF file.
|
||||
|
||||
Input:
|
||||
|
||||
NONE
|
||||
|
||||
Return:
|
||||
|
||||
NONE
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
{
|
||||
UINTN OptionFlag;
|
||||
UINT64 StringValue;
|
||||
|
||||
OptionFlag = 0;
|
||||
TokenStr = OrgStrTokPtr;
|
||||
|
||||
while (*TokenStr != NULL) {
|
||||
if (stricmp (*TokenStr, "[options]") == 0) {
|
||||
OptionFlag = 1;
|
||||
}
|
||||
|
||||
if (OptionFlag) {
|
||||
if (stricmp (*TokenStr, "EFI_FV_BASE_ADDRESS") == 0) {
|
||||
*TokenStr++;
|
||||
if (AsciiStringToUint64 (*TokenStr, FALSE, &StringValue) != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Cannot determine the FV base address.");
|
||||
return ;
|
||||
}
|
||||
(*FvInfo)->FvBaseAddress = StringValue;
|
||||
} else if (stricmp (*TokenStr, "EFI_FV_FILE_NAME") == 0) {
|
||||
*TokenStr++;
|
||||
strcpy ((*FvInfo)->FvFile, *TokenStr);
|
||||
}
|
||||
}
|
||||
|
||||
TokenStr++;
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
GetFvRelatedInfoFromInfFile (
|
||||
IN CHAR8 *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function reads the input file, parse it and create a list of tokens
|
||||
which is parsed and used, to intialize the data related to Firmware Volume.
|
||||
|
||||
Input:
|
||||
|
||||
FileName FileName which needed to be read to parse data
|
||||
|
||||
Return:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: FileName - add argument and description to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
UINTN Index;
|
||||
|
||||
Fp = fopen (FileName, "r");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("Error in opening %s file\n", FileName);
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
ValidLineCount (Fp);
|
||||
|
||||
if (ValidLineNum == 0) {
|
||||
printf ("\nFile doesn't contain any valid informations");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
TokenStr = (CHAR8 **) malloc (sizeof (UINTN) * (2 * ValidLineNum));
|
||||
memset (TokenStr, 0, sizeof (UINTN) * (2 * ValidLineNum));
|
||||
OrgStrTokPtr = TokenStr;
|
||||
|
||||
for (Index = 0; Index < (2 * ValidLineNum); Index++) {
|
||||
*TokenStr = (CHAR8 *) malloc (sizeof (CHAR8) * FILE_NAME_SIZE);
|
||||
memset (*TokenStr, 0, FILE_NAME_SIZE);
|
||||
TokenStr++;
|
||||
}
|
||||
|
||||
*TokenStr = NULL;
|
||||
TokenStr = OrgStrTokPtr;
|
||||
fseek (Fp, 0L, SEEK_SET);
|
||||
|
||||
ParseInputFile (Fp);
|
||||
InitializeInFileInfo ();
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
WriteFwBinary (
|
||||
IN CHAR8 *FileName,
|
||||
IN UINT64 StartAddress,
|
||||
IN UINT64 Size,
|
||||
IN UINT8 *Buffer
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function reads the input file, parse it and create a list of tokens
|
||||
which is parsed and used, to intialize the data related to Firmware Volume.
|
||||
|
||||
Input:
|
||||
|
||||
FileName FileName which needed to be read to parse data
|
||||
StartAddress This will set the file position.
|
||||
Size Size in bytes needed to be written
|
||||
Buffer Buffer needed to e written
|
||||
|
||||
Return:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: FileName - add argument and description to function comment
|
||||
// GC_TODO: StartAddress - add argument and description to function comment
|
||||
// GC_TODO: Size - add argument and description to function comment
|
||||
// GC_TODO: Buffer - add argument and description to function comment
|
||||
// GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
UINTN NumByte;
|
||||
|
||||
Fp = fopen (FileName, "a+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Error in opening file %s ", FileName);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
fseek (Fp, (UINTN) StartAddress, SEEK_SET);
|
||||
NumByte = fwrite ((VOID *) Buffer, sizeof (UINT8), (UINTN) Size, Fp);
|
||||
|
||||
//
|
||||
// Check to ensure that buffer has been copied successfully
|
||||
//
|
||||
if (NumByte != Size) {
|
||||
printf ("\nERROR: Error in copying the buffer into file");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
BuildFirmwareDeviceBinaryFromFwVolumes (
|
||||
IN UINT64 FvBaseAddress,
|
||||
IN CHAR8 *FvFileName,
|
||||
IN CHAR8 *FdFileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function reads the input file, parse it and create a list of tokens
|
||||
which is parsed and used, to intialize the data related to Firmware Volume.
|
||||
|
||||
Input:
|
||||
|
||||
FvBaseAddress Base Address. This info is retrieved from INF file
|
||||
FvFileName InputFileName
|
||||
FdFileName Output File Name
|
||||
|
||||
Return:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: FvBaseAddress - add argument and description to function comment
|
||||
// GC_TODO: FvFileName - add argument and description to function comment
|
||||
// GC_TODO: FdFileName - add argument and description to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
UINT64 FileSize;
|
||||
UINT64 NumByteRead;
|
||||
UINT64 PadByteSize;
|
||||
UINTN Index;
|
||||
UINT64 BaseAddress;
|
||||
UINT8 *Buffer;
|
||||
EFI_STATUS Status;
|
||||
static UINT64 StartAddress = 0;
|
||||
|
||||
Fp = fopen (FvFileName, "r+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Error in opening file %s", FvFileName);
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
BaseAddress = FdInfo->FdBaseAddress;
|
||||
|
||||
//
|
||||
// Check if Base Address of Firmware Volume falls below the Base Address
|
||||
// Firmware Device, if yes, then abort this process.
|
||||
//
|
||||
if (FvBaseAddress < BaseAddress) {
|
||||
printf ("\nERROR: Firmware Volume Base Address falls below Firmware Device Address.\n");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
//
|
||||
// Check if there are any hole between two Firmware Volumes. If any hole
|
||||
// exists, fill the hole with PadByte data.
|
||||
//
|
||||
if (FvBaseAddress > LastAddress) {
|
||||
PadByteSize = (FvBaseAddress - LastAddress);
|
||||
Buffer = malloc ((UINTN) PadByteSize);
|
||||
|
||||
for (Index = 0; Index < PadByteSize; Index++) {
|
||||
*Buffer = FdInfo->PadValue;
|
||||
Buffer++;
|
||||
}
|
||||
|
||||
Buffer -= PadByteSize;
|
||||
Status = WriteFwBinary (FdFileName, StartAddress, (UINT64) PadByteSize, Buffer);
|
||||
|
||||
if (Buffer) {
|
||||
free (Buffer);
|
||||
}
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error in writing the binary image to file");
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartAddress += PadByteSize;
|
||||
LastAddress += PadByteSize;
|
||||
}
|
||||
//
|
||||
// Proceed with next Firmware Volume updates
|
||||
//
|
||||
FileSize = _filelength (fileno (Fp));
|
||||
|
||||
if ((FvBaseAddress + FileSize) > (FdInfo->FdBaseAddress + FdInfo->FdSize)) {
|
||||
printf (
|
||||
"\nERROR:Unable to update Firmware Device. File %s is larger than \
|
||||
available space.",
|
||||
FvFileName
|
||||
);
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
Buffer = malloc ((UINTN) FileSize);
|
||||
|
||||
if (Buffer == NULL) {
|
||||
printf ("Error in allocating buffer to read specific file\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
NumByteRead = fread ((VOID *) Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);
|
||||
|
||||
Status = WriteFwBinary (FdFileName, StartAddress, FileSize, Buffer);
|
||||
|
||||
if (Buffer) {
|
||||
free ((VOID *) Buffer);
|
||||
}
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error in writing the binary image to file");
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartAddress += NumByteRead;
|
||||
LastAddress += FileSize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
CleanUpMemory (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function cleans up any allocated buffer
|
||||
|
||||
Input:
|
||||
|
||||
NONE
|
||||
|
||||
Return:
|
||||
|
||||
NONE
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
if (FdInfo) {
|
||||
free (FdInfo);
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
if (FvInfo) {
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
if (*FvInfo) {
|
||||
free (*FvInfo);
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
free (FvInfo);
|
||||
}
|
||||
}
|
||||
|
||||
GEN_FD_IMAGE_API
|
||||
EFI_STATUS
|
||||
GenerateFdImage (
|
||||
IN UINT64 BaseAddress,
|
||||
IN UINT64 Size,
|
||||
IN UINT8 PadByte,
|
||||
IN CHAR8 *OutFile,
|
||||
IN CHAR8 **FileList
|
||||
)
|
||||
/*++
|
||||
|
||||
Description:
|
||||
|
||||
This function reads the input file, parse it and create a list of tokens
|
||||
which is parsed and used, to intialize the data related to Firmware Volume.
|
||||
|
||||
Input:
|
||||
|
||||
BaseAddress Base Address for this Firmware Device
|
||||
Size, Total Size of the Firmware Device
|
||||
PadByte Pad byte data
|
||||
OutFile Output File Name
|
||||
FileList File List pointer to INF file names.
|
||||
|
||||
Return:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: function comment is missing 'Routine Description:'
|
||||
// GC_TODO: function comment is missing 'Arguments:'
|
||||
// GC_TODO: function comment is missing 'Returns:'
|
||||
// GC_TODO: BaseAddress - add argument and description to function comment
|
||||
// GC_TODO: Size - add argument and description to function comment
|
||||
// GC_TODO: PadByte - add argument and description to function comment
|
||||
// GC_TODO: OutFile - add argument and description to function comment
|
||||
// GC_TODO: FileList - add argument and description to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
UINTN PadSize;
|
||||
UINTN FileSize;
|
||||
CHAR8 **InFile;
|
||||
FILE *Fp;
|
||||
UINT8 *Buffer;
|
||||
UINTN NumByte;
|
||||
|
||||
//
|
||||
// Ensure, if there are any previous Firmware Device exists,
|
||||
// If yes, make it to 0 bytes
|
||||
//
|
||||
if ((Fp = fopen (OutFile, "w")) != NULL) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
InFile = FileList;
|
||||
|
||||
while (*InFile != NULL) {
|
||||
NumFvFiles++;
|
||||
InFile++;
|
||||
}
|
||||
|
||||
InitializeComps ();
|
||||
|
||||
//
|
||||
// Restore the orginal pointers
|
||||
//
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
InFile = FileList;
|
||||
|
||||
while (*InFile != NULL) {
|
||||
strcpy ((*FvInfo)->FvInfoFile, *InFile);
|
||||
Status = GetFvRelatedInfoFromInfFile (*InFile);
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error occurred in processsing INF file");
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
InFile++;
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FdInfo->FdSize = Size;
|
||||
FdInfo->FdBaseAddress = BaseAddress;
|
||||
FdInfo->PadValue = PadByte;
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
strcpy (FdInfo->OutFileName, OutFile);
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
Status = GenerateFvImage ((*FvInfo)->FvInfoFile);
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
//
|
||||
// Sort the Firmware Volume informations. Firmware Volume with lower
|
||||
// base addresses will be processed first and hiher base address one
|
||||
// will be processed later.
|
||||
//
|
||||
qsort ((VOID *) FvInfo, NumFvFiles, sizeof (FVINFO *), CompareItems);
|
||||
|
||||
LastAddress = (*FvInfo)->FvBaseAddress;
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
Status = BuildFirmwareDeviceBinaryFromFwVolumes (
|
||||
(*FvInfo)->FvBaseAddress,
|
||||
(*FvInfo)->FvFile,
|
||||
FdInfo->OutFileName
|
||||
);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
//
|
||||
// Check if any space left after copying data from all Firmware Volumes
|
||||
// If yes, then fill those location with PadValue.
|
||||
//
|
||||
if ((FdInfo->FdBaseAddress + Size) > LastAddress) {
|
||||
|
||||
PadSize = (UINTN) ((FdInfo->FdBaseAddress + FdInfo->FdSize) - LastAddress);
|
||||
Buffer = malloc (PadSize);
|
||||
|
||||
if (Buffer == NULL) {
|
||||
CleanUpMemory ();
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < PadSize; Index++) {
|
||||
*Buffer = FdInfo->PadValue;
|
||||
Buffer++;
|
||||
}
|
||||
|
||||
Buffer -= PadSize;
|
||||
|
||||
Fp = fopen (OutFile, "a+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Opening file %s", OutFile);
|
||||
CleanUpMemory ();
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
FileSize = _filelength (fileno (Fp));
|
||||
fseek (Fp, FileSize, SEEK_SET);
|
||||
NumByte = fwrite (Buffer, sizeof (UINT8), PadSize, Fp);
|
||||
|
||||
if (Buffer) {
|
||||
free (Buffer);
|
||||
}
|
||||
|
||||
fclose (Fp);
|
||||
|
||||
if (NumByte != (sizeof (UINT8) * PadSize)) {
|
||||
printf ("\nERROR: Copying data from buffer to File %s ", OutFile);
|
||||
CleanUpMemory ();
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Clean up all the memory which has been allocated so far.
|
||||
//
|
||||
CleanUpMemory ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -1,330 +0,0 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
|
||||
This software and associated documentation (if any) is furnished
|
||||
under a license and may only be used or copied in accordance
|
||||
with the terms of the license. Except as permitted by such
|
||||
license, no part of this software or documentation may be
|
||||
reproduced, stored in a retrieval system, or transmitted in any
|
||||
form or by any means without the express written consent of
|
||||
Intel Corporation.
|
||||
|
||||
|
||||
Module Name:
|
||||
|
||||
GenFdImageExe.c
|
||||
|
||||
Abstract:
|
||||
|
||||
This contains all code necessary to build the GenFdImage.exe utility.
|
||||
This utility relies heavily on the GenFdImage Lib. Definitions for both
|
||||
can be found in the GenFdImage Utility Specification, review draft.
|
||||
|
||||
--*/
|
||||
|
||||
//
|
||||
// Coded to EFI 2.0 Coding Standards
|
||||
//
|
||||
//
|
||||
// Include files
|
||||
//
|
||||
#include "GenFdImage.h"
|
||||
#include "GenFdImageExe.h"
|
||||
|
||||
VOID
|
||||
PrintUtilityInfo (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Displays the standard utility information to SDTOUT
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
printf (
|
||||
"%s, EFI 2.0 Firmware Device Image Generation Utility. ""Version %i.%i, %s.\n\n",
|
||||
UTILITY_NAME,
|
||||
UTILITY_MAJOR_VERSION,
|
||||
UTILITY_MINOR_VERSION,
|
||||
UTILITY_DATE
|
||||
);
|
||||
}
|
||||
|
||||
VOID
|
||||
PrintUsage (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Displays the utility usage syntax to STDOUT
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
printf (
|
||||
"Usage: %s -B BaseAddress -S Size -F FillByte"" [-I FvInfFileName] -O OutputFileName \n",
|
||||
UTILITY_NAME
|
||||
);
|
||||
printf (" Where:\n");
|
||||
printf ("\tBaseAddress is the starting address of the FD Image\n\n");
|
||||
printf ("\tSize is the size of the FD Image.\n\n");
|
||||
printf ("\tFillByte is the desired value of free space in the Image\n\n");
|
||||
printf ("\tFvInfFileName is the name of an FV Image description file.\n\n");
|
||||
printf ("\tOutputFileName is the desired output file name.\n\n");
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
main (
|
||||
IN INTN argc,
|
||||
IN CHAR8 **argv
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This utility uses GenFdImage.lib to build a Firmware Device Image
|
||||
which will include several Firmware Volume Images.
|
||||
|
||||
Arguments:
|
||||
|
||||
Base Address Base Address of the firmware volume..
|
||||
Size Size of the Firmware Volume
|
||||
FillByte The byte value which would be needed to pad
|
||||
between various Firmware Volumes
|
||||
FvInfFile Fv inf file
|
||||
OutputFileName The name of output file which would be created
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS No error conditions detected.
|
||||
EFI_INVALID_PARAMETER One or more of the input parameters is invalid.
|
||||
EFI_OUT_OF_RESOURCES A resource required by the utility was unavailable.
|
||||
Most commonly this will be memory allocation or
|
||||
file creation.
|
||||
EFI_LOAD_ERROR GenFvImage.lib could not be loaded.
|
||||
EFI_ABORTED Error executing the GenFvImage lib.
|
||||
|
||||
--*/
|
||||
// GC_TODO: argc - add argument and description to function comment
|
||||
// GC_TODO: argv - add argument and description to function comment
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN FvFilesCount;
|
||||
|
||||
UINT8 i;
|
||||
|
||||
UINT64 StartAddress;
|
||||
UINT64 Size;
|
||||
UINT64 FillByteVal;
|
||||
|
||||
CHAR8 **FvInfFileList;
|
||||
CHAR8 **OrgFvInfFileList;
|
||||
CHAR8 OutputFileName[_MAX_PATH];
|
||||
|
||||
EFI_STATUS Status;
|
||||
|
||||
INTN arg_counter;
|
||||
|
||||
//
|
||||
// Echo for makefile debug
|
||||
//
|
||||
printf ("\n\n");
|
||||
for (arg_counter = 0; arg_counter < argc; arg_counter++) {
|
||||
printf ("%s ", argv[arg_counter]);
|
||||
}
|
||||
|
||||
printf ("\n\n");
|
||||
|
||||
//
|
||||
// Display utility information
|
||||
//
|
||||
PrintUtilityInfo ();
|
||||
|
||||
//
|
||||
// Verify the correct number of arguments
|
||||
//
|
||||
if (argc < MIN_ARGS) {
|
||||
printf ("ERROR: missing 1 or more input arguments.\n\n");
|
||||
PrintUsage ();
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// Initialize variables
|
||||
//
|
||||
StartAddress = 0;
|
||||
Size = 0;
|
||||
FillByteVal = 0;
|
||||
FvFilesCount = 0;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (stricmp (argv[i], "-I") == 0) {
|
||||
FvFilesCount++;
|
||||
}
|
||||
}
|
||||
|
||||
FvInfFileList = malloc (sizeof (UINTN) * (FvFilesCount + 1));
|
||||
if (FvInfFileList == NULL) {
|
||||
printf ("ERROR: allocating memory for FvInfFileList in -main- function.\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
memset (FvInfFileList, 0, sizeof (UINTN) * (FvFilesCount + 1));
|
||||
|
||||
OrgFvInfFileList = FvInfFileList;
|
||||
|
||||
for (Index = 0; Index < FvFilesCount; Index++) {
|
||||
*FvInfFileList = malloc (_MAX_PATH);
|
||||
memset (*FvInfFileList, 0, _MAX_PATH);
|
||||
FvInfFileList++;
|
||||
}
|
||||
|
||||
strcpy (OutputFileName, "");
|
||||
|
||||
//
|
||||
// Parse the command line arguments
|
||||
//
|
||||
FvInfFileList = OrgFvInfFileList;
|
||||
|
||||
for (i = 1; i < argc; i += 2) {
|
||||
//
|
||||
// Make sure argument pair begin with - or /
|
||||
//
|
||||
if (argv[i][0] != '-' && argv[i][0] != '/') {
|
||||
PrintUsage ();
|
||||
printf ("ERROR: Argument pair must begin with \"-\" or \"/\"\n");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// Make sure argument specifier is only one letter
|
||||
//
|
||||
if (argv[i][2] != 0) {
|
||||
PrintUsage ();
|
||||
printf ("ERROR: Unrecognized argument \"%s\".\n", argv[i]);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// Determine argument to read
|
||||
//
|
||||
switch (argv[i][1]) {
|
||||
|
||||
case 'I':
|
||||
case 'i':
|
||||
if ((FvInfFileList != NULL) && (strlen (*FvInfFileList) == 0)) {
|
||||
strcpy (*FvInfFileList, argv[i + 1]);
|
||||
FvInfFileList++;
|
||||
} else {
|
||||
printf ("ERROR: FvInfFile Name is more than specifed.\n");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
case 'o':
|
||||
if (strlen (OutputFileName) == 0) {
|
||||
strcpy (OutputFileName, argv[i + 1]);
|
||||
} else {
|
||||
PrintUsage ();
|
||||
printf ("ERROR: OutputFileName may only be specified once.\n");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B':
|
||||
case 'b':
|
||||
Status = AsciiStringToUint64 (argv[i + 1], FALSE, &StartAddress);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Bad FD Image start address specified");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
case 's':
|
||||
Status = AsciiStringToUint64 (argv[i + 1], FALSE, &Size);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Bad FD Image size specified");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
case 'f':
|
||||
Status = AsciiStringToUint64 (argv[i + 1], FALSE, &FillByteVal);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Not a recognized Fill Byte value");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
PrintUsage ();
|
||||
printf ("ERROR: Unrecognized argument \"%s\".\n", argv[i]);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Call the GenFdImage Lib
|
||||
//
|
||||
FvInfFileList = OrgFvInfFileList;
|
||||
|
||||
Status = GenerateFdImage (
|
||||
StartAddress,
|
||||
Size,
|
||||
(UINT8) FillByteVal,
|
||||
OutputFileName,
|
||||
FvInfFileList
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
switch (Status) {
|
||||
|
||||
case EFI_INVALID_PARAMETER:
|
||||
printf ("\nERROR: Invalid parameter passed to GenFdImage lib.\n");
|
||||
break;
|
||||
|
||||
case EFI_ABORTED:
|
||||
printf ("\nERROR: Error detected while creating the file image.\n");
|
||||
break;
|
||||
|
||||
case EFI_OUT_OF_RESOURCES:
|
||||
printf ("\nERROR: GenFdImage Lib could not allocate required resources.\n");
|
||||
break;
|
||||
|
||||
case EFI_VOLUME_CORRUPTED:
|
||||
printf ("\nERROR: No base address was specified \n");
|
||||
break;
|
||||
|
||||
case EFI_LOAD_ERROR:
|
||||
printf ("\nERROR: An error occurred loading one of the required support Lib.\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("\nERROR: GenFdImage lib returned unknown status %X.\n", Status);
|
||||
break;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
|
||||
This software and associated documentation (if any) is furnished
|
||||
under a license and may only be used or copied in accordance
|
||||
with the terms of the license. Except as permitted by such
|
||||
license, no part of this software or documentation may be
|
||||
reproduced, stored in a retrieval system, or transmitted in any
|
||||
form or by any means without the express written consent of
|
||||
Intel Corporation.
|
||||
|
||||
|
||||
Module Name:
|
||||
|
||||
GenFdImageExe.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Definitions for the Boot Strap File Image generation utility.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _EFI_GEN_FD_IMAGE_EXE_H
|
||||
#define _EFI_GEN_FD_IMAGE_EXE_H
|
||||
|
||||
//
|
||||
// Utility Name
|
||||
//
|
||||
#define UTILITY_NAME "GenFdImage"
|
||||
|
||||
//
|
||||
// Utility version information
|
||||
//
|
||||
#define UTILITY_MAJOR_VERSION 0
|
||||
#define UTILITY_MINOR_VERSION 0
|
||||
#define UTILITY_DATE __DATE__
|
||||
|
||||
//
|
||||
// The maximum number of arguments accepted from the command line.
|
||||
//
|
||||
#define MIN_ARGS 10
|
||||
|
||||
//
|
||||
// The function that displays general utility information
|
||||
//
|
||||
VOID
|
||||
PrintUtilityInfo (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
//
|
||||
// The function that displays the utility usage message.
|
||||
//
|
||||
VOID
|
||||
PrintUsage (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
|
@ -1,848 +0,0 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
|
||||
This software and associated documentation (if any) is furnished
|
||||
under a license and may only be used or copied in accordance
|
||||
with the terms of the license. Except as permitted by such
|
||||
license, no part of this software or documentation may be
|
||||
reproduced, stored in a retrieval system, or transmitted in any
|
||||
form or by any means without the express written consent of
|
||||
Intel Corporation.
|
||||
|
||||
|
||||
Module Name:
|
||||
|
||||
GenFdImageLib.C
|
||||
|
||||
Abstract:
|
||||
|
||||
This file contains the functions required to generate
|
||||
the Firmware Device
|
||||
|
||||
--*/
|
||||
|
||||
//
|
||||
// Coded to EFI 2.0 Coding Standards
|
||||
//
|
||||
//
|
||||
// Include file in build
|
||||
//
|
||||
#include "GenFdImage.h"
|
||||
|
||||
//
|
||||
// Global declarations
|
||||
//
|
||||
UINTN ValidLineNum = 0;
|
||||
UINTN NumFvFiles = 0;
|
||||
|
||||
static UINT64 LastAddress = 0;
|
||||
|
||||
CHAR8 **TokenStr;
|
||||
CHAR8 **OrgStrTokPtr;
|
||||
|
||||
FDINFO *FdInfo;
|
||||
FDINFO *OrgFdInfoPtr;
|
||||
|
||||
FVINFO **FvInfo;
|
||||
FVINFO **OrgFvInfoPtr;
|
||||
|
||||
//
|
||||
// Internal Functions
|
||||
//
|
||||
INTN
|
||||
CompareItems (
|
||||
IN const VOID *Arg1,
|
||||
IN const VOID *Arg2
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function is used by qsort to sort the Fv list based on FvBaseAddress
|
||||
|
||||
Arguments:
|
||||
|
||||
Arg1
|
||||
Arg2
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
// GC_TODO: Arg1 - add argument and description to function comment
|
||||
// GC_TODO: Arg2 - add argument and description to function comment
|
||||
{
|
||||
if ((*(FVINFO **) Arg1)->FvBaseAddress > (*(FVINFO **) Arg2)->FvBaseAddress) {
|
||||
return 1;
|
||||
} else if ((*(FVINFO **) Arg1)->FvBaseAddress < (*(FVINFO **) Arg2)->FvBaseAddress) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
BuildTokenList (
|
||||
IN CHAR8 *Token
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function builds the token list in an array which will be parsed later
|
||||
|
||||
Arguments:
|
||||
|
||||
Token String,
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
strcpy (*TokenStr, Token);
|
||||
TokenStr++;
|
||||
}
|
||||
|
||||
VOID
|
||||
TrimLine (
|
||||
IN CHAR8 *Line
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function cleans up the line by removing all whitespace and
|
||||
comments.
|
||||
|
||||
Arguments:
|
||||
|
||||
Line String,
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
CHAR8 TmpLine[FILE_NAME_SIZE];
|
||||
CHAR8 c;
|
||||
CHAR8 *Ptr0;
|
||||
|
||||
UINTN i;
|
||||
UINTN j;
|
||||
|
||||
//
|
||||
// Change '#' to '//' for Comment style
|
||||
//
|
||||
// if((Ptr0=strchr(Line, '#')) != NULL) {
|
||||
//
|
||||
if ((Ptr0 = strstr (Line, "//")) != NULL) {
|
||||
Line[Ptr0 - Line] = 0;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
j = 0;
|
||||
while ((c = Line[i]) != 0) {
|
||||
if ((c != ' ') && (c != '\t') && (c != '\n')) {
|
||||
TmpLine[j++] = c;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
TmpLine[j] = 0;
|
||||
strcpy (Line, TmpLine);
|
||||
}
|
||||
|
||||
VOID
|
||||
ValidLineCount (
|
||||
IN FILE *Fp
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function calculates number of valid lines in a input file.
|
||||
|
||||
Arguments:
|
||||
|
||||
Fp Pointer to a file handle which has been opened.
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
CHAR8 Buff[FILE_NAME_SIZE];
|
||||
|
||||
while (fgets (Buff, sizeof (Buff), Fp)) {
|
||||
TrimLine (Buff);
|
||||
if (Buff[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ValidLineNum++;
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ParseInputFile (
|
||||
IN FILE *Fp
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function parses the input file and tokenizes the string
|
||||
|
||||
Arguments:
|
||||
|
||||
Fp Pointer to a file handle which has been opened.
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
CHAR8 *Token;
|
||||
CHAR8 Buff[FILE_NAME_SIZE];
|
||||
CHAR8 OrgLine[FILE_NAME_SIZE];
|
||||
CHAR8 Str[FILE_NAME_SIZE];
|
||||
CHAR8 Delimit[] = "=";
|
||||
|
||||
while (fgets (Buff, sizeof (Buff), Fp) != NULL) {
|
||||
strcpy (OrgLine, Buff);
|
||||
TrimLine (Buff);
|
||||
|
||||
if (Buff[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Token = strtok (Buff, Delimit);
|
||||
|
||||
while (Token != NULL) {
|
||||
strcpy (Str, Token);
|
||||
BuildTokenList (Str);
|
||||
Token = strtok (NULL, Delimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
InitializeComps (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function intializes the relevant global variable
|
||||
used to store the information retrieved from the INF file.
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
FdInfo = malloc (sizeof (FDINFO));
|
||||
|
||||
if (FdInfo == NULL) {
|
||||
printf ("ERROR: allocating memory (struct FDINFO) in"" function InitializeComps.\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
OrgFdInfoPtr = FdInfo;
|
||||
|
||||
FvInfo = malloc (sizeof (INTN) * NumFvFiles);
|
||||
|
||||
if (FvInfo == NULL) {
|
||||
printf ("ERROR: allocating memory (INTN * NumFvFiles) in"" function InitializeComps.\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
OrgFvInfoPtr = FvInfo;
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
*FvInfo = malloc (sizeof (FVINFO));
|
||||
|
||||
if (*FvInfo == NULL) {
|
||||
printf ("ERROR: allocating memory (FVINFO) in"" function InitializeComps.\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
memset (*FvInfo, 0, sizeof (FVINFO));
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
InitializeInFileInfo (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function intializes the relevant global variable
|
||||
used to store the information retrieved from the INF file.
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN OptionFlag;
|
||||
|
||||
UINT64 StringValue;
|
||||
|
||||
OptionFlag = 0;
|
||||
TokenStr = OrgStrTokPtr;
|
||||
|
||||
while (*TokenStr != NULL) {
|
||||
if (stricmp (*TokenStr, "[options]") == 0) {
|
||||
OptionFlag = 1;
|
||||
}
|
||||
|
||||
if (OptionFlag) {
|
||||
if (stricmp (*TokenStr, "EFI_FV_BASE_ADDRESS") == 0) {
|
||||
*TokenStr++;
|
||||
if (AsciiStringToUint64 (
|
||||
*TokenStr,
|
||||
FALSE,
|
||||
&StringValue
|
||||
) != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Cannot determine the FV base address.");
|
||||
return ;
|
||||
}
|
||||
(*FvInfo)->FvBaseAddress = StringValue;
|
||||
} else if (stricmp (*TokenStr, "EFI_FV_FILE_NAME") == 0) {
|
||||
*TokenStr++;
|
||||
strcpy ((*FvInfo)->FvFile, *TokenStr);
|
||||
}
|
||||
}
|
||||
|
||||
TokenStr++;
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
GetFvRelatedInfoFromInfFile (
|
||||
IN CHAR8 *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function reads the input file, parses it and create a list of tokens
|
||||
which are parsed and used, to intialize the data related to the Firmware
|
||||
Volume.
|
||||
|
||||
Arguments:
|
||||
|
||||
FileName FileName which needed to be read to parse data
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
|
||||
UINTN Index;
|
||||
|
||||
Fp = fopen (FileName, "r");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("Error in opening %s file\n", FileName);
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
ValidLineCount (Fp);
|
||||
|
||||
if (ValidLineNum == 0) {
|
||||
printf ("\nFile doesn't contain any valid informations");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
TokenStr = (CHAR8 **) malloc (sizeof (UINTN) * (2 * ValidLineNum));
|
||||
memset (TokenStr, 0, sizeof (UINTN) * (2 * ValidLineNum));
|
||||
OrgStrTokPtr = TokenStr;
|
||||
|
||||
for (Index = 0; Index < (2 * ValidLineNum); Index++) {
|
||||
*TokenStr = (CHAR8 *) malloc (sizeof (CHAR8) * FILE_NAME_SIZE);
|
||||
memset (*TokenStr, 0, FILE_NAME_SIZE);
|
||||
TokenStr++;
|
||||
}
|
||||
|
||||
*TokenStr = NULL;
|
||||
TokenStr = OrgStrTokPtr;
|
||||
fseek (Fp, 0L, SEEK_SET);
|
||||
|
||||
ParseInputFile (Fp);
|
||||
InitializeInFileInfo ();
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
WriteFwBinary (
|
||||
IN CHAR8 *FileName,
|
||||
IN UINT64 StartAddress,
|
||||
IN UINT64 Size,
|
||||
IN UINT8 *Buffer
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function reads the input file, parses it and creates a list of tokens
|
||||
which are parsed and used to intialize the data related to the Firmware
|
||||
Volume.
|
||||
|
||||
Arguments:
|
||||
|
||||
FileName FileName which needed to be read to parse data
|
||||
StartAddress This will set the file position.
|
||||
Size Size in bytes needed to be written
|
||||
Buffer Buffer needed to e written
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
|
||||
UINTN NumByte;
|
||||
|
||||
Fp = fopen (FileName, "a+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Error in opening file %s ", FileName);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
fseek (Fp, (UINTN) StartAddress, SEEK_SET);
|
||||
NumByte = fwrite ((VOID *) Buffer, sizeof (UINT8), (UINTN) Size, Fp);
|
||||
|
||||
//
|
||||
// Check to ensure that buffer has been copied successfully
|
||||
//
|
||||
if (NumByte != Size) {
|
||||
printf ("\nERROR: Error in copying the buffer into file");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
BuildFirmwareDeviceBinaryFromFwVolumes (
|
||||
IN UINT64 FvBaseAddress,
|
||||
IN CHAR8 *FvFileName,
|
||||
IN CHAR8 *FdFileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function reads the input file, parses it and creates a list of tokens
|
||||
which are parsed and used to intialize the data related to the Firmware
|
||||
Volume.
|
||||
|
||||
Arguments:
|
||||
|
||||
FvBaseAddress Base Address. This info is retrieved from INF file
|
||||
FvFileName InputFileName
|
||||
FdFileName Output File Name
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
FILE *Fp;
|
||||
|
||||
UINT64 FileSize;
|
||||
UINT64 NumByteRead;
|
||||
UINT64 PadByteSize;
|
||||
UINT64 BaseAddress;
|
||||
|
||||
UINTN Index;
|
||||
|
||||
UINT8 *Buffer;
|
||||
|
||||
EFI_STATUS Status;
|
||||
|
||||
static UINT64 StartAddress = 0;
|
||||
|
||||
Fp = fopen (FvFileName, "r+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Error in opening file %s", FvFileName);
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
BaseAddress = FdInfo->FdBaseAddress;
|
||||
|
||||
//
|
||||
// Check if Base Address of Firmware Volume falls below the Base Address
|
||||
// Firmware Device, if yes, then abort this process.
|
||||
//
|
||||
if (FvBaseAddress < BaseAddress) {
|
||||
printf ("\nERROR: Firmware Volume Base Address falls below Firmware ""Device Address.\n");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
//
|
||||
// Check if there are any holes between two Firmware Volumes. If any holes
|
||||
// exist, fill the hole with PadByted data.
|
||||
//
|
||||
if (FvBaseAddress > LastAddress) {
|
||||
PadByteSize = (FvBaseAddress - LastAddress);
|
||||
Buffer = malloc ((UINTN) PadByteSize);
|
||||
if (Buffer == NULL) {
|
||||
printf ("ERROR: allocating (Buffer) memory in"" function BuildFirmwareDeviceBinaryFromFwVolumes.\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < PadByteSize; Index++) {
|
||||
*Buffer = FdInfo->PadValue;
|
||||
Buffer++;
|
||||
}
|
||||
|
||||
Buffer -= PadByteSize;
|
||||
Status = WriteFwBinary (
|
||||
FdFileName,
|
||||
StartAddress,
|
||||
(UINT64) PadByteSize,
|
||||
Buffer
|
||||
);
|
||||
|
||||
if (Buffer) {
|
||||
free (Buffer);
|
||||
}
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error in writing the binary image to file");
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartAddress += PadByteSize;
|
||||
LastAddress += PadByteSize;
|
||||
}
|
||||
//
|
||||
// Proceed with next Firmware Volume updates
|
||||
//
|
||||
FileSize = _filelength (fileno (Fp));
|
||||
|
||||
if ((FvBaseAddress + FileSize) > (FdInfo->FdBaseAddress + FdInfo->FdSize)) {
|
||||
printf (
|
||||
"\nERROR:Unable to update Firmware Device. File %s is larger than \
|
||||
available space.",
|
||||
FvFileName
|
||||
);
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
Buffer = malloc ((UINTN) FileSize);
|
||||
|
||||
if (Buffer == NULL) {
|
||||
printf ("Error in allocating buffer to read specific file\n");
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
NumByteRead = fread ((VOID *) Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);
|
||||
|
||||
Status = WriteFwBinary (FdFileName, StartAddress, FileSize, Buffer);
|
||||
|
||||
if (Buffer) {
|
||||
free ((VOID *) Buffer);
|
||||
}
|
||||
|
||||
if (Fp) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error in writing the binary image to file");
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartAddress += NumByteRead;
|
||||
LastAddress += FileSize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
CleanUpMemory (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function cleans up any allocated buffer
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
if (FdInfo) {
|
||||
free (FdInfo);
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
if (FvInfo) {
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
if (*FvInfo) {
|
||||
free (*FvInfo);
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
free (FvInfo);
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
GenerateFdImage (
|
||||
IN UINT64 BaseAddress,
|
||||
IN UINT64 Size,
|
||||
IN UINT8 PadByte,
|
||||
IN CHAR8 *OutFile,
|
||||
IN CHAR8 **FileList
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This function reads the input file, parses it and creates a list of tokens
|
||||
which are parsed and used to intialize the data related to the Firmware
|
||||
Volume.
|
||||
|
||||
Arguments:
|
||||
|
||||
BaseAddress Base Address for this Firmware Device
|
||||
Size, Total Size of the Firmware Device
|
||||
PadByte Pad byte data
|
||||
OutFile Output File Name
|
||||
FileList File List pointer to INF file names.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_ABORTED - add return value to function comment
|
||||
// GC_TODO: EFI_SUCCESS - add return value to function comment
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
UINTN Index;
|
||||
UINTN PadSize;
|
||||
UINTN FileSize;
|
||||
UINTN NumByte;
|
||||
|
||||
CHAR8 **InFile;
|
||||
|
||||
FILE *Fp;
|
||||
|
||||
UINT8 *Buffer;
|
||||
|
||||
//
|
||||
// If any previous Firmware Device existed,
|
||||
// make it to 0 bytes
|
||||
//
|
||||
if ((Fp = fopen (OutFile, "w")) != NULL) {
|
||||
fclose (Fp);
|
||||
}
|
||||
|
||||
InFile = FileList;
|
||||
|
||||
while (*InFile != NULL) {
|
||||
NumFvFiles++;
|
||||
InFile++;
|
||||
}
|
||||
|
||||
InitializeComps ();
|
||||
|
||||
//
|
||||
// Restore the orginal pointers
|
||||
//
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
InFile = FileList;
|
||||
|
||||
while (*InFile != NULL) {
|
||||
strcpy ((*FvInfo)->FvInfoFile, *InFile);
|
||||
Status = GetFvRelatedInfoFromInfFile (*InFile);
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
printf ("\nERROR: Error occurred in processsing INF file");
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
InFile++;
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FdInfo->FdSize = Size;
|
||||
FdInfo->FdBaseAddress = BaseAddress;
|
||||
FdInfo->PadValue = PadByte;
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
strcpy (FdInfo->OutFileName, OutFile);
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
Status = GenerateFvImage ((*FvInfo)->FvInfoFile);
|
||||
|
||||
if (Status != EFI_SUCCESS) {
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
|
||||
FvInfo = OrgFvInfoPtr;
|
||||
|
||||
//
|
||||
// Sort the Firmware Volume information. Firmware Volume with lower
|
||||
// base addresses will be processed first and higher base address one
|
||||
// will be processed later.
|
||||
//
|
||||
qsort ((VOID *) FvInfo, NumFvFiles, sizeof (FVINFO *), CompareItems);
|
||||
|
||||
LastAddress = (*FvInfo)->FvBaseAddress;
|
||||
|
||||
for (Index = 0; Index < NumFvFiles; Index++) {
|
||||
Status = BuildFirmwareDeviceBinaryFromFwVolumes (
|
||||
(*FvInfo)->FvBaseAddress,
|
||||
(*FvInfo)->FvFile,
|
||||
FdInfo->OutFileName
|
||||
);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
CleanUpMemory ();
|
||||
return Status;
|
||||
}
|
||||
|
||||
FvInfo++;
|
||||
}
|
||||
//
|
||||
// Check if any space left after copying data from all Firmware Volumes
|
||||
// If yes, then fill those location with PadValue.
|
||||
//
|
||||
if ((FdInfo->FdBaseAddress + Size) > LastAddress) {
|
||||
|
||||
PadSize = (UINTN) ((FdInfo->FdBaseAddress + FdInfo->FdSize) - LastAddress);
|
||||
Buffer = malloc (PadSize);
|
||||
|
||||
if (Buffer == NULL) {
|
||||
printf ("\nERROR: allocating PadSize memory in function GenerateFdImage.\n");
|
||||
CleanUpMemory ();
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < PadSize; Index++) {
|
||||
*Buffer = FdInfo->PadValue;
|
||||
Buffer++;
|
||||
}
|
||||
|
||||
Buffer -= PadSize;
|
||||
|
||||
Fp = fopen (OutFile, "a+b");
|
||||
|
||||
if (Fp == NULL) {
|
||||
printf ("\nERROR:Opening file %s", OutFile);
|
||||
CleanUpMemory ();
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
FileSize = _filelength (fileno (Fp));
|
||||
fseek (Fp, FileSize, SEEK_SET);
|
||||
NumByte = fwrite (Buffer, sizeof (UINT8), PadSize, Fp);
|
||||
|
||||
if (Buffer) {
|
||||
free (Buffer);
|
||||
}
|
||||
|
||||
fclose (Fp);
|
||||
|
||||
if (NumByte != (sizeof (UINT8) * PadSize)) {
|
||||
printf ("\nERROR: Copying data from buffer to File %s ", OutFile);
|
||||
CleanUpMemory ();
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Clean up all the memory which has been allocated so far.
|
||||
//
|
||||
CleanUpMemory ();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue