+++ /dev/null
-/*++\r
-\r
-Copyright (c) 1999 - 2006 Intel Corporation. All rights reserved\r
-This software and associated documentation (if any) is furnished\r
-under a license and may only be used or copied in accordance\r
-with the terms of the license. Except as permitted by such\r
-license, no part of this software or documentation may be\r
-reproduced, stored in a retrieval system, or transmitted in any\r
-form or by any means without the express written consent of\r
-Intel Corporation.\r
-\r
-\r
-Module Name:\r
-\r
- GenBsfFixup.c\r
-\r
-Abstract:\r
-\r
- Utility to Fixup the SEC component for IA32. This is an \r
- interim tool in place of the full GenBsfImage support for \r
- IA32.\r
- This tool supports the Synch3 update\r
-\r
---*/\r
-\r
-#include "BaseTypes.h"\r
-#include "UefiBaseTypes.h"\r
-#include "EfiImage.h"\r
-#include "FirmwareVolumeHeader.h"\r
-#include "FirmwareVolumeImageFormat.h"\r
-#include "ParseInf.h"\r
-#include "CommonLib.h"\r
-#include "FirmwareFileSystem.h"\r
-#include "FvLib.h"\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <assert.h>\r
-\r
-//\r
-// BugBug -- this port to the new FFS is really weird.\r
-// A lot of the file-header stuff has been ported, but\r
-// not the section information.\r
-//\r
-\r
-#define UTILITY_NAME "GenBsfFixup"\r
-#define UTILITY_MAJOR_VERSION 0\r
-#define UTILITY_MINOR_VERSION 1\r
-\r
-UINT32 gFixup;\r
-\r
-UINT32\r
-GetOccupiedSize (\r
- IN UINT32 ActualSize,\r
- IN UINT32 Alignment\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
- ActualSize - GC_TODO: add argument description\r
- Alignment - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
- GC_TODO: add return values\r
-\r
---*/\r
-{\r
- UINT32 OccupiedSize;\r
-\r
- OccupiedSize = ActualSize;\r
- while ((OccupiedSize & (Alignment - 1)) != 0) {\r
- OccupiedSize++;\r
- }\r
-\r
- return OccupiedSize;\r
-}\r
-\r
-static\r
-void\r
-Version (\r
- VOID\r
- )\r
-{\r
- printf ("%s v%d.%d -EDK Utility to Fixup the SEC component for IA32.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
- printf ("Copyright (c) 1999-2006 Intel Corporation. All rights reserved.\n");\r
-}\r
-\r
-\r
-VOID\r
-Usage (\r
- VOID\r
- )\r
-{\r
- Version();\r
- printf ("\nUsage: " UTILITY_NAME " FvVolumeImageFile AddressOfFvInMemory OffsetOfFixup OutputFileName \n");\r
-}\r
-\r
-int\r
-ReadHeader (\r
- FILE *In,\r
- UINT32 *FvSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Reads in Firmware Volume information from the volume header file.\r
-\r
-Arguments:\r
-\r
- In: Firmware Volume header file to read from\r
- FvSize: Size of Firmware Volume\r
-\r
-Returns:\r
-\r
- int: Number of bytes read\r
-\r
---*/\r
-{\r
- EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;\r
- EFI_FV_BLOCK_MAP_ENTRY BlockMap;\r
- INT32 SigTemp[2];\r
- INT32 Invert;\r
- INT32 bytesread;\r
- UINT32 size;\r
-\r
- size = 0;\r
- Invert = 0;\r
- bytesread = 0;\r
-\r
- if (In == NULL) {\r
- printf ("Error: Input file is NULL.\n");\r
- return -1;\r
- }\r
-\r
- fread (&VolumeHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, In);\r
- bytesread = sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY);\r
- SigTemp[0] = VolumeHeader.Signature;\r
- SigTemp[1] = 0;\r
-\r
- if (VolumeHeader.Attributes & EFI_FVB_ERASE_POLARITY) {\r
- Invert = 1;\r
- }\r
-\r
- do {\r
- fread (&BlockMap, sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, In);\r
- bytesread += sizeof (EFI_FV_BLOCK_MAP_ENTRY);\r
-\r
- if (BlockMap.NumBlocks != 0) {\r
- size += BlockMap.NumBlocks * BlockMap.BlockLength;\r
- }\r
-\r
- } while (BlockMap.NumBlocks != 0);\r
-\r
- *FvSize = size;\r
- rewind (In);\r
-\r
- if (Invert == 1) {\r
- bytesread *= -1;\r
- }\r
-\r
- return bytesread;\r
-}\r
-\r
-UINT32\r
-GetSectionLength (\r
- IN UINT32 *Length\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Converts a UINT8[3] array to a UINT32\r
-\r
-Arguments:\r
-\r
- Length A pointer to a 3 byte array\r
-\r
-Returns:\r
-\r
- UINT32: The length.\r
-\r
---*/\r
-{\r
- return *Length & 0x00FFFFFF;\r
-}\r
-\r
-int\r
-Readfile (\r
- UINT8 *FvImage,\r
- int bytes,\r
- int Invert\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
- FvImage - GC_TODO: add argument description\r
- bytes - GC_TODO: add argument description\r
- Invert - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
- GC_TODO: add return values\r
-\r
---*/\r
-{\r
- UINT32 FileLength;\r
- UINT32 OccupiedFileLength;\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- UINT8 FileState;\r
- UINT8 Checksum;\r
- UINT8 *Ptr;\r
- UINT32 SectionLength;\r
- EFI_COMMON_SECTION_HEADER *SectionHeader;\r
- EFI_IMAGE_NT_HEADERS *PeHeader;\r
- UINT32 PeiCoreOffset;\r
-\r
- Ptr = FvImage + bytes;\r
-\r
- FileHeader = (EFI_FFS_FILE_HEADER *) Ptr;\r
-\r
- FileState = GetFileState ((UINT8) Invert, FileHeader);\r
-\r
- switch (FileState) {\r
- case EFI_FILE_HEADER_CONSTRUCTION:\r
- case EFI_FILE_HEADER_INVALID:\r
- return sizeof (EFI_FFS_FILE_HEADER);\r
-\r
- case EFI_FILE_HEADER_VALID:\r
- Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
- Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File);\r
- Checksum = (UINT8) (Checksum - FileHeader->State);\r
- if (Checksum != 0) {\r
- return -1;\r
- }\r
- //\r
- // Now do the fixup stuff - begin\r
- //\r
- if (FileHeader->Type == EFI_FV_FILETYPE_PEI_CORE) {\r
- SectionHeader = (EFI_COMMON_SECTION_HEADER *) FileHeader + sizeof (EFI_FFS_FILE_HEADER);\r
- SectionLength = GetSectionLength ((UINT32 *) &SectionHeader->Size[0]);\r
-\r
- printf ("Section length is 0x%X\n", SectionLength);\r
-\r
- if (SectionHeader->Type == EFI_SECTION_PE32) {\r
-\r
- gFixup = bytes + sizeof (EFI_FFS_FILE_HEADER) + sizeof (EFI_COMMON_SECTION_HEADER);\r
-\r
- PeHeader = (EFI_IMAGE_NT_HEADERS *) Ptr + sizeof (EFI_FFS_FILE_HEADER) + sizeof (EFI_COMMON_SECTION_HEADER);\r
-\r
- if (((EFI_IMAGE_DOS_HEADER *) PeHeader)->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
- //\r
- // DOS image header is present, so read the PE header after the DOS image header\r
- //\r
- PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) PeHeader + (UINTN) ((((EFI_IMAGE_DOS_HEADER *) PeHeader)->e_lfanew) & 0x0ffff));\r
-\r
- }\r
-\r
- PeiCoreOffset = (UINTN) ((UINTN) (PeHeader->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
-\r
- gFixup += PeiCoreOffset;\r
- }\r
- }\r
-\r
- FileLength = GetLength (FileHeader->Size);\r
- OccupiedFileLength = GetOccupiedSize (FileLength, 8);\r
- return OccupiedFileLength;\r
-\r
- case EFI_FILE_DATA_VALID:\r
- //\r
- // Calculate header checksum\r
- //\r
- Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
- Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File);\r
- Checksum = (UINT8) (Checksum - FileHeader->State);\r
- if (Checksum != 0) {\r
- return -1;\r
- }\r
- //\r
- // Determine file length\r
- //\r
- FileLength = GetLength (FileHeader->Size);\r
- OccupiedFileLength = GetOccupiedSize (FileLength, 8);\r
-\r
- //\r
- // Determine if file checksum is valid or fixed\r
- //\r
- if (FileHeader->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- Checksum = CalculateSum8 (Ptr, FileLength);\r
- Checksum = (UINT8) (Checksum - FileHeader->State);\r
- if (Checksum != 0) {\r
- return -1;\r
- }\r
- } else {\r
- if (FileHeader->IntegrityCheck.Checksum.File != FFS_FIXED_CHECKSUM) {\r
- return -1;\r
- }\r
- }\r
- break;\r
-\r
- case EFI_FILE_MARKED_FOR_UPDATE:\r
- case EFI_FILE_DELETED:\r
- //\r
- // Calculate header checksum\r
- //\r
- Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
- Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File);\r
- Checksum = (UINT8) (Checksum - FileHeader->State);\r
- if (Checksum != 0) {\r
- return -1;\r
- }\r
- //\r
- // Determine file length\r
- //\r
- FileLength = GetLength (FileHeader->Size);\r
- OccupiedFileLength = GetOccupiedSize (FileLength, 8);\r
-\r
- //\r
- // Determine if file checksum is valid or fixed\r
- //\r
- if (FileHeader->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- Checksum = CalculateSum8 (Ptr, FileLength);\r
- Checksum = (UINT8) (Checksum - FileHeader->State);\r
- if (Checksum != 0) {\r
- return -1;\r
- }\r
- } else {\r
- if (FileHeader->IntegrityCheck.Checksum.File != FFS_FIXED_CHECKSUM) {\r
- return -1;\r
- }\r
- }\r
-\r
- return OccupiedFileLength;\r
-\r
- default:\r
- return sizeof (EFI_FFS_FILE_HEADER);\r
- }\r
-\r
- return OccupiedFileLength;\r
-}\r
-\r
-int\r
-main (\r
- int argc,\r
- char*argv[]\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Runs GenBsfFixup\r
-\r
-Arguments:\r
-\r
- argc: number of command line arguments\r
-\r
- arg[0] = This file name\r
- arg[1] = Firmware Volume Name\r
- arg[2] = Base Address to relocate\r
- arg[3] = Relative offset of the fixup to perform\r
- arg[4] = Output File Name\r
-\r
-Returns:\r
- \r
- int: 0 code success, -1 code failure\r
-\r
---*/\r
-{\r
- FILE *In;\r
- FILE *Out;\r
- int ByteStart;\r
- int Invert;\r
- int Index;\r
- int cnt;\r
- UINT8 *FvImage;\r
- int ByteRead;\r
- UINT32 FvSize;\r
- UINT64 delta;\r
- UINT32 Idx;\r
- UINT64 FvOffset;\r
- EFI_STATUS Status;\r
-\r
- Index = 0;\r
- Invert = 0;\r
- \r
- if (argc == 1) {\r
- Usage();\r
- return -1;\r
- }\r
- \r
- if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) ||\r
- (strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {\r
- Usage();\r
- return -1;\r
- }\r
- \r
- if ((strcmp(argv[1], "-V") == 0) || (strcmp(argv[1], "--version") == 0)) {\r
- Version();\r
- return -1;\r
- }\r
- \r
- if (argc != 5) {\r
- Usage();\r
- return -1;\r
- }\r
-\r
- In = fopen (argv[1], "rb");\r
-\r
- if (In == NULL) {\r
- printf ("Unable to open FV image file \"%s\"\n", argv[1]);\r
- return -1;\r
- }\r
-\r
- ByteStart = ReadHeader (In, &FvSize);\r
-\r
- if (ByteStart < 0) {\r
- Invert = 1;\r
- ByteStart *= -1;\r
- }\r
-\r
- FvImage = malloc (FvSize);\r
- if (FvImage == NULL) {\r
- printf ("Cannot allocate memory\n");\r
- fclose (In);\r
- return -1;\r
- }\r
-\r
- ByteRead = fread (FvImage, 1, FvSize, In);\r
-\r
- if ((unsigned int) ByteRead != FvSize) {\r
- printf ("Read File error\n");\r
- fclose (In);\r
- return -1;\r
- }\r
-\r
- cnt = 0;\r
- while ((unsigned int) ByteStart < FvSize && cnt != -1) {\r
- cnt = Readfile (FvImage, ByteStart, Invert);\r
-\r
- if (cnt != -1) {\r
- ByteStart += cnt;\r
- }\r
-\r
- if (cnt != sizeof (EFI_FFS_FILE_HEADER)) {\r
- Index++;\r
- }\r
- }\r
-\r
- if (cnt == -1) {\r
- printf ("Firmware Volume image corrupted\n");\r
- return -1;\r
- }\r
-\r
- fclose (In);\r
-\r
- Out = fopen (argv[4], "wb");\r
-\r
- if (Out == NULL) {\r
- printf ("Unable to open FV image file \"%s\"\n", argv[4]);\r
- return -1;\r
- }\r
-\r
- In = fopen (argv[1], "rb");\r
-\r
- if (In == NULL) {\r
- printf ("Unable to open FV image file \"%s\"\n", argv[1]);\r
- return -1;\r
- }\r
-\r
- if (gFixup != 0) {\r
-\r
- printf ("Fixup of 0x%X\n", gFixup);\r
-\r
- Status = AsciiStringToUint64 (argv[2], TRUE, &FvOffset);\r
-\r
- gFixup += (UINT32) FvOffset;\r
-\r
- ByteStart = ReadHeader (In, &FvSize);\r
-\r
- Readfile (FvImage, ByteStart, Invert);\r
-\r
- cnt = 0;\r
- Status = AsciiStringToUint64 (argv[3], TRUE, &delta);\r
-\r
- fclose (In);\r
- In = fopen (argv[1], "rb");\r
-\r
- if (In == NULL) {\r
- printf ("Unable to open FV image file \"%s\"\n", argv[1]);\r
- return -1;\r
- }\r
-\r
- for (Idx = 0; Idx < delta - FvOffset; Idx++) {\r
- fputc (fgetc (In), Out);\r
- }\r
-\r
- fwrite (&gFixup, sizeof (UINT32), 1, Out);\r
- fseek (In, sizeof (UINT32), SEEK_CUR);\r
-\r
- for (Idx = 0; Idx < FvSize - (delta - FvOffset) - sizeof (UINT32); Idx++) {\r
- fputc (fgetc (In), Out);\r
- }\r
-\r
- fclose (In);\r
- fclose (Out);\r
- } else {\r
- printf ("There was no fixup to perform\n");\r
- }\r
-\r
- free (FvImage);\r
-\r
- return 0;\r
-}\r