mirror of https://github.com/acidanthera/audk.git
633 lines
14 KiB
C
633 lines
14 KiB
C
|
/*++
|
||
|
|
||
|
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:
|
||
|
|
||
|
GenBsfImage.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains the relevant declarations required
|
||
|
to generate Boot Strap File
|
||
|
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// Module Coded to EFI 2.0 Coding Conventions
|
||
|
//
|
||
|
#ifndef _EFI_GEN_BSF_IMAGE_H
|
||
|
#define _EFI_GEN_BSF_IMAGE_H
|
||
|
|
||
|
//
|
||
|
// External Files Referenced
|
||
|
//
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "assert.h"
|
||
|
// #include "TianoCommon.h"
|
||
|
#include "Common/FirmwareFileSystem.h"
|
||
|
#include "Common/FirmwareVolumeHeader.h"
|
||
|
#include "ParseInf.h"
|
||
|
|
||
|
//
|
||
|
// Internal Constants
|
||
|
//
|
||
|
#define EFI_IPF_VTF1_GUID \
|
||
|
{ \
|
||
|
0xfa371c9b, 0x5a86, 0x4198, 0xab, 0xc2, 0xed, 0x3f, 0xaa, 0xce, 0xb0, 0x8b \
|
||
|
};
|
||
|
|
||
|
#define EFI_IPF_VTF2_GUID \
|
||
|
{ \
|
||
|
0x624a0d5a, 0x315f, 0x40b6, 0xa6, 0x33, 0xe5, 0xf7, 0xde, 0x58, 0x20, 0xa0 \
|
||
|
};
|
||
|
|
||
|
#define EFI_IA32_BOOT_STRAP_GUID \
|
||
|
{ \
|
||
|
0xd4260a8d, 0x356, 0x4f45, 0x85, 0xe9, 0xad, 0x1d, 0x79, 0x22, 0x79, 0xf0 \
|
||
|
};
|
||
|
|
||
|
#define CV_N_TYPE(a,b) (UINT8)(((UINT8)a << 7) + (UINT8)b) // Keeps the CV and Type in same byte field
|
||
|
#define MAKE_VERSION(a,b) (UINT16)(((UINT16)a << 8) + (UINT16)b)
|
||
|
|
||
|
#define FILE_NAME_SIZE 256
|
||
|
#define COMPONENT_NAME_SIZE 128
|
||
|
#define BSF_INPUT_FILE "BSF.INF"
|
||
|
#define BSF_OUTPUT_FILE "Bsf.RAW"
|
||
|
#define BSF_SYM_FILE "Bsf.SYM"
|
||
|
#define FIT_SIGNATURE "_FIT_ "
|
||
|
|
||
|
//
|
||
|
// This is IA32 seccore
|
||
|
//
|
||
|
#define COMP_TYPE_SECCORE 0x0F
|
||
|
|
||
|
//
|
||
|
//Fit Type Definition
|
||
|
//
|
||
|
#define COMP_TYPE_FIT_HEADER 0x00
|
||
|
#define COMP_TYPE_FIT_PAL_B 0x01
|
||
|
|
||
|
//
|
||
|
// This is generic PAL_A
|
||
|
//
|
||
|
#define COMP_TYPE_FIT_PAL_A 0x0F
|
||
|
#define COMP_TYPE_FIT_PEICORE 0x10
|
||
|
#define COMP_TYPE_FIT_AUTOSCAN 0x30
|
||
|
#define COMP_TYPE_FIT_FV_BOOT 0x7E
|
||
|
|
||
|
//
|
||
|
//This is processor Specific PAL_A
|
||
|
//
|
||
|
#define COMP_TYPE_FIT_PAL_A_SPECIFIC 0x0E
|
||
|
#define COMP_TYPE_FIT_UNUSED 0x7F
|
||
|
|
||
|
#define FIT_TYPE_MASK 0x7F
|
||
|
#define CHECKSUM_BIT_MASK 0x80
|
||
|
|
||
|
//
|
||
|
// IPF processor address is cached bit
|
||
|
//
|
||
|
#define IPF_CACHE_BIT 0x8000000000000000
|
||
|
|
||
|
//
|
||
|
// Size definition to calculate the location from top of address for
|
||
|
// each component
|
||
|
//
|
||
|
#define SIZE_IA32_RESET_VECT 0x10 // 16 Bytes
|
||
|
#define SIZE_SALE_ENTRY_POINT 0x08 // 8 Byte
|
||
|
#define SIZE_FIT_TABLE_ADD 0x08 // 8 Byte
|
||
|
#define SIZE_FIT_TABLE_PAL_A 0x10
|
||
|
#define SIZE_RESERVED 0x10
|
||
|
|
||
|
|
||
|
#define SIZE_TO_OFFSET_PAL_A_END (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + \
|
||
|
SIZE_FIT_TABLE_ADD + SIZE_FIT_TABLE_PAL_A + \
|
||
|
SIZE_RESERVED)
|
||
|
#define SIZE_TO_PAL_A_FIT (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + \
|
||
|
SIZE_FIT_TABLE_ADD + SIZE_FIT_TABLE_PAL_A)
|
||
|
|
||
|
#define SIZE_OF_PAL_HEADER 0x40 //PAL has 64 byte header
|
||
|
|
||
|
//
|
||
|
// Utility Name
|
||
|
//
|
||
|
#define UTILITY_NAME "GenBsfImage"
|
||
|
|
||
|
//
|
||
|
// 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 ONE_BSF_ARGS 5
|
||
|
#define TWO_BSF_ARGS 9
|
||
|
|
||
|
//
|
||
|
// The number of IA32 bsf arguments accepted from the command line.
|
||
|
//
|
||
|
#define IA32_ARGS 3
|
||
|
|
||
|
#define IA32_SOFT_FIT "IA32BsfAddress.inf"
|
||
|
|
||
|
//
|
||
|
// Internal Data Structure
|
||
|
//
|
||
|
typedef enum _LOC_TYPE
|
||
|
{
|
||
|
NONE, // In case there is - INF file
|
||
|
FIRST_VTF, // First VTF
|
||
|
SECOND_VTF, // Outside BSF
|
||
|
} LOC_TYPE;
|
||
|
|
||
|
typedef struct _PARSED_BSF_INFO {
|
||
|
CHAR8 CompName[COMPONENT_NAME_SIZE];
|
||
|
LOC_TYPE LocationType;
|
||
|
UINT8 CompType;
|
||
|
UINT8 MajorVer;
|
||
|
UINT8 MinorVer;
|
||
|
UINT8 CheckSumRequired;
|
||
|
BOOLEAN VersionPresent; // If it is TRUE, then, Version is in INF file
|
||
|
BOOLEAN PreferredSize;
|
||
|
BOOLEAN PreferredAddress;
|
||
|
CHAR8 CompBinName[FILE_NAME_SIZE];
|
||
|
CHAR8 CompSymName[FILE_NAME_SIZE];
|
||
|
UINTN CompSize;
|
||
|
UINT64 CompPreferredAddress;
|
||
|
UINT32 Align;
|
||
|
|
||
|
//
|
||
|
// Fixed - warning C4133: '=' : incompatible types - from 'struct _ParsedBsfInfo *' to 'struct _PARSED_BSF_INFO *'
|
||
|
// Fixed - warning C4133: '=' : incompatible types - from 'struct _ParsedBsfInfo *' to 'struct _PARSED_BSF_INFO *'
|
||
|
// Fixed - warning C4133: '=' : incompatible types - from 'struct _ParsedBsfInfo *' to 'struct _PARSED_BSF_INFO *'
|
||
|
// Fixed - warning C4133: '=' : incompatible types - from 'struct _ParsedBsfInfo *' to 'struct _PARSED_BSF_INFO *'
|
||
|
//
|
||
|
struct _PARSED_BSF_INFO *NextBsfInfo;
|
||
|
} PARSED_BSF_INFO;
|
||
|
|
||
|
#pragma pack (1)
|
||
|
typedef struct {
|
||
|
UINT64 CompAddress;
|
||
|
UINT32 CompSize;
|
||
|
UINT16 CompVersion;
|
||
|
UINT8 CvAndType;
|
||
|
UINT8 CheckSum;
|
||
|
} FIT_TABLE;
|
||
|
#pragma pack ()
|
||
|
|
||
|
//
|
||
|
// The function that displays general utility information
|
||
|
//
|
||
|
VOID
|
||
|
PrintUtilityInfo (
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Displays the standard utility information to SDTOUT
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
//
|
||
|
// The function that displays the utility usage message.
|
||
|
//
|
||
|
VOID
|
||
|
PrintUsage (
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Displays the utility usage syntax to STDOUT
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
//
|
||
|
// Other Function Prototype Declarations
|
||
|
//
|
||
|
|
||
|
EFI_STATUS
|
||
|
UpdateBsfBuffer(
|
||
|
IN UINT64 StartAddress,
|
||
|
IN UINT8 *Buffer,
|
||
|
IN UINT64 DataSize,
|
||
|
IN LOC_TYPE LocType
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Update the Firmware Volume Buffer with requested buffer data
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
StartAddress - StartAddress in buffer. This number will automatically
|
||
|
point to right address in buffer where data needed
|
||
|
to be updated.
|
||
|
Buffer - Buffer pointer from data will be copied to memory mapped buffer.
|
||
|
DataSize - Size of the data needed to be copied.
|
||
|
LocType - The type of the BSF
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_ABORTED - The input parameter is error
|
||
|
EFI_SUCCESS - The function completed successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
UpdateSymFile (
|
||
|
IN UINT64 BaseAddress,
|
||
|
IN CHAR8 *DestFileName,
|
||
|
IN CHAR8 *SourceFileName
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function adds the SYM tokens in the source file to the destination file.
|
||
|
The SYM tokens are updated to reflect the base address.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BaseAddress - The base address for the new SYM tokens.
|
||
|
DestFileName - The destination file.
|
||
|
SourceFileName - The source file.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_SUCCESS - The function completed successfully.
|
||
|
EFI_INVALID_PARAMETER - One of the input parameters was invalid.
|
||
|
EFI_ABORTED - An error occurred.
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
CalculateFitTableChecksum (
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function will perform byte checksum on the FIT table, if the the checksum required
|
||
|
field is set to CheckSum required. If the checksum is not required then checksum byte
|
||
|
will have value as 0;.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
NONE
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status - Value returned by call to CalculateChecksum8 ()
|
||
|
EFI_SUCCESS - The function completed successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
GenerateBsfImage (
|
||
|
IN UINT64 StartAddress1,
|
||
|
IN UINT64 Size1,
|
||
|
IN UINT64 StartAddress2,
|
||
|
IN UINT64 Size2
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This is the main function which will be called from application.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
StartAddress1 - The start address of the first BSF
|
||
|
Size1 - The size of the first BSF
|
||
|
StartAddress2 - The start address of the second BSF
|
||
|
Size2 - The size of the second BSF
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_OUT_OF_RESOURCES - Can not allocate memory
|
||
|
The return value can be any of the values
|
||
|
returned by the calls to following functions:
|
||
|
GetBsfRelatedInfoFromInfFile
|
||
|
ProcessAndCreateBsf
|
||
|
UpdateIA32ResetVector
|
||
|
UpdateFfsHeader
|
||
|
WriteBsfBinary
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
PeimFixupInFitTable (
|
||
|
IN UINT64 StartAddress
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function is an entry point to fixup SAL-E entry point.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
StartAddress - StartAddress for PEIM.....
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_SUCCESS - The function completed successfully
|
||
|
EFI_ABORTED - Error Opening File
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
Generate32BsfImage (
|
||
|
IN UINT64 BootFileStartAddress
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This is the main IA32 function which will be called from application.
|
||
|
(Now this tool is not used for IA32 platform, if it will be used in future,
|
||
|
the relative functions need to be updated, the updating can refer to IPF
|
||
|
functions)
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BootFileStartAddress - Top Address of Boot File
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
The return value can be any of the values
|
||
|
returned by the calls to following functions:
|
||
|
Get32BsfRelatedInfoFromInfFile
|
||
|
CreateBsfBuffer
|
||
|
ProcessAndCreate32Bsf
|
||
|
Update32FfsHeader
|
||
|
WriteBsfBinary
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
GetTotal32BsfSize(
|
||
|
IN UINT32 *BsfSize
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function calculates total size for IA32 BSF which would be needed to create
|
||
|
the buffer. This will be done using Passed Info link list and looking for the
|
||
|
size of the components which belong to BSF. The addtional file header is accounted.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BSFSize - Pointer to the size of IA32 BSF
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_ABORTED - Returned due to one of the following resons:
|
||
|
(a) Error Opening File
|
||
|
EFI_SUCCESS - The fuction completes successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
ProcessAndCreate32Bsf (
|
||
|
IN UINT64 Size
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function process the link list created during INF file parsing
|
||
|
and create component in IA32 BSF
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Size - Size of the Firmware Volume of which, this BSF belongs to.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_UNSUPPORTED - Unknown component type
|
||
|
EFI_SUCCESS - The function completed successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
CreateAndUpdateSeccore (
|
||
|
IN PARSED_BSF_INFO *BsfInfo
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function reads the binary file for seccore and update them
|
||
|
in IA32 BSF Buffer
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BsfInfo - Pointer to Parsed Info
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_ABORTED - Due to one of the following reasons:
|
||
|
(a)Error Opening File
|
||
|
(b)The PAL_A Size is more than specified size status
|
||
|
One of the values mentioned below returned from
|
||
|
call to UpdateSymFile
|
||
|
EFI_SUCCESS - The function completed successfully.
|
||
|
EFI_INVALID_PARAMETER - One of the input parameters was invalid.
|
||
|
EFI_ABORTED - An error occurred.UpdateSymFile
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
CreateAndUpdate32Component (
|
||
|
IN PARSED_BSF_INFO *BsfInfo
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function reads the binary file for each components. Add it at aligned address.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BsfInfo - Pointer to Parsed Info
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_SUCCESS - The function completed successful
|
||
|
EFI_ABORTED - Aborted due to one of the many reasons like:
|
||
|
(a) Component Size greater than the specified size.
|
||
|
(b) Error opening files.
|
||
|
EFI_INVALID_PARAMETER - Value returned from call to UpdateEntryPoint()
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
Update32FfsHeader(
|
||
|
IN UINT32 BsfSize
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Update the Firmware Volume Buffer with requested buffer data
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BsfSize - Size of the IA32 BSF
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_SUCCESS - The function completed successfully
|
||
|
EFI_INVALID_PARAMETER - The Ffs File Header Pointer is NULL
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
Get32BsfRelatedInfoFromInfFile (
|
||
|
IN CHAR8 *FileName
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine 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 IA32 BSF
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
FileName FileName which needed to be read to parse data
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_ABORTED Error in opening file
|
||
|
EFI_INVALID_PARAMETER File doesn't contain any valid informations
|
||
|
EFI_OUT_OF_RESOURCES Malloc Failed
|
||
|
EFI_SUCCESS The function completed successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
VOID
|
||
|
Initialize32InFileInfo (
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function intializes the relevant global variable which is being
|
||
|
used to store the information retrieved from IA32 INF file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
NONE
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
NONE
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
VOID
|
||
|
ParseAndUpdate32Components (
|
||
|
IN PARSED_BSF_INFO *BsfInfo
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function intializes the relevant global variable which is being
|
||
|
used to store the information retrieved from INF file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BsfInfo - A pointer to the BSF Info Structure
|
||
|
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
Write32SoftFit(
|
||
|
IN CHAR8 *FileName,
|
||
|
IN PARSED_BSF_INFO *BsfInfo
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Write IA32 Firmware Volume component address from memory to a file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
FileName Output File Name which needed to be created/
|
||
|
BsfInfo Parsed info link
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_ABORTED - Returned due to one of the following resons:
|
||
|
(a) Error Opening File
|
||
|
(b) Failing to copy buffers
|
||
|
EFI_SUCCESS - The fuction completes successfully
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
#endif
|