Adding Additional Tools that are needed for Platform Image creation.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@198 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
2787
Tools/Source/TianoTools/FlashMap/FlashDefFile.c
Normal file
2787
Tools/Source/TianoTools/FlashMap/FlashDefFile.c
Normal file
File diff suppressed because it is too large
Load Diff
281
Tools/Source/TianoTools/FlashMap/FlashDefFile.h
Normal file
281
Tools/Source/TianoTools/FlashMap/FlashDefFile.h
Normal file
@ -0,0 +1,281 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 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:
|
||||
|
||||
FlashDefFile.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Header file for flash management utility in the Intel Platform
|
||||
Innovation Framework for EFI build environment.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _FLASH_DEF_FILE_H_
|
||||
#define _FLASH_DEF_FILE_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void
|
||||
FDFConstructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
void
|
||||
FDFDestructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFParseFile (
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateCIncludeFile (
|
||||
char *FlashDeviceName,
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateCFlashMapDataFile (
|
||||
char *FlashDeviceName,
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateAsmIncludeFile (
|
||||
char *FlashDeviceName,
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFParseFile (
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateImage (
|
||||
char *FlashDeviceName,
|
||||
char *ImageName,
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
ImageName - GC_TODO: add argument description
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateDscFile (
|
||||
char *FlashDeviceName,
|
||||
char *FileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
FileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDFCreateSymbols (
|
||||
char *FlashDeviceName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FlashDeviceName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
FDDiscover (
|
||||
char *FDFileName,
|
||||
unsigned int BaseAddr
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
FDFileName - GC_TODO: add argument description
|
||||
BaseAddr - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // #ifndef _FLASH_DEF_FILE_H_
|
745
Tools/Source/TianoTools/FlashMap/FlashMap.c
Normal file
745
Tools/Source/TianoTools/FlashMap/FlashMap.c
Normal file
@ -0,0 +1,745 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004-2005 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:
|
||||
|
||||
FlashMap.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Utility for flash management in the Intel Platform Innovation Framework
|
||||
for EFI build environment.
|
||||
|
||||
--*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "Tiano.h"
|
||||
|
||||
#ifndef INT8
|
||||
#define INT8 char
|
||||
#endif
|
||||
|
||||
#include "EfiUtilityMsgs.h"
|
||||
#include "Microcode.h"
|
||||
#include "FlashDefFile.h"
|
||||
#include "Symbols.h"
|
||||
|
||||
#define UTILITY_NAME "FlashMap"
|
||||
|
||||
typedef struct _STRING_LIST {
|
||||
struct _STRING_LIST *Next;
|
||||
char *Str;
|
||||
} STRING_LIST;
|
||||
|
||||
//
|
||||
// Keep our globals in one of these structures
|
||||
//
|
||||
static struct {
|
||||
char *CIncludeFileName;
|
||||
char *FlashDevice;
|
||||
char *FlashDeviceImage;
|
||||
char *MCIFileName;
|
||||
char *MCOFileName;
|
||||
char *ImageOutFileName;
|
||||
char *DscFileName;
|
||||
char *AsmIncludeFileName;
|
||||
char *FlashDefinitionFileName;
|
||||
char *StringReplaceInFileName;
|
||||
char *StringReplaceOutFileName;
|
||||
char *DiscoverFDImageName;
|
||||
char MicrocodePadByteValue;
|
||||
unsigned int MicrocodeAlignment;
|
||||
STRING_LIST *MCIFileNames;
|
||||
STRING_LIST *LastMCIFileNames;
|
||||
unsigned int BaseAddress;
|
||||
} mGlobals;
|
||||
|
||||
#define DEFAULT_MC_PAD_BYTE_VALUE 0xFF
|
||||
#define DEFAULT_MC_ALIGNMENT 16
|
||||
|
||||
static
|
||||
STATUS
|
||||
ProcessCommandLine (
|
||||
int argc,
|
||||
char *argv[]
|
||||
);
|
||||
|
||||
static
|
||||
STATUS
|
||||
MergeMicrocodeFiles (
|
||||
char *OutFileName,
|
||||
STRING_LIST *FileNames,
|
||||
unsigned int Alignment,
|
||||
char PadByteValue
|
||||
);
|
||||
|
||||
static
|
||||
void
|
||||
Usage (
|
||||
VOID
|
||||
);
|
||||
|
||||
int
|
||||
main (
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Parse the command line arguments and then call worker functions to do the work
|
||||
|
||||
Arguments:
|
||||
argc - number of elements in argv
|
||||
argv - array of command-line arguments
|
||||
|
||||
Returns:
|
||||
STATUS_SUCCESS - no problems encountered while processing
|
||||
STATUS_WARNING - warnings, but no errors, were encountered while processing
|
||||
STATUS_ERROR - errors were encountered while processing
|
||||
|
||||
--*/
|
||||
{
|
||||
STATUS Status;
|
||||
|
||||
SetUtilityName (UTILITY_NAME);
|
||||
Status = ProcessCommandLine (argc, argv);
|
||||
if (Status != STATUS_SUCCESS) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Check for discovery of an FD (command line option)
|
||||
//
|
||||
if (mGlobals.DiscoverFDImageName != NULL) {
|
||||
Status = FDDiscover (mGlobals.DiscoverFDImageName, mGlobals.BaseAddress);
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// If they're doing microcode file parsing, then do that
|
||||
//
|
||||
if (mGlobals.MCIFileName != NULL) {
|
||||
MicrocodeConstructor ();
|
||||
MicrocodeParseFile (mGlobals.MCIFileName, mGlobals.MCOFileName);
|
||||
MicrocodeDestructor ();
|
||||
}
|
||||
//
|
||||
// If they're doing microcode file merging, then do that now
|
||||
//
|
||||
if (mGlobals.MCIFileNames != NULL) {
|
||||
MergeMicrocodeFiles (
|
||||
mGlobals.MCOFileName,
|
||||
mGlobals.MCIFileNames,
|
||||
mGlobals.MicrocodeAlignment,
|
||||
mGlobals.MicrocodePadByteValue
|
||||
);
|
||||
}
|
||||
//
|
||||
// If using a flash definition file, then process that and return
|
||||
//
|
||||
if (mGlobals.FlashDefinitionFileName != NULL) {
|
||||
FDFConstructor ();
|
||||
SymbolsConstructor ();
|
||||
Status = FDFParseFile (mGlobals.FlashDefinitionFileName);
|
||||
if (GetUtilityStatus () != STATUS_ERROR) {
|
||||
//
|
||||
// If they want us to do a string-replace on a file, then add the symbol definitions to
|
||||
// the symbol table, and then do the string replace.
|
||||
//
|
||||
if (mGlobals.StringReplaceInFileName != NULL) {
|
||||
Status = FDFCreateSymbols (mGlobals.FlashDevice);
|
||||
Status = SymbolsFileStringsReplace (mGlobals.StringReplaceInFileName, mGlobals.StringReplaceOutFileName);
|
||||
}
|
||||
//
|
||||
// If they want us to create a .h defines file or .c flashmap data file, then do so now
|
||||
//
|
||||
if (mGlobals.CIncludeFileName != NULL) {
|
||||
Status = FDFCreateCIncludeFile (mGlobals.FlashDevice, mGlobals.CIncludeFileName);
|
||||
}
|
||||
if (mGlobals.AsmIncludeFileName != NULL) {
|
||||
Status = FDFCreateAsmIncludeFile (mGlobals.FlashDevice, mGlobals.AsmIncludeFileName);
|
||||
}
|
||||
//
|
||||
// If they want us to create an image, do that now
|
||||
//
|
||||
if (mGlobals.ImageOutFileName != NULL) {
|
||||
Status = FDFCreateImage (mGlobals.FlashDevice, mGlobals.FlashDeviceImage, mGlobals.ImageOutFileName);
|
||||
}
|
||||
//
|
||||
// If they want to create an output DSC file, do that now
|
||||
//
|
||||
if (mGlobals.DscFileName != NULL) {
|
||||
Status = FDFCreateDscFile (mGlobals.FlashDevice, mGlobals.DscFileName);
|
||||
}
|
||||
}
|
||||
SymbolsDestructor ();
|
||||
FDFDestructor ();
|
||||
}
|
||||
Done:
|
||||
//
|
||||
// Free up memory
|
||||
//
|
||||
while (mGlobals.MCIFileNames != NULL) {
|
||||
mGlobals.LastMCIFileNames = mGlobals.MCIFileNames->Next;
|
||||
_free (mGlobals.MCIFileNames);
|
||||
mGlobals.MCIFileNames = mGlobals.LastMCIFileNames;
|
||||
}
|
||||
return GetUtilityStatus ();
|
||||
}
|
||||
|
||||
static
|
||||
STATUS
|
||||
MergeMicrocodeFiles (
|
||||
char *OutFileName,
|
||||
STRING_LIST *FileNames,
|
||||
unsigned int Alignment,
|
||||
char PadByteValue
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Merge binary microcode files into a single file, taking into consideration
|
||||
the alignment and pad value.
|
||||
|
||||
Arguments:
|
||||
|
||||
OutFileName - name of the output file to create
|
||||
FileNames - linked list of input microcode files to merge
|
||||
Alignment - alignment for each microcode file in the output image
|
||||
PadByteValue - value to use when padding to meet alignment requirements
|
||||
|
||||
Returns:
|
||||
|
||||
STATUS_SUCCESS - merge completed successfully or with acceptable warnings
|
||||
STATUS_ERROR - merge failed, output file not created
|
||||
|
||||
--*/
|
||||
{
|
||||
long FileSize;
|
||||
long TotalFileSize;
|
||||
FILE *InFptr;
|
||||
FILE *OutFptr;
|
||||
char *Buffer;
|
||||
STATUS Status;
|
||||
|
||||
//
|
||||
// Open the output file
|
||||
//
|
||||
if ((OutFptr = fopen (OutFileName, "wb")) == NULL) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to open output file for writing");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// Walk the list of files
|
||||
//
|
||||
Status = STATUS_ERROR;
|
||||
Buffer = NULL;
|
||||
InFptr = NULL;
|
||||
TotalFileSize = 0;
|
||||
while (FileNames != NULL) {
|
||||
//
|
||||
// Open the file, determine the size, then read it in and write
|
||||
// it back out.
|
||||
//
|
||||
if ((InFptr = fopen (FileNames->Str, "rb")) == NULL) {
|
||||
Error (NULL, 0, 0, FileNames->Str, "failed to open input file for reading");
|
||||
goto Done;
|
||||
}
|
||||
fseek (InFptr, 0, SEEK_END);
|
||||
FileSize = ftell (InFptr);
|
||||
fseek (InFptr, 0, SEEK_SET);
|
||||
if (FileSize != 0) {
|
||||
Buffer = (char *) _malloc (FileSize);
|
||||
if (Buffer == NULL) {
|
||||
Error (NULL, 0, 0, "memory allocation failure", NULL);
|
||||
goto Done;
|
||||
}
|
||||
if (fread (Buffer, FileSize, 1, InFptr) != 1) {
|
||||
Error (NULL, 0, 0, FileNames->Str, "failed to read file contents");
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Align
|
||||
//
|
||||
if (Alignment != 0) {
|
||||
while ((TotalFileSize % Alignment) != 0) {
|
||||
if (fwrite (&PadByteValue, 1, 1, OutFptr) != 1) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to write pad bytes to output file");
|
||||
goto Done;
|
||||
}
|
||||
TotalFileSize++;
|
||||
}
|
||||
}
|
||||
TotalFileSize += FileSize;
|
||||
if (fwrite (Buffer, FileSize, 1, OutFptr) != 1) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to write to output file");
|
||||
goto Done;
|
||||
}
|
||||
_free (Buffer);
|
||||
Buffer = NULL;
|
||||
} else {
|
||||
Warning (NULL, 0, 0, FileNames->Str, "0-size file encountered");
|
||||
}
|
||||
fclose (InFptr);
|
||||
InFptr = NULL;
|
||||
FileNames = FileNames->Next;
|
||||
}
|
||||
Status = STATUS_SUCCESS;
|
||||
Done:
|
||||
fclose (OutFptr);
|
||||
if (InFptr != NULL) {
|
||||
fclose (InFptr);
|
||||
}
|
||||
if (Buffer != NULL) {
|
||||
_free (Buffer);
|
||||
}
|
||||
if (Status == STATUS_ERROR) {
|
||||
remove (OutFileName);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
static
|
||||
STATUS
|
||||
ProcessCommandLine (
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Process the command line arguments
|
||||
|
||||
Arguments:
|
||||
argc - Standard C entry point arguments
|
||||
argv[] - Standard C entry point arguments
|
||||
|
||||
Returns:
|
||||
STATUS_SUCCESS - no problems encountered while processing
|
||||
STATUS_WARNING - warnings, but no errors, were encountered while processing
|
||||
STATUS_ERROR - errors were encountered while processing
|
||||
|
||||
--*/
|
||||
{
|
||||
int ThingsToDo;
|
||||
unsigned int Temp;
|
||||
STRING_LIST *Str;
|
||||
//
|
||||
// Skip program name arg, process others
|
||||
//
|
||||
argc--;
|
||||
argv++;
|
||||
if (argc == 0) {
|
||||
Usage ();
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// Clear out our globals, then start walking the arguments
|
||||
//
|
||||
memset ((void *) &mGlobals, 0, sizeof (mGlobals));
|
||||
mGlobals.MicrocodePadByteValue = DEFAULT_MC_PAD_BYTE_VALUE;
|
||||
mGlobals.MicrocodeAlignment = DEFAULT_MC_ALIGNMENT;
|
||||
ThingsToDo = 0;
|
||||
while (argc > 0) {
|
||||
if (strcmp (argv[0], "-?") == 0) {
|
||||
Usage ();
|
||||
return STATUS_ERROR;
|
||||
} else if (strcmp (argv[0], "-hfile") == 0) {
|
||||
//
|
||||
// -hfile FileName
|
||||
//
|
||||
// Used to specify an output C #include file to create that contains
|
||||
// #define statements for all the flashmap region offsets and sizes.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an output file name");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.CIncludeFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-flashdevice") == 0) {
|
||||
//
|
||||
// -flashdevice FLASH_DEVICE_NAME
|
||||
//
|
||||
// Used to select which flash device definition to operate on.
|
||||
// Check for additional argument
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires a flash device name to use");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.FlashDevice = argv[0];
|
||||
} else if (strcmp (argv[0], "-mco") == 0) {
|
||||
//
|
||||
// -mco OutFileName
|
||||
//
|
||||
// Used to specify a microcode output binary file to create.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, (INT8 *) argv[0], (INT8 *) "option requires an output microcode file name to create");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.MCOFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-asmincfile") == 0) {
|
||||
//
|
||||
// -asmincfile FileName
|
||||
//
|
||||
// Used to specify the name of the output assembly include file that contains
|
||||
// equates for the flash region addresses and sizes.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an output ASM include file name to create");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.AsmIncludeFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-mci") == 0) {
|
||||
//
|
||||
// -mci FileName
|
||||
//
|
||||
// Used to specify an input microcode text file to parse.
|
||||
// Check for additional argument
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, (INT8 *) argv[0], (INT8 *) "option requires an input microcode text file name to parse");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.MCIFileName = argv[0];
|
||||
} else if (strcmp (argv[0], "-flashdeviceimage") == 0) {
|
||||
//
|
||||
// -flashdeviceimage FlashDeviceImage
|
||||
//
|
||||
// Used to specify which flash device image definition from the input flash definition file
|
||||
// to create.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires the name of a flash definition image to use");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.FlashDeviceImage = argv[0];
|
||||
} else if (strcmp (argv[0], "-imageout") == 0) {
|
||||
//
|
||||
// -imageout FileName
|
||||
//
|
||||
// Used to specify the name of the output FD image file to create.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an output image filename to create");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.ImageOutFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-dsc") == 0) {
|
||||
//
|
||||
// -dsc FileName
|
||||
//
|
||||
// Used to specify the name of the output DSC file to create.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an output DSC filename to create");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.DscFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-fdf") == 0) {
|
||||
//
|
||||
// -fdf FileName
|
||||
//
|
||||
// Used to specify the name of the input flash definition file.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an input flash definition file name");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.FlashDefinitionFileName = argv[0];
|
||||
} else if (strcmp (argv[0], "-discover") == 0) {
|
||||
//
|
||||
// -discover FDFileName
|
||||
//
|
||||
// Debug functionality used to scan an existing FD image, trying to find
|
||||
// firmware volumes at 64K boundaries.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an input FD image file name");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.DiscoverFDImageName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else if (strcmp (argv[0], "-baseaddr") == 0) {
|
||||
//
|
||||
// -baseaddr Addr
|
||||
//
|
||||
// Used to specify a base address when doing a discover of an FD image.
|
||||
// Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires a base address");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
if (tolower (argv[0][1]) == 'x') {
|
||||
sscanf (argv[0] + 2, "%x", &mGlobals.BaseAddress);
|
||||
} else {
|
||||
sscanf (argv[0], "%d", &mGlobals.BaseAddress);
|
||||
}
|
||||
} else if (strcmp (argv[0], "-padvalue") == 0) {
|
||||
//
|
||||
// -padvalue Value
|
||||
//
|
||||
// Used to specify the value to pad with when aligning data while
|
||||
// creating an FD image. Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires a byte value");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
if (tolower (argv[0][1]) == 'x') {
|
||||
sscanf (argv[0] + 2, "%x", &Temp);
|
||||
mGlobals.MicrocodePadByteValue = (char) Temp;
|
||||
} else {
|
||||
sscanf (argv[0], "%d", &Temp);
|
||||
mGlobals.MicrocodePadByteValue = (char) Temp;
|
||||
}
|
||||
} else if (strcmp (argv[0], "-align") == 0) {
|
||||
//
|
||||
// -align Alignment
|
||||
//
|
||||
// Used to specify how each data file is aligned in the region
|
||||
// when creating an FD image. Check for additional argument.
|
||||
//
|
||||
if (argc < 2) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires an alignment");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
if (tolower (argv[0][1]) == 'x') {
|
||||
sscanf (argv[0] + 2, "%x", &mGlobals.MicrocodeAlignment);
|
||||
} else {
|
||||
sscanf (argv[0], "%d", &mGlobals.MicrocodeAlignment);
|
||||
}
|
||||
} else if (strcmp (argv[0], "-mcmerge") == 0) {
|
||||
//
|
||||
// -mcmerge FileName(s)
|
||||
//
|
||||
// Used to concatenate multiple microde binary files. Can specify
|
||||
// multiple file names with the one -mcmerge flag. Check for additional argument.
|
||||
//
|
||||
if ((argc < 2) || (argv[1][0] == '-')) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires one or more input file names");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// Take input files until another option or end of list
|
||||
//
|
||||
ThingsToDo++;
|
||||
while ((argc > 1) && (argv[1][0] != '-')) {
|
||||
Str = (STRING_LIST *) _malloc (sizeof (STRING_LIST));
|
||||
if (Str == NULL) {
|
||||
Error (NULL, 0, 0, "memory allocation failure", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
memset (Str, 0, sizeof (STRING_LIST));
|
||||
Str->Str = argv[1];
|
||||
if (mGlobals.MCIFileNames == NULL) {
|
||||
mGlobals.MCIFileNames = Str;
|
||||
} else {
|
||||
mGlobals.LastMCIFileNames->Next = Str;
|
||||
}
|
||||
mGlobals.LastMCIFileNames = Str;
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
} else if (strcmp (argv[0], "-strsub") == 0) {
|
||||
//
|
||||
// -strsub SrcFile DestFile
|
||||
//
|
||||
// Used to perform string substitutions on a file, writing the result to a new
|
||||
// file. Check for two additional arguments.
|
||||
//
|
||||
if (argc < 3) {
|
||||
Error (NULL, 0, 0, argv[0], "option requires input and output file names for string substitution");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.StringReplaceInFileName = argv[0];
|
||||
argc--;
|
||||
argv++;
|
||||
mGlobals.StringReplaceOutFileName = argv[0];
|
||||
ThingsToDo++;
|
||||
} else {
|
||||
Error (NULL, 0, 0, argv[0], "invalid option");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
//
|
||||
// If no outputs requested, then report an error
|
||||
//
|
||||
if (ThingsToDo == 0) {
|
||||
Error (NULL, 0, 0, "nothing to do", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// If they want an asm file, #include file, or C file to be created, then they have to specify a
|
||||
// flash device name and flash definition file name.
|
||||
//
|
||||
if ((mGlobals.CIncludeFileName != NULL) &&
|
||||
((mGlobals.FlashDevice == NULL) || (mGlobals.FlashDefinitionFileName == NULL))) {
|
||||
Error (NULL, 0, 0, "must specify -flashdevice and -fdf with -hfile", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if ((mGlobals.AsmIncludeFileName != NULL) &&
|
||||
((mGlobals.FlashDevice == NULL) || (mGlobals.FlashDefinitionFileName == NULL))) {
|
||||
Error (NULL, 0, 0, "must specify -flashdevice and -fdf with -asmincfile", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// If they want a dsc file to be created, then they have to specify a
|
||||
// flash device name and a flash definition file name
|
||||
//
|
||||
if (mGlobals.DscFileName != NULL) {
|
||||
if (mGlobals.FlashDevice == NULL) {
|
||||
Error (NULL, 0, 0, "must specify -flashdevice with -dsc", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if (mGlobals.FlashDefinitionFileName == NULL) {
|
||||
Error (NULL, 0, 0, "must specify -fdf with -dsc", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
}
|
||||
//
|
||||
// If they specified an output microcode file name, then they have to specify an input
|
||||
// file name, and vice versa.
|
||||
//
|
||||
if ((mGlobals.MCIFileName != NULL) && (mGlobals.MCOFileName == NULL)) {
|
||||
Error (NULL, 0, 0, "must specify output microcode file name", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if ((mGlobals.MCOFileName != NULL) && (mGlobals.MCIFileName == NULL) && (mGlobals.MCIFileNames == NULL)) {
|
||||
Error (NULL, 0, 0, "must specify input microcode file name", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// If doing merge, then have to specify output file name
|
||||
//
|
||||
if ((mGlobals.MCIFileNames != NULL) && (mGlobals.MCOFileName == NULL)) {
|
||||
Error (NULL, 0, 0, "must specify output microcode file name", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// If they want an output image to be created, then they have to specify
|
||||
// the flash device and the flash device image to use.
|
||||
//
|
||||
if (mGlobals.ImageOutFileName != NULL) {
|
||||
if (mGlobals.FlashDevice == NULL) {
|
||||
Error (NULL, 0, 0, "must specify -flashdevice with -imageout", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if (mGlobals.FlashDeviceImage == NULL) {
|
||||
Error (NULL, 0, 0, "must specify -flashdeviceimage with -imageout", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if (mGlobals.FlashDefinitionFileName == NULL) {
|
||||
Error (NULL, 0, 0, "must specify -c or -fdf with -imageout", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
Usage (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Print utility command line help
|
||||
|
||||
Arguments:
|
||||
None
|
||||
|
||||
Returns:
|
||||
NA
|
||||
|
||||
--*/
|
||||
{
|
||||
int i;
|
||||
char *Msg[] = {
|
||||
"Usage: FlashTool -fdf FlashDefFile -flashdevice FlashDevice",
|
||||
" -flashdeviceimage FlashDeviceImage -mci MCIFile -mco MCOFile",
|
||||
" -discover FDImage -dsc DscFile -asmincfile AsmIncFile",
|
||||
" -imageOut ImageOutFile -hfile HFile -strsub InStrFile OutStrFile",
|
||||
" -baseaddr BaseAddr -align Alignment -padvalue PadValue",
|
||||
" -mcmerge MCIFile(s)",
|
||||
" where",
|
||||
" FlashDefFile - input Flash Definition File",
|
||||
" FlashDevice - flash device to use (from flash definition file)",
|
||||
" FlashDeviceImage - flash device image to use (from flash definition file)",
|
||||
" MCIFile - input microcode file to parse",
|
||||
" MCOFile - output binary microcode image to create from MCIFile",
|
||||
" HFile - output #include file to create",
|
||||
" FDImage - name of input FDImage file to scan",
|
||||
" ImageOutFile - output image file to create",
|
||||
" DscFile - output DSC file to create",
|
||||
" AsmIncFile - output ASM include file to create",
|
||||
" InStrFile - input file to replace symbol names, writing result to OutStrFile",
|
||||
" BaseAddr - base address of FDImage (used with -discover)",
|
||||
" Alignment - alignment to use when merging microcode binaries",
|
||||
" PadValue - byte value to use as pad value when aligning microcode binaries",
|
||||
" MCIFile(s) - one or more microcode binary files to merge/concatenate",
|
||||
"",
|
||||
NULL
|
||||
};
|
||||
for (i = 0; Msg[i] != NULL; i++) {
|
||||
fprintf (stdout, "%s\n", Msg[i]);
|
||||
}
|
||||
}
|
81
Tools/Source/TianoTools/FlashMap/Makefile
Normal file
81
Tools/Source/TianoTools/FlashMap/Makefile
Normal file
@ -0,0 +1,81 @@
|
||||
#/*++
|
||||
#
|
||||
# Copyright (c) 2004 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:
|
||||
#
|
||||
# Makefile
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# makefile for building the FlashMap utility
|
||||
#
|
||||
#--*/
|
||||
|
||||
#
|
||||
# Make sure environmental variable EFI_SOURCE is set
|
||||
#
|
||||
!IFNDEF EFI_SOURCE
|
||||
!ERROR EFI_SOURCE environmental variable not set
|
||||
!ENDIF
|
||||
|
||||
|
||||
!INCLUDE PlatformTools.env
|
||||
|
||||
INCLUDE_PATHS = -I $(TIANO_TOOLS_SOURCE)\Common
|
||||
|
||||
#
|
||||
# Target specific information
|
||||
#
|
||||
TARGET_NAME = FlashMap
|
||||
TARGET_SRC_DIR = $(TIANO_TOOLS_SOURCE)\$(TARGET_NAME)
|
||||
TARGET_EXE = $(TIANO_TOOLS_OUTPUT)\FlashMap.exe
|
||||
LIBS = $(LIBS) "$(TIANO_TOOLS_OUTPUT)\Common.lib"
|
||||
|
||||
#
|
||||
# Build targets
|
||||
#
|
||||
all: $(TARGET_EXE)
|
||||
|
||||
OBJECTS = $(TIANO_TOOLS_OUTPUT)\FlashMap.obj \
|
||||
$(TIANO_TOOLS_OUTPUT)\FlashDefFile.obj \
|
||||
$(TIANO_TOOLS_OUTPUT)\Symbols.obj \
|
||||
$(TIANO_TOOLS_OUTPUT)\Microcode.obj
|
||||
|
||||
# $(TIANO_TOOLS_OUTPUT)\TrackMallocFree.obj
|
||||
|
||||
#C_FLAGS = $(C_FLAGS) /D TRACK_MALLOC_FREE
|
||||
C_FLAGS = $(C_FLAGS) /D _malloc=malloc /D _free=free
|
||||
|
||||
#
|
||||
# Compile each source file
|
||||
#
|
||||
$(TIANO_TOOLS_OUTPUT)\FlashMap.obj : $(TARGET_SRC_DIR)\FlashMap.c $(TARGET_SRC_DIR)\Symbols.h $(INC_DEPS)
|
||||
$(CC) $(C_FLAGS) $(INCLUDE_PATHS) $(TARGET_SRC_DIR)\FlashMap.c /Fo$@
|
||||
|
||||
$(TIANO_TOOLS_OUTPUT)\Symbols.obj : $(TARGET_SRC_DIR)\Symbols.c $(INC_DEPS)
|
||||
$(CC) $(C_FLAGS) $(INCLUDE_PATHS) $(TARGET_SRC_DIR)\Symbols.c /Fo$@
|
||||
|
||||
$(TIANO_TOOLS_OUTPUT)\Microcode.obj : $(TARGET_SRC_DIR)\Microcode.c $(INC_DEPS)
|
||||
$(CC) $(C_FLAGS) $(INC) $(TARGET_SRC_DIR)\Microcode.c /Fo$@
|
||||
|
||||
$(TIANO_TOOLS_OUTPUT)\FlashDefFile.obj : $(TARGET_SRC_DIR)\FlashDefFile.c $(INC_DEPS)
|
||||
$(CC) $(C_FLAGS) $(INC) $(TARGET_SRC_DIR)\FlashDefFile.c /Fo$@
|
||||
|
||||
$(TIANO_TOOLS_OUTPUT)\TrackMallocFree.obj : $(TARGET_SRC_DIR)\TrackMallocFree.c $(INC_DEPS)
|
||||
$(CC) $(C_FLAGS) $(INC) $(TARGET_SRC_DIR)\TrackMallocFree.c /Fo$@
|
||||
|
||||
#
|
||||
# Link the object files together to create the final executable
|
||||
#
|
||||
$(TARGET_EXE) : $(OBJECTS) $(LIBS)
|
||||
$(LINK) $(MSVS_LINK_LIBPATHS) $(L_FLAGS) $(LIBS) /out:$(TARGET_EXE) $(OBJECTS)
|
||||
|
306
Tools/Source/TianoTools/FlashMap/Microcode.c
Normal file
306
Tools/Source/TianoTools/FlashMap/Microcode.c
Normal file
@ -0,0 +1,306 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 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:
|
||||
|
||||
Microcode.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Utility for working with microcode patch files in the Intel
|
||||
Platform Innovation Framework for EFI build environment.
|
||||
|
||||
--*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h> // for memset()
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h> // for malloc()
|
||||
#define INT8 char
|
||||
#define UINT32 unsigned int
|
||||
|
||||
#include "EfiUtilityMsgs.h"
|
||||
#include "Microcode.h"
|
||||
|
||||
#define MAX_LINE_LEN 256
|
||||
|
||||
//
|
||||
// Structure definition for a microcode header
|
||||
//
|
||||
typedef struct {
|
||||
unsigned int HeaderVersion;
|
||||
unsigned int PatchId;
|
||||
unsigned int Date;
|
||||
unsigned int CpuId;
|
||||
unsigned int Checksum;
|
||||
unsigned int LoaderVersion;
|
||||
unsigned int PlatformId;
|
||||
unsigned int DataSize; // if 0, then TotalSize = 2048, and TotalSize field is invalid
|
||||
unsigned int TotalSize; // number of bytes
|
||||
unsigned int Reserved[3];
|
||||
} MICROCODE_IMAGE_HEADER;
|
||||
|
||||
static
|
||||
STATUS
|
||||
MicrocodeReadData (
|
||||
FILE *InFptr,
|
||||
unsigned int *Data
|
||||
);
|
||||
|
||||
void
|
||||
MicrocodeConstructor (
|
||||
void
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Constructor of module Microcode
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
MicrocodeDestructor (
|
||||
void
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Destructor of module Microcode
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
}
|
||||
|
||||
static
|
||||
STATUS
|
||||
MicrocodeReadData (
|
||||
FILE *InFptr,
|
||||
unsigned int *Data
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Read a 32-bit microcode data value from a text file and convert to raw binary form.
|
||||
|
||||
Arguments:
|
||||
InFptr - file pointer to input text file
|
||||
Data - pointer to where to return the data parsed
|
||||
|
||||
Returns:
|
||||
STATUS_SUCCESS - no errors or warnings, Data contains valid information
|
||||
STATUS_ERROR - errors were encountered
|
||||
|
||||
--*/
|
||||
{
|
||||
char Line[MAX_LINE_LEN];
|
||||
char *cptr;
|
||||
|
||||
Line[MAX_LINE_LEN - 1] = 0;
|
||||
*Data = 0;
|
||||
if (fgets (Line, MAX_LINE_LEN, InFptr) == NULL) {
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// If it was a binary file, then it may have overwritten our null terminator
|
||||
//
|
||||
if (Line[MAX_LINE_LEN - 1] != 0) {
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// Look for
|
||||
// dd 000000001h ; comment
|
||||
// dd XXXXXXXX
|
||||
// DD XXXXXXXXX
|
||||
// DD XXXXXXXXX
|
||||
//
|
||||
for (cptr = Line; *cptr && isspace(*cptr); cptr++) {
|
||||
}
|
||||
if ((tolower(cptr[0]) == 'd') && (tolower(cptr[1]) == 'd') && isspace (cptr[2])) {
|
||||
//
|
||||
// Skip blanks and look for a hex digit
|
||||
//
|
||||
cptr += 3;
|
||||
for (; *cptr && isspace(*cptr); cptr++) {
|
||||
}
|
||||
if (isxdigit (*cptr)) {
|
||||
if (sscanf (cptr, "%X", Data) != 1) {
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
|
||||
STATUS
|
||||
MicrocodeParseFile (
|
||||
char *InFileName,
|
||||
char *OutFileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Parse a microcode text file, and write the binary results to an output file.
|
||||
|
||||
Arguments:
|
||||
InFileName - input text file to parse
|
||||
OutFileName - output file to write raw binary data from parsed input file
|
||||
|
||||
Returns:
|
||||
STATUS_SUCCESS - no errors or warnings
|
||||
STATUS_ERROR - errors were encountered
|
||||
|
||||
--*/
|
||||
{
|
||||
FILE *InFptr;
|
||||
FILE *OutFptr;
|
||||
STATUS Status;
|
||||
MICROCODE_IMAGE_HEADER *Header;
|
||||
unsigned int Size;
|
||||
unsigned int Size2;
|
||||
unsigned int Data;
|
||||
unsigned int Checksum;
|
||||
char *Buffer;
|
||||
char *Ptr;
|
||||
unsigned int TotalSize;
|
||||
|
||||
Status = STATUS_ERROR;
|
||||
InFptr = NULL;
|
||||
OutFptr = NULL;
|
||||
Buffer = NULL;
|
||||
//
|
||||
// Open the input text file
|
||||
//
|
||||
if ((InFptr = fopen (InFileName, "r")) == NULL) {
|
||||
Error (NULL, 0, 0, InFileName, "failed to open input microcode file for reading");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
//
|
||||
// Make two passes on the input file. The first pass is to determine how
|
||||
// much data is in the file so we can allocate a working buffer. Then
|
||||
// we'll allocate a buffer and re-read the file into the buffer for processing.
|
||||
//
|
||||
Size = 0;
|
||||
do {
|
||||
Status = MicrocodeReadData (InFptr, &Data);
|
||||
if (Status == STATUS_SUCCESS) {
|
||||
Size += sizeof (Data);
|
||||
}
|
||||
} while (Status == STATUS_SUCCESS);
|
||||
//
|
||||
// Error if no data.
|
||||
//
|
||||
if (Size == 0) {
|
||||
Error (NULL, 0, 0, InFileName, "no parse-able data found in file");
|
||||
goto Done;
|
||||
}
|
||||
if (Size < sizeof (MICROCODE_IMAGE_HEADER)) {
|
||||
Error (NULL, 0, 0, InFileName, "amount of parse-able data is insufficient to contain a microcode header");
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Allocate a buffer for the data
|
||||
//
|
||||
Buffer = (char *) _malloc (Size);
|
||||
if (Buffer == NULL) {
|
||||
Error (NULL, 0, 0, "memory allocation failure", NULL);
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Re-read the file, storing the data into our buffer
|
||||
//
|
||||
fseek (InFptr, 0, SEEK_SET);
|
||||
Ptr = Buffer;
|
||||
do {
|
||||
Status = MicrocodeReadData (InFptr, &Data);
|
||||
if (Status == STATUS_SUCCESS) {
|
||||
*(unsigned int *) Ptr = Data;
|
||||
Ptr += sizeof (Data);
|
||||
}
|
||||
} while (Status == STATUS_SUCCESS);
|
||||
//
|
||||
// Can't do much checking on the header because, per the spec, the
|
||||
// DataSize field may be 0, which means DataSize = 2000 and TotalSize = 2K,
|
||||
// and the TotalSize field is invalid (actually missing). Thus we can't
|
||||
// even verify the Reserved fields are 0.
|
||||
//
|
||||
Header = (MICROCODE_IMAGE_HEADER *) Buffer;
|
||||
if (Header->DataSize == 0) {
|
||||
TotalSize = 2048;
|
||||
} else {
|
||||
TotalSize = Header->TotalSize;
|
||||
}
|
||||
if (TotalSize != Size) {
|
||||
Error (NULL, 0, 0, InFileName, "file contents do not contain expected TotalSize 0x%04X", TotalSize);
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Checksum the contents
|
||||
//
|
||||
Ptr = Buffer;
|
||||
Checksum = 0;
|
||||
Size2 = 0;
|
||||
while (Size2 < Size) {
|
||||
Checksum += *(unsigned int *) Ptr;
|
||||
Ptr += 4;
|
||||
Size2 += 4;
|
||||
}
|
||||
if (Checksum != 0) {
|
||||
Error (NULL, 0, 0, InFileName, "checksum failed on file contents");
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Open the output file and write the buffer contents
|
||||
//
|
||||
if ((OutFptr = fopen (OutFileName, "wb")) == NULL) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to open output microcode file for writing");
|
||||
goto Done;
|
||||
}
|
||||
if (fwrite (Buffer, Size, 1, OutFptr) != 1) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to write microcode data to output file");
|
||||
goto Done;
|
||||
}
|
||||
Status = STATUS_SUCCESS;
|
||||
Done:
|
||||
if (Buffer != NULL) {
|
||||
free (Buffer);
|
||||
}
|
||||
if (InFptr != NULL) {
|
||||
fclose (InFptr);
|
||||
}
|
||||
if (OutFptr != NULL) {
|
||||
fclose (OutFptr);
|
||||
if (Status == STATUS_ERROR) {
|
||||
remove (OutFileName);
|
||||
}
|
||||
}
|
||||
return Status;
|
||||
}
|
87
Tools/Source/TianoTools/FlashMap/Microcode.h
Normal file
87
Tools/Source/TianoTools/FlashMap/Microcode.h
Normal file
@ -0,0 +1,87 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 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:
|
||||
|
||||
Microcode.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Header file for flash management utility in the Intel Platform
|
||||
Innovation Framework for EFI build environment.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _MICROCODE_H_
|
||||
#define _MICROCODE_H_
|
||||
|
||||
void
|
||||
MicrocodeConstructor (
|
||||
void
|
||||
);
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Constructor of module Microcode
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
|
||||
void
|
||||
MicrocodeDestructor (
|
||||
void
|
||||
);
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Destructor of module Microcode
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
|
||||
STATUS
|
||||
MicrocodeParseFile (
|
||||
char *InFileName,
|
||||
char *OutFileName
|
||||
);
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Parse a microcode text file, and write the binary results to an output file.
|
||||
|
||||
Arguments:
|
||||
InFileName - input text file to parse
|
||||
OutFileName - output file to write raw binary data from parsed input file
|
||||
|
||||
Returns:
|
||||
STATUS_SUCCESS - no errors or warnings
|
||||
STATUS_ERROR - errors were encountered
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
#endif // #ifndef _MICROCODE_H_
|
647
Tools/Source/TianoTools/FlashMap/Symbols.c
Normal file
647
Tools/Source/TianoTools/FlashMap/Symbols.c
Normal file
@ -0,0 +1,647 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 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:
|
||||
|
||||
Symbol.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Class-like implementation for a symbol table.
|
||||
|
||||
--*/
|
||||
|
||||
// GC_TODO: fix comment to set correct module name: Symbols.c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
//
|
||||
// for isspace()
|
||||
//
|
||||
#include <ctype.h>
|
||||
|
||||
#include "Tiano.h"
|
||||
#include "EfiUtilityMsgs.h"
|
||||
#include "Symbols.h"
|
||||
|
||||
#define MAX_LINE_LEN 512
|
||||
|
||||
//
|
||||
// Linked list to keep track of all symbols
|
||||
//
|
||||
typedef struct _SYMBOL {
|
||||
struct _SYMBOL *Next;
|
||||
int Type;
|
||||
char *Name;
|
||||
char *Value;
|
||||
} SYMBOL;
|
||||
|
||||
static
|
||||
SYMBOL *
|
||||
FreeSymbols (
|
||||
SYMBOL *Syms
|
||||
);
|
||||
|
||||
static
|
||||
int
|
||||
ExpandMacros (
|
||||
char *SourceLine,
|
||||
char *DestLine,
|
||||
int LineLen
|
||||
);
|
||||
|
||||
static SYMBOL *mSymbolTable = NULL;
|
||||
|
||||
void
|
||||
SymbolsConstructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
{
|
||||
SymbolsDestructor ();
|
||||
}
|
||||
|
||||
void
|
||||
SymbolsDestructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
{
|
||||
mSymbolTable = FreeSymbols (mSymbolTable);
|
||||
}
|
||||
|
||||
char *
|
||||
GetSymbolValue (
|
||||
char *SymbolName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Look up a symbol in our symbol table.
|
||||
|
||||
Arguments:
|
||||
|
||||
SymbolName
|
||||
|
||||
Returns:
|
||||
|
||||
Pointer to the value of the symbol if found
|
||||
NULL if the symbol is not found
|
||||
|
||||
--*/
|
||||
// GC_TODO: SymbolName - add argument and description to function comment
|
||||
{
|
||||
SYMBOL *Symbol;
|
||||
//
|
||||
// Walk the symbol table
|
||||
//
|
||||
Symbol = mSymbolTable;
|
||||
while (Symbol) {
|
||||
if (stricmp (SymbolName, Symbol->Name) == 0) {
|
||||
return Symbol->Value;
|
||||
}
|
||||
|
||||
Symbol = Symbol->Next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
SymbolAdd (
|
||||
char *Name,
|
||||
char *Value,
|
||||
int Mode
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Add a symbol name/value to the symbol table
|
||||
|
||||
Arguments:
|
||||
|
||||
Name - name of symbol to add
|
||||
Value - value of symbol to add
|
||||
Mode - currrently unused
|
||||
|
||||
Returns:
|
||||
|
||||
Length of symbol added.
|
||||
|
||||
Notes:
|
||||
If Value == NULL, then this routine will assume that the Name field
|
||||
looks something like "MySymName = MySymValue", and will try to parse
|
||||
it that way and add the symbol name/pair from the string.
|
||||
|
||||
--*/
|
||||
{
|
||||
SYMBOL *Symbol;
|
||||
|
||||
SYMBOL *NewSymbol;
|
||||
int Len;
|
||||
char *Start;
|
||||
char *Cptr;
|
||||
char CSave;
|
||||
char *SaveCptr;
|
||||
|
||||
Len = 0;
|
||||
SaveCptr = NULL;
|
||||
CSave = 0;
|
||||
//
|
||||
// If value pointer is null, then they passed us a line something like:
|
||||
// varname = value, or simply var =
|
||||
//
|
||||
if (Value == NULL) {
|
||||
Start = Name;
|
||||
while (*Name && isspace (*Name)) {
|
||||
Name++;
|
||||
}
|
||||
|
||||
if (Name == NULL) {
|
||||
return -1;
|
||||
}
|
||||
//
|
||||
// Find the end of the name. Either space or a '='.
|
||||
//
|
||||
for (Value = Name; *Value && !isspace (*Value) && (*Value != '='); Value++)
|
||||
;
|
||||
if (Value == NULL) {
|
||||
return -1;
|
||||
}
|
||||
//
|
||||
// Look for the '='
|
||||
//
|
||||
Cptr = Value;
|
||||
while (*Value && (*Value != '=')) {
|
||||
Value++;
|
||||
}
|
||||
|
||||
if (Value == NULL) {
|
||||
return -1;
|
||||
}
|
||||
//
|
||||
// Now truncate the name
|
||||
//
|
||||
*Cptr = 0;
|
||||
//
|
||||
// Skip over the = and then any spaces
|
||||
//
|
||||
Value++;
|
||||
while (*Value && isspace (*Value)) {
|
||||
Value++;
|
||||
|
||||
}
|
||||
//
|
||||
// Find end of string, checking for quoted string
|
||||
//
|
||||
if (*Value == '\"') {
|
||||
Value++;
|
||||
for (Cptr = Value; *Cptr && *Cptr != '\"'; Cptr++)
|
||||
;
|
||||
} else {
|
||||
for (Cptr = Value; *Cptr && !isspace (*Cptr); Cptr++)
|
||||
;
|
||||
}
|
||||
//
|
||||
// Null terminate the value string
|
||||
//
|
||||
CSave = *Cptr;
|
||||
SaveCptr = Cptr;
|
||||
*Cptr = 0;
|
||||
Len = (int) (Cptr - Start);
|
||||
}
|
||||
//
|
||||
// We now have a symbol name and a value. Look for an existing variable
|
||||
// and overwrite it.
|
||||
//
|
||||
Symbol = mSymbolTable;
|
||||
while (Symbol) {
|
||||
//
|
||||
// Check for symbol name match
|
||||
//
|
||||
if (stricmp (Name, Symbol->Name) == 0) {
|
||||
_free (Symbol->Value);
|
||||
Symbol->Value = (char *) _malloc (strlen (Value) + 1);
|
||||
if (Symbol->Value == NULL) {
|
||||
Error (NULL, 0, 0, NULL, "failed to allocate memory");
|
||||
return -1;
|
||||
}
|
||||
|
||||
strcpy (Symbol->Value, Value);
|
||||
//
|
||||
// If value == "NULL", then make it a 0-length string
|
||||
//
|
||||
if (stricmp (Symbol->Value, "NULL") == 0) {
|
||||
Symbol->Value[0] = 0;
|
||||
}
|
||||
|
||||
return Len;
|
||||
}
|
||||
|
||||
Symbol = Symbol->Next;
|
||||
}
|
||||
//
|
||||
// Does not exist, create a new one
|
||||
//
|
||||
NewSymbol = (SYMBOL *) _malloc (sizeof (SYMBOL));
|
||||
if (NewSymbol == NULL) {
|
||||
Error (NULL, 0, 0, NULL, "memory allocation failure");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset ((char *) NewSymbol, 0, sizeof (SYMBOL));
|
||||
NewSymbol->Name = (char *) _malloc (strlen (Name) + 1);
|
||||
if (NewSymbol->Name == NULL) {
|
||||
Error (NULL, 0, 0, NULL, "memory allocation failure");
|
||||
_free (NewSymbol);
|
||||
return -1;
|
||||
}
|
||||
|
||||
NewSymbol->Value = (char *) _malloc (strlen (Value) + 1);
|
||||
if (NewSymbol->Value == NULL) {
|
||||
Error (NULL, 0, 0, NULL, "memory allocation failure");
|
||||
_free (NewSymbol->Name);
|
||||
_free (NewSymbol);
|
||||
return -1;
|
||||
}
|
||||
|
||||
strcpy (NewSymbol->Name, Name);
|
||||
strcpy (NewSymbol->Value, Value);
|
||||
//
|
||||
// Remove trailing spaces
|
||||
//
|
||||
Cptr = NewSymbol->Value + strlen (NewSymbol->Value) - 1;
|
||||
while (Cptr > NewSymbol->Value) {
|
||||
if (isspace (*Cptr)) {
|
||||
*Cptr = 0;
|
||||
Cptr--;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Add it to the head of the list.
|
||||
//
|
||||
NewSymbol->Next = mSymbolTable;
|
||||
mSymbolTable = NewSymbol;
|
||||
//
|
||||
// If value == "NULL", then make it a 0-length string
|
||||
//
|
||||
if (stricmp (NewSymbol->Value, "NULL") == 0) {
|
||||
NewSymbol->Value[0] = 0;
|
||||
}
|
||||
//
|
||||
// Restore the terminator we inserted if they passed in var=value
|
||||
//
|
||||
if (SaveCptr != NULL) {
|
||||
*SaveCptr = CSave;
|
||||
}
|
||||
_free (NewSymbol->Value);
|
||||
_free (NewSymbol->Name);
|
||||
_free (NewSymbol);
|
||||
return Len;
|
||||
}
|
||||
|
||||
static
|
||||
STATUS
|
||||
RemoveSymbol (
|
||||
char *Name,
|
||||
char SymbolType
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Remove a symbol name/value from the symbol table
|
||||
|
||||
Arguments:
|
||||
|
||||
Name - name of symbol to remove
|
||||
SymbolType - type of symbol to remove
|
||||
|
||||
Returns:
|
||||
|
||||
STATUS_SUCCESS - matching symbol found and removed
|
||||
STATUS_ERROR - matching symbol not found in symbol table
|
||||
|
||||
--*/
|
||||
{
|
||||
SYMBOL *Symbol;
|
||||
|
||||
SYMBOL *PrevSymbol;
|
||||
|
||||
PrevSymbol = NULL;
|
||||
Symbol = mSymbolTable;
|
||||
//
|
||||
// Walk the linked list of symbols in the symbol table looking
|
||||
// for a match of both symbol name and type.
|
||||
//
|
||||
while (Symbol) {
|
||||
if ((stricmp (Name, Symbol->Name) == 0) && (Symbol->Type & SymbolType)) {
|
||||
//
|
||||
// If the symbol has a value associated with it, free the memory
|
||||
// allocated for the value.
|
||||
// Then free the memory allocated for the symbols string name.
|
||||
//
|
||||
if (Symbol->Value) {
|
||||
_free (Symbol->Value);
|
||||
}
|
||||
|
||||
_free (Symbol->Name);
|
||||
//
|
||||
// Link the previous symbol to the next symbol to effectively
|
||||
// remove this symbol from the linked list.
|
||||
//
|
||||
if (PrevSymbol) {
|
||||
PrevSymbol->Next = Symbol->Next;
|
||||
} else {
|
||||
mSymbolTable = Symbol->Next;
|
||||
}
|
||||
|
||||
_free (Symbol);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
PrevSymbol = Symbol;
|
||||
Symbol = Symbol->Next;
|
||||
}
|
||||
|
||||
return STATUS_WARNING;
|
||||
}
|
||||
|
||||
static
|
||||
SYMBOL *
|
||||
FreeSymbols (
|
||||
SYMBOL *Syms
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
Syms - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
{
|
||||
SYMBOL *Next;
|
||||
while (Syms) {
|
||||
if (Syms->Name != NULL) {
|
||||
_free (Syms->Name);
|
||||
}
|
||||
|
||||
if (Syms->Value != NULL) {
|
||||
_free (Syms->Value);
|
||||
}
|
||||
|
||||
Next = Syms->Next;
|
||||
_free (Syms);
|
||||
Syms = Next;
|
||||
}
|
||||
|
||||
return Syms;
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
ExpandMacros (
|
||||
char *SourceLine,
|
||||
char *DestLine,
|
||||
int LineLen
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Given a line of text, replace all variables of format $(NAME) with values
|
||||
from our symbol table.
|
||||
|
||||
Arguments:
|
||||
|
||||
SourceLine - input line of text to do symbol replacements on
|
||||
DestLine - on output, SourceLine with symbols replaced
|
||||
LineLen - length of DestLine, so we don't exceed its allocated length
|
||||
|
||||
Returns:
|
||||
|
||||
STATUS_SUCCESS - no problems encountered
|
||||
STATUS_WARNING - missing closing parenthesis on a symbol reference in SourceLine
|
||||
STATUS_ERROR - memory allocation failure
|
||||
|
||||
--*/
|
||||
{
|
||||
static int NestDepth = 0;
|
||||
char *FromPtr;
|
||||
char *ToPtr;
|
||||
char *SaveStart;
|
||||
char *Cptr;
|
||||
char *value;
|
||||
int Expanded;
|
||||
int ExpandedCount;
|
||||
INT8 *LocalDestLine;
|
||||
STATUS Status;
|
||||
int LocalLineLen;
|
||||
|
||||
NestDepth++;
|
||||
Status = STATUS_SUCCESS;
|
||||
LocalDestLine = (char *) _malloc (LineLen);
|
||||
if (LocalDestLine == NULL) {
|
||||
Error (__FILE__, __LINE__, 0, "memory allocation failed", NULL);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
|
||||
FromPtr = SourceLine;
|
||||
ToPtr = LocalDestLine;
|
||||
//
|
||||
// Walk the entire line, replacing $(MACRO_NAME).
|
||||
//
|
||||
LocalLineLen = LineLen;
|
||||
ExpandedCount = 0;
|
||||
while (*FromPtr && (LocalLineLen > 0)) {
|
||||
if ((*FromPtr == '$') && (*(FromPtr + 1) == '(')) {
|
||||
//
|
||||
// Save the start in case it's undefined, in which case we copy it as-is.
|
||||
//
|
||||
SaveStart = FromPtr;
|
||||
Expanded = 0;
|
||||
//
|
||||
// Macro expansion time. Find the end (no spaces allowed)
|
||||
//
|
||||
FromPtr += 2;
|
||||
for (Cptr = FromPtr; *Cptr && (*Cptr != ')'); Cptr++)
|
||||
;
|
||||
if (*Cptr) {
|
||||
//
|
||||
// Truncate the string at the closing parenthesis for ease-of-use.
|
||||
// Then copy the string directly to the destination line in case we don't find
|
||||
// a definition for it.
|
||||
//
|
||||
*Cptr = 0;
|
||||
strcpy (ToPtr, SaveStart);
|
||||
if ((value = GetSymbolValue (FromPtr)) != NULL) {
|
||||
strcpy (ToPtr, value);
|
||||
LocalLineLen -= strlen (value);
|
||||
ToPtr += strlen (value);
|
||||
Expanded = 1;
|
||||
ExpandedCount++;
|
||||
}
|
||||
|
||||
if (!Expanded) {
|
||||
//
|
||||
// Restore closing parenthesis, and advance to next character
|
||||
//
|
||||
*Cptr = ')';
|
||||
FromPtr = SaveStart + 1;
|
||||
ToPtr++;
|
||||
} else {
|
||||
FromPtr = Cptr + 1;
|
||||
}
|
||||
} else {
|
||||
Error (NULL, 0, 0, SourceLine, "missing closing parenthesis on macro");
|
||||
strcpy (ToPtr, FromPtr);
|
||||
Status = STATUS_WARNING;
|
||||
goto Done;
|
||||
}
|
||||
} else {
|
||||
*ToPtr = *FromPtr;
|
||||
FromPtr++;
|
||||
ToPtr++;
|
||||
LocalLineLen--;
|
||||
}
|
||||
}
|
||||
|
||||
if (*FromPtr == 0) {
|
||||
*ToPtr = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// If we expanded at least one string successfully, then make a recursive call to try again.
|
||||
//
|
||||
if ((ExpandedCount != 0) && (Status == STATUS_SUCCESS) && (NestDepth < 10)) {
|
||||
Status = ExpandMacros (LocalDestLine, DestLine, LineLen);
|
||||
_free (LocalDestLine);
|
||||
NestDepth = 0;
|
||||
return Status;
|
||||
}
|
||||
|
||||
Done:
|
||||
if (Status != STATUS_ERROR) {
|
||||
strcpy (DestLine, LocalDestLine);
|
||||
}
|
||||
|
||||
NestDepth = 0;
|
||||
_free (LocalDestLine);
|
||||
return Status;
|
||||
}
|
||||
|
||||
STATUS
|
||||
SymbolsFileStringsReplace (
|
||||
char *InFileName,
|
||||
char *OutFileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Given input and output file names, read in the input file, replace variable
|
||||
references of format $(NAME) with appropriate values from our symbol table,
|
||||
and write the result out to the output file.
|
||||
|
||||
Arguments:
|
||||
|
||||
InFileName - name of input text file to replace variable references
|
||||
OutFileName - name of output text file to write results to
|
||||
|
||||
Returns:
|
||||
|
||||
STATUS_SUCCESS - no problems encountered
|
||||
STATUS_ERROR - failed to open input or output file
|
||||
|
||||
--*/
|
||||
{
|
||||
STATUS Status;
|
||||
FILE *InFptr;
|
||||
FILE *OutFptr;
|
||||
char Line[MAX_LINE_LEN];
|
||||
char OutLine[MAX_LINE_LEN];
|
||||
|
||||
Status = STATUS_ERROR;
|
||||
//
|
||||
// Open input and output files
|
||||
//
|
||||
InFptr = NULL;
|
||||
OutFptr = NULL;
|
||||
if ((InFptr = fopen (InFileName, "r")) == NULL) {
|
||||
Error (NULL, 0, 0, InFileName, "failed to open input file for reading");
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if ((OutFptr = fopen (OutFileName, "w")) == NULL) {
|
||||
Error (NULL, 0, 0, OutFileName, "failed to open output file for writing");
|
||||
goto Done;
|
||||
}
|
||||
//
|
||||
// Read lines from input file until done
|
||||
//
|
||||
while (fgets (Line, sizeof (Line), InFptr) != NULL) {
|
||||
ExpandMacros (Line, OutLine, sizeof (OutLine));
|
||||
fprintf (OutFptr, OutLine);
|
||||
}
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
Done:
|
||||
if (InFptr != NULL) {
|
||||
fclose (InFptr);
|
||||
}
|
||||
|
||||
if (OutFptr != NULL) {
|
||||
fclose (OutFptr);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
125
Tools/Source/TianoTools/FlashMap/Symbols.h
Normal file
125
Tools/Source/TianoTools/FlashMap/Symbols.h
Normal file
@ -0,0 +1,125 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 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:
|
||||
|
||||
Symbols.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Defines and prototypes for a class-like symbol table service.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _SYMBOLS_H_
|
||||
#define _SYMBOLS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
int
|
||||
SymbolAdd (
|
||||
char *Name,
|
||||
char *Value,
|
||||
int Mode
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
Name - GC_TODO: add argument description
|
||||
Value - GC_TODO: add argument description
|
||||
Mode - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
STATUS
|
||||
SymbolsFileStringsReplace (
|
||||
char *InFileName,
|
||||
char *OutFileName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
InFileName - GC_TODO: add argument description
|
||||
OutFileName - GC_TODO: add argument description
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
void
|
||||
SymbolsConstructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
void
|
||||
SymbolsDestructor (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
GC_TODO: Add function description
|
||||
|
||||
Arguments:
|
||||
|
||||
None
|
||||
|
||||
Returns:
|
||||
|
||||
GC_TODO: add return values
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // #ifndef _SYMBOLS_H_
|
Reference in New Issue
Block a user