/*++ | |
Copyright (c) 1999 - 2007 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 0x8000000000000000ULL | |
// | |
// 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 1 | |
#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 |