+++ /dev/null
-/** @file\r
-This file contains functions required to generate a boot strap file (BSF) also\r
-known as the Volume Top File (VTF)\r
-\r
-Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available\r
-under the terms and conditions of the BSD License which accompanies this\r
-distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-//\r
-//\r
-//\r
-#include <FvLib.h>\r
-#include <Common/UefiBaseTypes.h>\r
-#include "GenVtf.h"\r
-#include <Guid/PiFirmwareFileSystem.h>\r
-#include "CommonLib.h"\r
-#include "EfiUtilityMsgs.h"\r
-\r
-//\r
-// Global variables\r
-//\r
-UINTN SectionOptionFlag = 0;\r
-UINTN SectionCompFlag = 0;\r
-\r
-UINT64 DebugLevel;\r
-BOOLEAN DebugMode;\r
-\r
-BOOLEAN QuietMode = FALSE;\r
-\r
-BOOLEAN VTF_OUTPUT = FALSE;\r
-CHAR8 *OutFileName1;\r
-CHAR8 *OutFileName2;\r
-CHAR8 *SymFileName;\r
-\r
-CHAR8 **TokenStr;\r
-CHAR8 **OrgStrTokPtr;\r
-\r
-PARSED_VTF_INFO *FileListPtr;\r
-PARSED_VTF_INFO *FileListHeadPtr;\r
-\r
-VOID *Vtf1Buffer;\r
-VOID *Vtf1EndBuffer;\r
-VOID *Vtf2Buffer;\r
-VOID *Vtf2EndBuffer;\r
-\r
-UINTN ValidLineNum = 0;\r
-UINTN ValidFFDFileListNum = 0;\r
-\r
-//\r
-// Section Description and their number of occurences in *.INF file\r
-//\r
-UINTN NumFvFiles = 0;\r
-UINTN SectionOptionNum = 0;\r
-\r
-//\r
-// Global flag which will check for VTF Present, if yes then will be used\r
-// to decide about adding FFS header to pad data\r
-//\r
-BOOLEAN VTFPresent = FALSE;\r
-BOOLEAN SecondVTF = FALSE;\r
-\r
-//\r
-// Address related information\r
-//\r
-UINT64 Fv1BaseAddress = 0;\r
-UINT64 Fv2BaseAddress = 0;\r
-UINT64 Fv1EndAddress = 0;\r
-UINT64 Fv2EndAddress = 0;\r
-UINT32 Vtf1TotalSize = SIZE_TO_OFFSET_PAL_A_END;\r
-UINT64 Vtf1LastStartAddress = 0;\r
-UINT32 Vtf2TotalSize = 0;\r
-UINT64 Vtf2LastStartAddress = 0;\r
-\r
-UINT32 BufferToTop = 0;\r
-\r
-//\r
-// IA32 Reset Vector Bin name\r
-//\r
-CHAR8 IA32BinFile[FILE_NAME_SIZE];\r
-\r
-//\r
-// Function Implementations\r
-//\r
-EFI_STATUS\r
-ConvertVersionInfo (\r
- IN CHAR8 *Str,\r
- IN OUT UINT8 *MajorVer,\r
- IN OUT UINT8 *MinorVer\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- This function split version to major version and minor version\r
-\r
-Arguments:\r
-\r
- Str - String representing in form XX.XX\r
- MajorVer - The major version\r
- MinorVer - The minor version\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully.\r
-\r
---*/\r
-{\r
- CHAR8 TemStr[5] = "0000";\r
- int Major;\r
- int Minor;\r
- UINTN Length;\r
-\r
- Major = 0;\r
- Minor = 0;\r
-\r
- if (strstr (Str, ".") != NULL) {\r
- sscanf (\r
- Str,\r
- "%02x.%02x",\r
- &Major,\r
- &Minor\r
- );\r
- } else {\r
- Length = strlen(Str);\r
- if (Length < 4) {\r
- memcpy (TemStr + 4 - Length, Str, Length);\r
- } else {\r
- memcpy (TemStr, Str + Length - 4, 4);\r
- }\r
-\r
- sscanf (\r
- TemStr,\r
- "%02x%02x",\r
- &Major,\r
- &Minor\r
- );\r
- }\r
-\r
- *MajorVer = (UINT8) Major;\r
- *MinorVer = (UINT8) Minor;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-TrimLine (\r
- IN CHAR8 *Line\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- This function cleans up the line by removing all whitespace and\r
- comments\r
-\r
-Arguments:\r
-\r
- Line - The pointer of the string\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- CHAR8 TmpLine[FILE_NAME_SIZE];\r
- CHAR8 Char;\r
- CHAR8 *Ptr0;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- //\r
- // Change '#' to '//' for Comment style\r
- //\r
- if (((Ptr0 = strchr (Line, '#')) != NULL) || ((Ptr0 = strstr (Line, "//")) != NULL)) {\r
- Line[Ptr0 - Line] = 0;\r
- }\r
-\r
- //\r
- // Initialize counters\r
- //\r
- Index = 0;\r
- Index2 = 0;\r
-\r
- while ((Char = Line[Index]) != 0) {\r
- if ((Char != ' ') && (Char != '\t') && (Char != '\n') && (Char != '\r')) {\r
- TmpLine[Index2++] = Char;\r
- }\r
- Index++;\r
- }\r
-\r
- TmpLine[Index2] = 0;\r
- strcpy (Line, TmpLine);\r
-}\r
-\r
-VOID\r
-ValidLineCount (\r
- IN FILE *Fp\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function calculated number of valid lines in a input file.\r
-\r
-Arguments:\r
-\r
- Fp - Pointer to a file handle which has been opened.\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- CHAR8 Buff[FILE_NAME_SIZE];\r
- while (fgets(Buff, sizeof (Buff), Fp)) {\r
- TrimLine (Buff);\r
- if (Buff[0] == 0) {\r
- continue;\r
- }\r
- ValidLineNum++;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-ParseInputFile (\r
- IN FILE *Fp\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function parses the input file and tokenize the string\r
-\r
-Arguments:\r
-\r
- Fp - Pointer to a file handle which has been opened.\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- CHAR8 *Token;\r
- CHAR8 Buff[FILE_NAME_SIZE + 1];\r
- CHAR8 Delimit[] = "=";\r
-\r
- Buff [FILE_NAME_SIZE] = '\0';\r
- Token = NULL;\r
-\r
- while (fgets (Buff, FILE_NAME_SIZE, Fp) != NULL) {\r
- TrimLine (Buff);\r
- if (Buff[0] == 0) {\r
- continue;\r
- }\r
- Token = strtok (Buff, Delimit);\r
- while (Token != NULL) {\r
- strcpy (*TokenStr, Token);\r
- TokenStr ++;\r
- Token = strtok (NULL, Delimit);\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-InitializeComps (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function initializes the relevant global variable which is being\r
- used to store the information retrieved from INF file. This also initializes\r
- the VTF symbol file.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_OUT_OF_RESOURCES - Malloc failed.\r
-\r
---*/\r
-{\r
-\r
- FileListPtr = malloc (sizeof (PARSED_VTF_INFO));\r
-\r
- if (FileListPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- FileListHeadPtr = FileListPtr;\r
- memset (FileListPtr, 0, sizeof (PARSED_VTF_INFO));\r
- FileListPtr->NextVtfInfo = NULL;\r
-\r
- remove (SymFileName);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-ParseAndUpdateComponents (\r
- IN PARSED_VTF_INFO *VtfInfo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function initializes the relevant global variable which is being\r
- used to store the information retrieved from INF file.\r
-\r
-Arguments:\r
-\r
- VtfInfo - A pointer to the VTF Info Structure\r
-\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINT64 StringValue;\r
-\r
- while (*TokenStr != NULL && (strnicmp (*TokenStr, "COMP_NAME", 9) != 0)) {\r
-\r
- if (strnicmp (*TokenStr, "COMP_LOC", 8) == 0) {\r
- TokenStr++;\r
- if (strnicmp (*TokenStr, "F", 1) == 0) {\r
- VtfInfo->LocationType = FIRST_VTF;\r
- } else if (strnicmp (*TokenStr, "S", 1) == 0) {\r
- VtfInfo->LocationType = SECOND_VTF;\r
- } else {\r
- VtfInfo->LocationType = NONE;\r
- }\r
- } else if (strnicmp (*TokenStr, "COMP_TYPE", 9) == 0) {\r
- TokenStr++;\r
- if (AsciiStringToUint64 (*TokenStr, FALSE, &StringValue) != EFI_SUCCESS) {\r
- Error (NULL, 0, 5001, "Cannot get: \"0x%s\".", *TokenStr);\r
- return ;\r
- }\r
-\r
- VtfInfo->CompType = (UINT8) StringValue;\r
- } else if (strnicmp (*TokenStr, "COMP_VER", 8) == 0) {\r
- TokenStr++;\r
- if (strnicmp (*TokenStr, "-", 1) == 0) {\r
- VtfInfo->VersionPresent = FALSE;\r
- VtfInfo->MajorVer = 0;\r
- VtfInfo->MinorVer = 0;\r
- } else {\r
- VtfInfo->VersionPresent = TRUE;\r
- ConvertVersionInfo (*TokenStr, &VtfInfo->MajorVer, &VtfInfo->MinorVer);\r
- }\r
- } else if (strnicmp (*TokenStr, "COMP_BIN", 8) == 0) {\r
- TokenStr++;\r
- if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
- Error (NULL, 0, 3000, "Invalid", "The 'COMP_BIN' name is too long.");\r
- return ;\r
- }\r
- strncpy (VtfInfo->CompBinName, *TokenStr, FILE_NAME_SIZE - 1);\r
- VtfInfo->CompBinName[FILE_NAME_SIZE - 1] = 0;\r
- } else if (strnicmp (*TokenStr, "COMP_SYM", 8) == 0) {\r
- TokenStr++;\r
- if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
- Error (NULL, 0, 3000, "Invalid", "The 'COMP_SYM' name is too long.");\r
- return ;\r
- }\r
- strncpy (VtfInfo->CompSymName, *TokenStr, FILE_NAME_SIZE - 1);\r
- VtfInfo->CompSymName[FILE_NAME_SIZE - 1] = 0;\r
- } else if (strnicmp (*TokenStr, "COMP_SIZE", 9) == 0) {\r
- TokenStr++;\r
- if (strnicmp (*TokenStr, "-", 1) == 0) {\r
- VtfInfo->PreferredSize = FALSE;\r
- VtfInfo->CompSize = 0;\r
- } else {\r
- VtfInfo->PreferredSize = TRUE;\r
- if (AsciiStringToUint64 (*TokenStr, FALSE, &StringValue) != EFI_SUCCESS) {\r
- Error (NULL, 0, 5001, "Parse error", "Cannot get: %s.", TokenStr);\r
- return ;\r
- }\r
-\r
- VtfInfo->CompSize = (UINTN) StringValue;\r
- }\r
-\r
- } else if (strnicmp (*TokenStr, "COMP_CS", 7) == 0) {\r
- TokenStr++;\r
- if (strnicmp (*TokenStr, "1", 1) == 0) {\r
- VtfInfo->CheckSumRequired = 1;\r
- } else if (strnicmp (*TokenStr, "0", 1) == 0) {\r
- VtfInfo->CheckSumRequired = 0;\r
- } else {\r
- Error (NULL, 0, 3000, "Invaild", "Bad value in INF file required field: Checksum, the value must be '0' or '1'.");\r
- }\r
- }\r
-\r
- TokenStr++;\r
- if (*TokenStr == NULL) {\r
- break;\r
- }\r
- }\r
-}\r
-\r
-VOID\r
-InitializeInFileInfo (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function intializes the relevant global variable which is being\r
- used to store the information retrieved from INF file.\r
-\r
-Arguments:\r
-\r
- NONE\r
-\r
-Returns:\r
-\r
- NONE\r
-\r
---*/\r
-{\r
-\r
- SectionOptionFlag = 0;\r
- SectionCompFlag = 0;\r
- TokenStr = OrgStrTokPtr;\r
-\r
- while (*TokenStr != NULL) {\r
- if (strnicmp (*TokenStr, "[OPTIONS]", 9) == 0) {\r
- SectionOptionFlag = 1;\r
- SectionCompFlag = 0;\r
- }\r
-\r
- if (strnicmp (*TokenStr, "[COMPONENTS]", 12) == 0) {\r
- if (FileListPtr == NULL) {\r
- FileListPtr = FileListHeadPtr;\r
- }\r
-\r
- SectionCompFlag = 1;\r
- SectionOptionFlag = 0;\r
- TokenStr++;\r
- }\r
-\r
- if (SectionOptionFlag) {\r
- if (stricmp (*TokenStr, "IA32_RST_BIN") == 0) {\r
- TokenStr++;\r
- if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
- Error (NULL, 0, 3000, "Invalid", "The 'IA32_RST_BIN' name is too long.");\r
- break;\r
- }\r
- strncpy (IA32BinFile, *TokenStr, FILE_NAME_SIZE - 1);\r
- IA32BinFile[FILE_NAME_SIZE - 1] = 0;\r
- }\r
- }\r
-\r
- if (SectionCompFlag) {\r
- if (stricmp (*TokenStr, "COMP_NAME") == 0) {\r
- TokenStr++;\r
- if (strlen (*TokenStr) >= COMPONENT_NAME_SIZE) {\r
- Error (NULL, 0, 3000, "Invalid", "The 'COMP_NAME' name is too long.");\r
- break;\r
- }\r
- strncpy (FileListPtr->CompName, *TokenStr, COMPONENT_NAME_SIZE - 1);\r
- FileListPtr->CompName[COMPONENT_NAME_SIZE - 1] = 0;\r
- TokenStr++;\r
- ParseAndUpdateComponents (FileListPtr);\r
- }\r
-\r
- if (*TokenStr != NULL) {\r
- FileListPtr->NextVtfInfo = malloc (sizeof (PARSED_VTF_INFO));\r
- if (FileListPtr->NextVtfInfo == NULL) {\r
- Error (NULL, 0, 4003, "Resource", "Out of memory resources.", NULL);\r
- break;\r
- }\r
- FileListPtr = FileListPtr->NextVtfInfo;\r
- memset (FileListPtr, 0, sizeof (PARSED_VTF_INFO));\r
- FileListPtr->NextVtfInfo = NULL;\r
- continue;\r
- } else {\r
- break;\r
- }\r
- }\r
-\r
- TokenStr++;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-GetVtfRelatedInfoFromInfFile (\r
- IN FILE *FilePointer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function reads the input file, parse it and create a list of tokens\r
- which is parsed and used, to intialize the data related to VTF\r
-\r
-Arguments:\r
-\r
- FileName - FileName which needed to be read to parse data\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - Error in opening file\r
- EFI_INVALID_PARAMETER - File doesn't contain any valid information\r
- EFI_OUT_OF_RESOURCES - Malloc Failed\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- FILE *Fp;\r
- UINTN Index;\r
- UINTN Index1;\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
- Fp = FilePointer;\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "BSF INF file is invalid!");\r
- return EFI_ABORTED;\r
- }\r
-\r
- ValidLineCount (Fp);\r
-\r
- if (ValidLineNum == 0) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "File does not contain any valid information!");\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- TokenStr = (CHAR8 **) malloc (sizeof (UINTN) * (2 * ValidLineNum + 1));\r
-\r
- if (TokenStr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- memset (TokenStr, 0, (sizeof (UINTN) * (2 * ValidLineNum + 1)));\r
- OrgStrTokPtr = TokenStr;\r
-\r
- for (Index = 0; Index < (2 * ValidLineNum); Index++) {\r
- *TokenStr = (CHAR8*)malloc (sizeof (CHAR8) * FILE_NAME_SIZE);\r
-\r
- if (*TokenStr == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto ParseFileError;\r
- }\r
-\r
- memset (*TokenStr, 0, FILE_NAME_SIZE);\r
- TokenStr++;\r
- }\r
-\r
- TokenStr = OrgStrTokPtr;\r
- fseek (Fp, 0L, SEEK_SET);\r
-\r
- Status = InitializeComps ();\r
-\r
- if (Status != EFI_SUCCESS) {\r
- goto ParseFileError;\r
- }\r
-\r
- Status = ParseInputFile (Fp);\r
- if (Status != EFI_SUCCESS) {\r
- goto ParseFileError;\r
- }\r
-\r
- InitializeInFileInfo ();\r
-\r
-ParseFileError:\r
-\r
- for (Index1 = 0; Index1 < Index; Index1 ++) {\r
- free (OrgStrTokPtr[Index1]);\r
- }\r
-\r
- free (OrgStrTokPtr);\r
-\r
- return Status;\r
-}\r
-\r
-VOID\r
-GetRelativeAddressInVtfBuffer (\r
- IN UINT64 Address,\r
- IN OUT UINTN *RelativeAddress,\r
- IN LOC_TYPE LocType\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function checks for the address alignmnet for specified data boundary. In\r
- case the address is not aligned, it returns FALSE and the amount of data in\r
- terms of byte needed to adjust to get the boundary alignmnet. If data is\r
- aligned, TRUE will be returned.\r
-\r
-Arguments:\r
-\r
- Address - The address of the flash map space\r
- RelativeAddress - The relative address of the Buffer\r
- LocType - The type of the VTF\r
-\r
-\r
-Returns:\r
-\r
-\r
---*/\r
-{\r
- UINT64 TempAddress;\r
- UINT8 *LocalBuff;\r
-\r
- if (LocType == FIRST_VTF) {\r
- LocalBuff = (UINT8 *) Vtf1EndBuffer;\r
- TempAddress = Fv1EndAddress - Address;\r
- *RelativeAddress = (UINTN) LocalBuff - (UINTN) TempAddress;\r
- } else {\r
- LocalBuff = (UINT8 *) Vtf2EndBuffer;\r
- TempAddress = Fv2EndAddress - Address;\r
- *RelativeAddress = (UINTN) LocalBuff - (UINTN) TempAddress;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-GetComponentVersionInfo (\r
- IN OUT PARSED_VTF_INFO *VtfInfo,\r
- IN UINT8 *Buffer\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- This function will extract the version information from File\r
-\r
-Arguments:\r
-\r
- VtfInfo - A Pointer to the VTF Info Structure\r
- Buffer - A Pointer to type UINT8\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_INVALID_PARAMETER - The parameter is invalid\r
-\r
---*/\r
-{\r
- UINT16 VersionInfo;\r
- EFI_STATUS Status;\r
-\r
- switch (VtfInfo->CompType) {\r
-\r
- case COMP_TYPE_FIT_PAL_A:\r
- case COMP_TYPE_FIT_PAL_B:\r
- memcpy (&VersionInfo, (Buffer + 8), sizeof (UINT16));\r
- VtfInfo->MajorVer = (UINT8) ((VersionInfo & 0xFF00) >> 8);\r
- VtfInfo->MinorVer = (UINT8) (VersionInfo & 0x00FF);\r
- Status = EFI_SUCCESS;\r
- break;\r
-\r
- default:\r
- Status = EFI_INVALID_PARAMETER;\r
- break;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-BOOLEAN\r
-CheckAddressAlignment (\r
- IN UINT64 Address,\r
- IN UINT64 AlignmentData,\r
- IN OUT UINT64 *AlignAdjustByte\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function checks for the address alignmnet for specified data boundary. In\r
- case the address is not aligned, it returns FALSE and the amount of data in\r
- terms of byte needed to adjust to get the boundary alignmnet. If data is\r
- aligned, TRUE will be returned.\r
-\r
-Arguments:\r
-\r
- Address - Pointer to buffer containing byte data of component.\r
- AlignmentData - DataSize for which address needed to be aligned\r
- AlignAdjustByte - Number of bytes needed to adjust alignment.\r
-\r
-Returns:\r
-\r
- TRUE - Address is aligned to specific data size boundary\r
- FALSE - Address in not aligned to specified data size boundary\r
- - Add/Subtract AlignAdjustByte to aling the address.\r
-\r
---*/\r
-{\r
- //\r
- // Check if the assigned address is on address boundary. If not, it will\r
- // return the remaining byte required to adjust the address for specified\r
- // address boundary\r
- //\r
- *AlignAdjustByte = (Address % AlignmentData);\r
-\r
- if (*AlignAdjustByte == 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-GetFitTableStartAddress (\r
- IN OUT FIT_TABLE **FitTable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Get the FIT table start address in VTF Buffer\r
-\r
-Arguments:\r
-\r
- FitTable - Pointer to available fit table where new component can be added\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- UINT64 FitTableAdd;\r
- UINT64 FitTableAddOffset;\r
- UINTN RelativeAddress;\r
-\r
- //\r
- // Read the Fit Table address from Itanium-based address map.\r
- //\r
- FitTableAddOffset = Fv1EndAddress - (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + SIZE_FIT_TABLE_ADD);\r
-\r
- //\r
- // Translate this Itanium-based address in terms of local buffer address which\r
- // contains the image for Boot Strapped File. The relative address will be\r
- // the address of fit table VTF buffer.\r
- //\r
- GetRelativeAddressInVtfBuffer (FitTableAddOffset, &RelativeAddress, FIRST_VTF);\r
- FitTableAdd = *(UINTN *) RelativeAddress;\r
-\r
- //\r
- // The FitTableAdd is the extracted Itanium based address pointing to FIT\r
- // table. The relative address will return its actual location in VTF\r
- // Buffer.\r
- //\r
- GetRelativeAddressInVtfBuffer (FitTableAdd, &RelativeAddress, FIRST_VTF);\r
-\r
- *FitTable = (FIT_TABLE *) RelativeAddress;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-GetNextAvailableFitPtr (\r
- IN FIT_TABLE **FitPtr\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Get the FIT table address and locate the free space in fit where we can add\r
- new component. In this process, this function locates the fit table using\r
- Fit pointer in Itanium-based address map (as per Intel?Itanium(TM) SAL spec)\r
- and locate the available location in FIT table to be used by new components.\r
- If there are any Fit table which areg not being used contains ComponentType\r
- field as 0x7F. If needed we can change this and spec this out.\r
-\r
-Arguments:\r
-\r
- FitPtr - Pointer to available fit table where new component can be added\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- FIT_TABLE *TmpFitPtr;\r
- UINT64 FitTableAdd;\r
- UINT64 FitTableAddOffset;\r
- UINTN Index;\r
- UINTN NumFitComponents;\r
- UINTN RelativeAddress;\r
-\r
- //\r
- // Read the Fit Table address from Itanium-based address map.\r
- //\r
- FitTableAddOffset = Fv1EndAddress - (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + SIZE_FIT_TABLE_ADD);\r
-\r
- //\r
- // Translate this Itanium-based address in terms of local buffer address which\r
- // contains the image for Boot Strapped File. The relative address will be\r
- // the address of fit table VTF buffer.\r
- //\r
- GetRelativeAddressInVtfBuffer (FitTableAddOffset, &RelativeAddress, FIRST_VTF);\r
- FitTableAdd = *(UINTN *) RelativeAddress;\r
-\r
- //\r
- // The FitTableAdd is the extracted Itanium based address pointing to FIT\r
- // table. The relative address will return its actual location in VTF\r
- // Buffer.\r
- //\r
- GetRelativeAddressInVtfBuffer (FitTableAdd, &RelativeAddress, FIRST_VTF);\r
-\r
- TmpFitPtr = (FIT_TABLE *) RelativeAddress;\r
- NumFitComponents = TmpFitPtr->CompSize;\r
- *FitPtr = NULL;\r
-\r
- for (Index = 0; Index < NumFitComponents; Index++) {\r
- if ((TmpFitPtr->CvAndType & FIT_TYPE_MASK) == COMP_TYPE_FIT_UNUSED) {\r
- *FitPtr = TmpFitPtr;\r
- break;\r
- }\r
-\r
- TmpFitPtr++;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-int\r
-CompareItems (\r
- IN const VOID *Arg1,\r
- IN const VOID *Arg2\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function is used by qsort to sort the FIT table based upon Component\r
- Type in their incresing order.\r
-\r
-Arguments:\r
-\r
- Arg1 - Pointer to Arg1\r
- Arg2 - Pointer to Arg2\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- if ((((FIT_TABLE *) Arg1)->CvAndType & FIT_TYPE_MASK) > (((FIT_TABLE *) Arg2)->CvAndType & FIT_TYPE_MASK)) {\r
- return 1;\r
- } else if ((((FIT_TABLE *) Arg1)->CvAndType & FIT_TYPE_MASK) < (((FIT_TABLE *) Arg2)->CvAndType & FIT_TYPE_MASK)) {\r
- return -1;\r
- } else {\r
- return 0;\r
- }\r
-}\r
-\r
-VOID\r
-SortFitTable (\r
- IN VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function is used by qsort to sort the FIT table based upon Component\r
- Type in their incresing order.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- FIT_TABLE *FitTable;\r
- FIT_TABLE *TmpFitPtr;\r
- UINTN NumFitComponents;\r
- UINTN Index;\r
-\r
- GetFitTableStartAddress (&FitTable);\r
- TmpFitPtr = FitTable;\r
- NumFitComponents = 0;\r
- for (Index = 0; Index < FitTable->CompSize; Index++) {\r
- if ((TmpFitPtr->CvAndType & FIT_TYPE_MASK) != COMP_TYPE_FIT_UNUSED) {\r
- NumFitComponents += 1;\r
- }\r
- TmpFitPtr++;\r
- }\r
- qsort ((VOID *) FitTable, NumFitComponents, sizeof (FIT_TABLE), CompareItems);\r
-}\r
-\r
-VOID\r
-UpdateFitEntryForFwVolume (\r
- IN UINT64 Size\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function updates the information about Firmware Volume in FIT TABLE.\r
- This FIT table has to be immediately below the PAL_A Start and it contains\r
- component type and address information. Other information can't be\r
- created this time so we would need to fix it up..\r
-\r
-\r
-Arguments:\r
-\r
- Size - Firmware Volume Size\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- FIT_TABLE *CompFitPtr;\r
- UINTN RelativeAddress;\r
-\r
- //\r
- // FV Fit table will be located at PAL_A Startaddress - 16 byte location\r
- //\r
- Vtf1LastStartAddress -= 0x10;\r
- Vtf1TotalSize += 0x10;\r
-\r
- GetRelativeAddressInVtfBuffer (Vtf1LastStartAddress, &RelativeAddress, FIRST_VTF);\r
-\r
- CompFitPtr = (FIT_TABLE *) RelativeAddress;\r
- CompFitPtr->CompAddress = Fv1BaseAddress;\r
-\r
- //\r
- // Since we don't have any information about its location in Firmware Volume,\r
- // initialize address to 0. This will be updated once Firmware Volume is\r
- // being build and its current address will be fixed in FIT table. Currently\r
- // we haven't implemented it so far and working on architectural clarafication\r
- //\r
- //\r
- // Firmware Volume Size in 16 byte block\r
- //\r
- CompFitPtr->CompSize = ((UINT32) Size) / 16;\r
-\r
- //\r
- // Since Firmware Volume does not exist by the time we create this FIT info\r
- // this should be fixedup from Firmware Volume creation tool. We haven't\r
- // worked out a method so far.\r
- //\r
- CompFitPtr->CompVersion = MAKE_VERSION (0, 0);\r
-\r
- //\r
- // Since we don't have any info about this file, we are making sure that\r
- // checksum is not needed.\r
- //\r
- CompFitPtr->CvAndType = CV_N_TYPE (0, COMP_TYPE_FIT_FV_BOOT);\r
-\r
- //\r
- // Since non VTF component will reside outside the VTF, we will not have its\r
- // binary image while creating VTF, hence we will not perform checksum at\r
- // this time. Once Firmware Volume is being created which will contain this\r
- // VTF, it will fix the FIT table for all the non VTF component and hence\r
- // checksum\r
- //\r
- CompFitPtr->CheckSum = 0;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateFitEntryForNonVTFComp (\r
- IN PARSED_VTF_INFO *VtfInfo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function updates the information about non VTF component in FIT TABLE.\r
- Since non VTF componets binaries are not part of VTF binary, we would still\r
- be required to update its location information in Firmware Volume, inside\r
- FIT table.\r
-\r
-Arguments:\r
-\r
- VtfInfo - Pointer to VTF Info Structure\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - The function fails to update the component in FIT\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- FIT_TABLE *CompFitPtr;\r
-\r
- //\r
- // Scan the FIT table for available space\r
- //\r
- GetNextAvailableFitPtr (&CompFitPtr);\r
- if (CompFitPtr == NULL) {\r
- Error (NULL, 0, 5003, "Invalid", "Can't update this component in FIT");\r
- return EFI_ABORTED;\r
- }\r
-\r
- //\r
- // Since we don't have any information about its location in Firmware Volume,\r
- // initialize address to 0. This will be updated once Firmware Volume is\r
- // being build and its current address will be fixed in FIT table\r
- //\r
- CompFitPtr->CompAddress = 0;\r
- CompFitPtr->CompSize = VtfInfo->CompSize;\r
- CompFitPtr->CompVersion = MAKE_VERSION (VtfInfo->MajorVer, VtfInfo->MinorVer);\r
- CompFitPtr->CvAndType = CV_N_TYPE (VtfInfo->CheckSumRequired, VtfInfo->CompType);\r
-\r
- //\r
- // Since non VTF component will reside outside the VTF, we will not have its\r
- // binary image while creating VTF, hence we will not perform checksum at\r
- // this time. Once Firmware Volume is being created which will contain this\r
- // VTF, it will fix the FIT table for all the non VTF component and hence\r
- // checksum\r
- //\r
- CompFitPtr->CheckSum = 0;\r
-\r
- //\r
- // Fit Type is FV_BOOT which means Firmware Volume, we initialize this to base\r
- // address of Firmware Volume in which this VTF will be attached.\r
- //\r
- if ((CompFitPtr->CvAndType & 0x7F) == COMP_TYPE_FIT_FV_BOOT) {\r
- CompFitPtr->CompAddress = Fv1BaseAddress;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-//\r
-// !!!WARNING\r
-// This function is updating the SALE_ENTRY in Itanium address space as per SAL\r
-// spec. SALE_ENTRY is being read from SYM file of PEICORE. Once the PEI\r
-// CORE moves in Firmware Volume, we would need to modify this function to be\r
-// used with a API which will detect PEICORE component while building Firmware\r
-// Volume and update its entry in FIT table as well as in Itanium address space\r
-// as per Intel?Itanium(TM) SAL address space\r
-//\r
-EFI_STATUS\r
-UpdateEntryPoint (\r
- IN PARSED_VTF_INFO *VtfInfo,\r
- IN UINT64 *CompStartAddress\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function updated the architectural entry point in IPF, SALE_ENTRY.\r
-\r
-Arguments:\r
-\r
- VtfInfo - Pointer to VTF Info Structure\r
- CompStartAddress - Pointer to Component Start Address\r
-\r
-Returns:\r
-\r
- EFI_INVALID_PARAMETER - The parameter is invalid\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- UINTN RelativeAddress;\r
- UINT64 SalEntryAdd;\r
- FILE *Fp;\r
- UINTN Offset;\r
-\r
- CHAR8 Buff[FILE_NAME_SIZE];\r
- CHAR8 Buff1[10];\r
- CHAR8 Buff2[10];\r
- CHAR8 OffsetStr[30];\r
- CHAR8 Buff3[10];\r
- CHAR8 Buff4[10];\r
- CHAR8 Buff5[10];\r
- CHAR8 Token[50];\r
- CHAR8 FormatString[MAX_LINE_LEN];\r
-\r
- Fp = fopen (LongFilePath (VtfInfo->CompSymName), "rb");\r
-\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompSymName);\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Generate the format string for fscanf\r
- //\r
- sprintf (\r
- FormatString,\r
- "%%%us %%%us %%%us %%%us %%%us %%%us %%%us",\r
- (unsigned) sizeof (Buff1) - 1,\r
- (unsigned) sizeof (Buff2) - 1,\r
- (unsigned) sizeof (OffsetStr) - 1,\r
- (unsigned) sizeof (Buff3) - 1,\r
- (unsigned) sizeof (Buff4) - 1,\r
- (unsigned) sizeof (Buff5) - 1,\r
- (unsigned) sizeof (Token) - 1\r
- );\r
-\r
- while (fgets (Buff, sizeof (Buff), Fp) != NULL) {\r
- fscanf (\r
- Fp,\r
- FormatString,\r
- Buff1,\r
- Buff2,\r
- OffsetStr,\r
- Buff3,\r
- Buff4,\r
- Buff5,\r
- Token\r
- );\r
- if (strnicmp (Token, "SALE_ENTRY", 10) == 0) {\r
- break;\r
- }\r
- }\r
-\r
- Offset = strtoul (OffsetStr, NULL, 16);\r
-\r
- *CompStartAddress += Offset;\r
- SalEntryAdd = Fv1EndAddress - (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT);\r
-\r
- GetRelativeAddressInVtfBuffer (SalEntryAdd, &RelativeAddress, FIRST_VTF);\r
-\r
- memcpy ((VOID *) RelativeAddress, (VOID *) CompStartAddress, sizeof (UINT64));\r
-\r
- if (Fp != NULL) {\r
- fclose (Fp);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-CreateAndUpdateComponent (\r
- IN PARSED_VTF_INFO *VtfInfo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function reads the binary file for each components and update them\r
- in VTF Buffer as well as in FIT table. If the component is located in non\r
- VTF area, only the FIT table address will be updated\r
-\r
-Arguments:\r
-\r
- VtfInfo - Pointer to Parsed Info\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successful\r
- EFI_ABORTED - Aborted due to one of the many reasons like:\r
- (a) Component Size greater than the specified size.\r
- (b) Error opening files.\r
- (c) Fail to get the FIT table address.\r
-\r
- EFI_INVALID_PARAMETER Value returned from call to UpdateEntryPoint()\r
- EFI_OUT_OF_RESOURCES Memory allocation failure.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT64 CompStartAddress;\r
- UINT64 FileSize;\r
- UINT64 NumAdjustByte;\r
- UINT8 *Buffer;\r
- FILE *Fp;\r
- FIT_TABLE *CompFitPtr;\r
- BOOLEAN Aligncheck;\r
-\r
- if (VtfInfo->LocationType == NONE) {\r
- UpdateFitEntryForNonVTFComp (VtfInfo);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Fp = fopen (LongFilePath (VtfInfo->CompBinName), "rb");\r
-\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompBinName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- FileSize = _filelength (fileno (Fp));\r
- if ((VtfInfo->CompType == COMP_TYPE_FIT_PAL_B) || (VtfInfo->CompType == COMP_TYPE_FIT_PAL_A_SPECIFIC)) {\r
-\r
- //\r
- // BUGBUG: Satish to correct\r
- //\r
- FileSize -= SIZE_OF_PAL_HEADER;\r
- }\r
-\r
- if (VtfInfo->PreferredSize) {\r
- if (FileSize > VtfInfo->CompSize) {\r
- fclose (Fp);\r
- Error (NULL, 0, 2000, "Invalid parameter", "The component size is more than specified size.");\r
- return EFI_ABORTED;\r
- }\r
-\r
- FileSize = VtfInfo->CompSize;\r
- }\r
-\r
- Buffer = malloc ((UINTN) FileSize);\r
- if (Buffer == NULL) {\r
- fclose (Fp);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- memset (Buffer, 0, (UINTN) FileSize);\r
-\r
- if ((VtfInfo->CompType == COMP_TYPE_FIT_PAL_B) || (VtfInfo->CompType == COMP_TYPE_FIT_PAL_A_SPECIFIC)) {\r
-\r
- //\r
- // Read first 64 bytes of PAL header and use it to find version info\r
- //\r
- fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
-\r
- //\r
- // PAL header contains the version info. Currently, we will use the header\r
- // to read version info and then discard.\r
- //\r
- if (!VtfInfo->VersionPresent) {\r
- GetComponentVersionInfo (VtfInfo, Buffer);\r
- }\r
- }\r
-\r
- fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
- fclose (Fp);\r
-\r
- //\r
- // If it is non PAL_B component, pass the entire buffer to get the version\r
- // info and implement any specific case inside GetComponentVersionInfo.\r
- //\r
- if (VtfInfo->CompType != COMP_TYPE_FIT_PAL_B) {\r
- if (!VtfInfo->VersionPresent) {\r
- GetComponentVersionInfo (VtfInfo, Buffer);\r
- }\r
- }\r
-\r
- if (VtfInfo->LocationType == SECOND_VTF) {\r
-\r
- CompStartAddress = (Vtf2LastStartAddress - FileSize);\r
- } else {\r
- CompStartAddress = (Vtf1LastStartAddress - FileSize);\r
- }\r
-\r
- if (VtfInfo->CompType == COMP_TYPE_FIT_PAL_B) {\r
- Aligncheck = CheckAddressAlignment (CompStartAddress, 32 * 1024, &NumAdjustByte);\r
- } else {\r
- Aligncheck = CheckAddressAlignment (CompStartAddress, 8, &NumAdjustByte);\r
- }\r
-\r
- if (!Aligncheck) {\r
- CompStartAddress -= NumAdjustByte;\r
- }\r
-\r
- if (VtfInfo->LocationType == SECOND_VTF && SecondVTF == TRUE) {\r
- Vtf2LastStartAddress = CompStartAddress;\r
- Vtf2TotalSize += (UINT32) (FileSize + NumAdjustByte);\r
- Status = UpdateVtfBuffer (CompStartAddress, Buffer, FileSize, SECOND_VTF);\r
- } else if (VtfInfo->LocationType == FIRST_VTF) {\r
- Vtf1LastStartAddress = CompStartAddress;\r
- Vtf1TotalSize += (UINT32) (FileSize + NumAdjustByte);\r
- Status = UpdateVtfBuffer (CompStartAddress, Buffer, FileSize, FIRST_VTF);\r
- } else {\r
- free (Buffer);\r
- Error (NULL, 0, 2000,"Invalid Parameter", "There's component in second VTF so second BaseAddress and Size must be specified!");\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- free (Buffer);\r
- return EFI_ABORTED;\r
- }\r
-\r
- GetNextAvailableFitPtr (&CompFitPtr);\r
- if (CompFitPtr == NULL) {\r
- free (Buffer);\r
- return EFI_ABORTED;\r
- }\r
-\r
- CompFitPtr->CompAddress = CompStartAddress | IPF_CACHE_BIT;\r
- if ((FileSize % 16) != 0) {\r
- free (Buffer);\r
- Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- //assert ((FileSize % 16) == 0);\r
- CompFitPtr->CompSize = (UINT32) (FileSize / 16);\r
- CompFitPtr->CompVersion = MAKE_VERSION (VtfInfo->MajorVer, VtfInfo->MinorVer);\r
- CompFitPtr->CvAndType = CV_N_TYPE (VtfInfo->CheckSumRequired, VtfInfo->CompType);\r
- if (VtfInfo->CheckSumRequired) {\r
- CompFitPtr->CheckSum = 0;\r
- CompFitPtr->CheckSum = CalculateChecksum8 (Buffer, (UINTN) FileSize);\r
- }\r
-\r
- //\r
- // Free the buffer\r
- //\r
- if (Buffer) {\r
- free (Buffer);\r
- }\r
-\r
- //\r
- // Update the SYM file for this component based on it's start address.\r
- //\r
- Status = UpdateSymFile (CompStartAddress, SymFileName, VtfInfo->CompSymName, FileSize);\r
- if (EFI_ERROR (Status)) {\r
-\r
- //\r
- // At this time, SYM files are not required, so continue on error.\r
- //\r
- }\r
-\r
- // !!!!!!!!!!!!!!!!!!!!!\r
- // BUGBUG:\r
- // This part of the code is a temporary line since PEICORE is going to be inside\r
- // VTF till we work out how to determine the SALE_ENTRY through it. We will need\r
- // to clarify so many related questions\r
- // !!!!!!!!!!!!!!!!!!!!!!!\r
-\r
- if (VtfInfo->CompType == COMP_TYPE_FIT_PEICORE) {\r
- Status = UpdateEntryPoint (VtfInfo, &CompStartAddress);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-CreateAndUpdatePAL_A (\r
- IN PARSED_VTF_INFO *VtfInfo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function reads the binary file for each components and update them\r
- in VTF Buffer as well as FIT table\r
-\r
-Arguments:\r
-\r
- VtfInfo - Pointer to Parsed Info\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - Due to one of the following reasons:\r
- (a)Error Opening File\r
- (b)The PAL_A Size is more than specified size status\r
- One of the values mentioned below returned from\r
- call to UpdateSymFile\r
- EFI_SUCCESS - The function completed successfully.\r
- EFI_INVALID_PARAMETER - One of the input parameters was invalid.\r
- EFI_ABORTED - An error occurred.UpdateSymFile\r
- EFI_OUT_OF_RESOURCES - Memory allocation failed.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT64 PalStartAddress;\r
- UINT64 AbsAddress;\r
- UINTN RelativeAddress;\r
- UINT64 FileSize;\r
- UINT8 *Buffer;\r
- FILE *Fp;\r
- FIT_TABLE *PalFitPtr;\r
-\r
- Fp = fopen (LongFilePath (VtfInfo->CompBinName), "rb");\r
-\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompBinName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- FileSize = _filelength (fileno (Fp));\r
- if (FileSize < 64) {\r
- fclose (Fp);\r
- Error (NULL, 0, 2000, "Invalid parameter", "PAL_A bin header is 64 bytes, so the Bin size must be larger than 64 bytes!");\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- FileSize -= SIZE_OF_PAL_HEADER;\r
-\r
-\r
- if (VtfInfo->PreferredSize) {\r
- if (FileSize > VtfInfo->CompSize) {\r
- fclose (Fp);\r
- Error (NULL, 0, 2000, "Invalid parameter", "The PAL_A Size is more than the specified size.");\r
- return EFI_ABORTED;\r
- }\r
-\r
- FileSize = VtfInfo->CompSize;\r
- }\r
-\r
- Buffer = malloc ((UINTN) FileSize);\r
- if (Buffer == NULL) {\r
- fclose (Fp);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- memset (Buffer, 0, (UINTN) FileSize);\r
-\r
- //\r
- // Read, Get version Info and discard the PAL header.\r
- //\r
- fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
-\r
- //\r
- // Extract the version info from header of PAL_A. Once done, discrad this buffer\r
- //\r
- if (!VtfInfo->VersionPresent) {\r
- GetComponentVersionInfo (VtfInfo, Buffer);\r
- }\r
-\r
- //\r
- // Read PAL_A file in a buffer\r
- //\r
- fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
- fclose (Fp);\r
-\r
- PalStartAddress = Fv1EndAddress - (SIZE_TO_OFFSET_PAL_A_END + FileSize);\r
- Vtf1LastStartAddress = PalStartAddress;\r
- Vtf1TotalSize += (UINT32) FileSize;\r
- Status = UpdateVtfBuffer (PalStartAddress, Buffer, FileSize, FIRST_VTF);\r
-\r
- AbsAddress = Fv1EndAddress - SIZE_TO_PAL_A_FIT;\r
- GetRelativeAddressInVtfBuffer (AbsAddress, &RelativeAddress, FIRST_VTF);\r
- PalFitPtr = (FIT_TABLE *) RelativeAddress;\r
- PalFitPtr->CompAddress = PalStartAddress | IPF_CACHE_BIT;\r
- //assert ((FileSize % 16) == 0);\r
- if ((FileSize % 16) != 0) {\r
- free (Buffer);\r
- Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- PalFitPtr->CompSize = (UINT32) (FileSize / 16);\r
- PalFitPtr->CompVersion = MAKE_VERSION (VtfInfo->MajorVer, VtfInfo->MinorVer);\r
- PalFitPtr->CvAndType = CV_N_TYPE (VtfInfo->CheckSumRequired, VtfInfo->CompType);\r
- if (VtfInfo->CheckSumRequired) {\r
- PalFitPtr->CheckSum = 0;\r
- PalFitPtr->CheckSum = CalculateChecksum8 (Buffer, (UINTN) FileSize);\r
- }\r
-\r
- if (Buffer) {\r
- free (Buffer);\r
- }\r
-\r
- //\r
- // Update the SYM file for this component based on it's start address.\r
- //\r
- Status = UpdateSymFile (PalStartAddress, SymFileName, VtfInfo->CompSymName, FileSize);\r
- if (EFI_ERROR (Status)) {\r
-\r
- //\r
- // At this time, SYM files are not required, so continue on error.\r
- //\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-CreateFitTableAndInitialize (\r
- IN PARSED_VTF_INFO *VtfInfo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function creates and intializes FIT table which would be used to\r
- add component info inside this\r
-\r
-Arguments:\r
-\r
- VtfInfo - Pointer to Parsed Info\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - Aborted due to no size information\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- UINT64 PalFitTableAdd;\r
- UINT64 FitTableAdd;\r
- UINT64 FitTableAddressOffset;\r
- FIT_TABLE *PalFitPtr;\r
- FIT_TABLE *FitStartPtr;\r
- UINTN NumFitComp;\r
- UINTN RelativeAddress;\r
- UINTN Index;\r
-\r
- if (!VtfInfo->PreferredSize) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "FIT could not be allocated because there is no size information.");\r
- return EFI_ABORTED;\r
- }\r
-\r
- if ((VtfInfo->CompSize % 16) != 0) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "Invalid FIT Table Size, it is not a multiple of 16 bytes. Please correct the size.");\r
- }\r
-\r
- PalFitTableAdd = Fv1EndAddress - SIZE_TO_PAL_A_FIT;\r
- GetRelativeAddressInVtfBuffer (PalFitTableAdd, &RelativeAddress, FIRST_VTF);\r
- PalFitPtr = (FIT_TABLE *) RelativeAddress;\r
- PalFitTableAdd = (PalFitPtr->CompAddress - VtfInfo->CompSize);\r
-\r
- FitTableAdd = (PalFitPtr->CompAddress - 0x10) - VtfInfo->CompSize;\r
- FitTableAddressOffset = Fv1EndAddress - (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + SIZE_FIT_TABLE_ADD);\r
- GetRelativeAddressInVtfBuffer (FitTableAddressOffset, &RelativeAddress, FIRST_VTF);\r
- *(UINT64 *) RelativeAddress = FitTableAdd;\r
-\r
- GetRelativeAddressInVtfBuffer (FitTableAdd, &RelativeAddress, FIRST_VTF);\r
-\r
- //\r
- // Update Fit Table with FIT Signature and FIT info in first 16 bytes.\r
- //\r
- FitStartPtr = (FIT_TABLE *) RelativeAddress;\r
-\r
- strncpy ((CHAR8 *) &FitStartPtr->CompAddress, FIT_SIGNATURE, 8); // "_FIT_ "\r
- assert (((VtfInfo->CompSize & 0x00FFFFFF) % 16) == 0);\r
- FitStartPtr->CompSize = (VtfInfo->CompSize & 0x00FFFFFF) / 16;\r
- FitStartPtr->CompVersion = MAKE_VERSION (VtfInfo->MajorVer, VtfInfo->MinorVer);\r
-\r
- //\r
- // BUGBUG: If a checksum is required, add code to checksum the FIT table. Also\r
- // determine what to do for things like the FV component that aren't easily checksummed.\r
- // The checksum will be done once we are done with all the componet update in the FIT\r
- // table\r
- //\r
- FitStartPtr->CvAndType = CV_N_TYPE (VtfInfo->CheckSumRequired, VtfInfo->CompType);\r
-\r
- NumFitComp = FitStartPtr->CompSize;\r
-\r
- FitStartPtr++;\r
-\r
- //\r
- // Intialize remaining FIT table space to UNUSED fit component type\r
- // so that when we need to create a FIT entry for a component, we can\r
- // locate a free one and use it.\r
- //\r
- for (Index = 0; Index < (NumFitComp - 1); Index++) {\r
- FitStartPtr->CvAndType = 0x7F; // Initialize all with UNUSED\r
- FitStartPtr++;\r
- }\r
-\r
- Vtf1TotalSize += VtfInfo->CompSize;\r
- Vtf1LastStartAddress -= VtfInfo->CompSize;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-WriteVtfBinary (\r
- IN CHAR8 *FileName,\r
- IN UINT32 VtfSize,\r
- IN LOC_TYPE LocType\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Write Firmware Volume from memory to a file.\r
-\r
-Arguments:\r
-\r
- FileName - Output File Name which needed to be created/\r
- VtfSize - FileSize\r
- LocType - The type of the VTF\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - Returned due to one of the following resons:\r
- (a) Error Opening File\r
- (b) Failing to copy buffers\r
- EFI_SUCCESS - The fuction completes successfully\r
-\r
---*/\r
-{\r
- FILE *Fp;\r
- UINTN NumByte;\r
- VOID *VtfBuffer;\r
- UINTN RelativeAddress;\r
-\r
- if (LocType == FIRST_VTF) {\r
- GetRelativeAddressInVtfBuffer (Vtf1LastStartAddress, &RelativeAddress, FIRST_VTF);\r
- VtfBuffer = (VOID *) RelativeAddress;\r
- } else {\r
- GetRelativeAddressInVtfBuffer (Vtf2LastStartAddress, &RelativeAddress, SECOND_VTF);\r
- VtfBuffer = (VOID *) RelativeAddress;\r
- }\r
-\r
- Fp = fopen (LongFilePath (FileName), "wb");\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", FileName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- NumByte = fwrite (VtfBuffer, sizeof (UINT8), (UINTN) VtfSize, Fp);\r
-\r
- if (Fp) {\r
- fclose (Fp);\r
- }\r
-\r
- if (NumByte != (sizeof (UINT8) * VtfSize)) {\r
- Error (NULL, 0, 0002, "Error writing file", FileName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateVtfBuffer (\r
- IN UINT64 StartAddress,\r
- IN UINT8 *Buffer,\r
- IN UINT64 DataSize,\r
- IN LOC_TYPE LocType\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Update the Firmware Volume Buffer with requested buffer data\r
-\r
-Arguments:\r
-\r
- StartAddress - StartAddress in buffer. This number will automatically\r
- point to right address in buffer where data needed\r
- to be updated.\r
- Buffer - Buffer pointer from data will be copied to memory mapped buffer.\r
- DataSize - Size of the data needed to be copied.\r
- LocType - The type of the VTF: First or Second\r
-\r
-Returns:\r
-\r
- EFI_ABORTED - The input parameter is error\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- UINT8 *LocalBufferPtrToWrite;\r
-\r
- if (LocType == FIRST_VTF) {\r
- if ((StartAddress | IPF_CACHE_BIT) < (Vtf1LastStartAddress | IPF_CACHE_BIT)) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "Start Address is less than the VTF start address.");\r
- return EFI_ABORTED;\r
- }\r
-\r
- LocalBufferPtrToWrite = (UINT8 *) Vtf1EndBuffer;\r
-\r
- LocalBufferPtrToWrite -= (Fv1EndAddress - StartAddress);\r
-\r
- } else {\r
-\r
- if ((StartAddress | IPF_CACHE_BIT) < (Vtf2LastStartAddress | IPF_CACHE_BIT)) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "Error StartAddress");\r
- return EFI_ABORTED;\r
- }\r
- LocalBufferPtrToWrite = (UINT8 *) Vtf2EndBuffer;\r
- LocalBufferPtrToWrite -= (Fv2EndAddress - StartAddress);\r
- }\r
-\r
- memcpy (LocalBufferPtrToWrite, Buffer, (UINTN) DataSize);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateFfsHeader (\r
- IN UINT32 TotalVtfSize,\r
- IN LOC_TYPE LocType\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Update the Firmware Volume Buffer with requested buffer data\r
-\r
-Arguments:\r
-\r
- TotalVtfSize - Size of the VTF\r
- Fileoffset - The start of the file relative to the start of the FV.\r
- LocType - The type of the VTF\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_INVALID_PARAMETER - The Ffs File Header Pointer is NULL\r
-\r
---*/\r
-{\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- UINTN RelativeAddress;\r
- EFI_GUID EfiFirmwareVolumeTopFileGuid = EFI_FFS_VOLUME_TOP_FILE_GUID;\r
-\r
- //\r
- // Find the VTF file header location\r
- //\r
- if (LocType == FIRST_VTF) {\r
- GetRelativeAddressInVtfBuffer (Vtf1LastStartAddress, &RelativeAddress, FIRST_VTF);\r
- FileHeader = (EFI_FFS_FILE_HEADER *) RelativeAddress;\r
- } else {\r
- GetRelativeAddressInVtfBuffer (Vtf2LastStartAddress, &RelativeAddress, SECOND_VTF);\r
- FileHeader = (EFI_FFS_FILE_HEADER *) RelativeAddress;\r
- }\r
-\r
- if (FileHeader == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // write header\r
- //\r
- memset (FileHeader, 0, sizeof (EFI_FFS_FILE_HEADER));\r
- memcpy (&FileHeader->Name, &EfiFirmwareVolumeTopFileGuid, sizeof (EFI_GUID));\r
- FileHeader->Type = EFI_FV_FILETYPE_RAW;\r
- FileHeader->Attributes = FFS_ATTRIB_CHECKSUM;\r
-\r
- //\r
- // Now FileSize includes the EFI_FFS_FILE_HEADER\r
- //\r
- FileHeader->Size[0] = (UINT8) (TotalVtfSize & 0x000000FF);\r
- FileHeader->Size[1] = (UINT8) ((TotalVtfSize & 0x0000FF00) >> 8);\r
- FileHeader->Size[2] = (UINT8) ((TotalVtfSize & 0x00FF0000) >> 16);\r
-\r
- //\r
- // Fill in checksums and state, all three must be zero for the checksums.\r
- //\r
- FileHeader->IntegrityCheck.Checksum.Header = 0;\r
- FileHeader->IntegrityCheck.Checksum.File = 0;\r
- FileHeader->State = 0;\r
- FileHeader->IntegrityCheck.Checksum.Header = CalculateChecksum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
- FileHeader->IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) (FileHeader + 1), TotalVtfSize - sizeof (EFI_FFS_FILE_HEADER));\r
- FileHeader->State = EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID | EFI_FILE_DATA_VALID;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-ValidateAddressAndSize (\r
- IN UINT64 BaseAddress,\r
- IN UINT64 FwVolSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Update the Firmware Volume Buffer with requested buffer data\r
-\r
-Arguments:\r
-\r
- BaseAddress - Base address for the Fw Volume.\r
-\r
- FwVolSize - Total Size of the FwVolume to which VTF will be attached..\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_UNSUPPORTED - The input parameter is error\r
-\r
---*/\r
-{\r
- if ((FwVolSize > 0x40) && ((BaseAddress + FwVolSize) % 8 == 0)) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateIA32ResetVector (\r
- IN CHAR8 *FileName,\r
- IN UINT64 FirstFwVSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Update the 16 byte IA32 Reset vector to maintain the compatibility\r
-\r
-Arguments:\r
-\r
- FileName - Binary file name which contains the IA32 Reset vector info..\r
- FirstFwVSize - Total Size of the FwVolume to which VTF will be attached..\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_ABORTED - Invalid File Size\r
- EFI_INVALID_PARAMETER - Bad File Name\r
- EFI_OUT_OF_RESOURCES - Memory allocation failed.\r
-\r
---*/\r
-{\r
- UINT8 *Buffer;\r
- UINT8 *LocalVtfBuffer;\r
- UINTN FileSize;\r
- FILE *Fp;\r
-\r
- if (!strcmp (FileName, "")) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Fp = fopen (LongFilePath (FileName), "rb");\r
-\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", FileName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- FileSize = _filelength (fileno (Fp));\r
-\r
- if (FileSize > 16) {\r
- fclose (Fp);\r
- return EFI_ABORTED;\r
- }\r
-\r
- Buffer = malloc (FileSize);\r
- if (Buffer == NULL) {\r
- fclose (Fp);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- fread (Buffer, sizeof (UINT8), FileSize, Fp);\r
-\r
- LocalVtfBuffer = (UINT8 *) Vtf1EndBuffer - SIZE_IA32_RESET_VECT;\r
- memcpy (LocalVtfBuffer, Buffer, FileSize);\r
-\r
- if (Buffer) {\r
- free (Buffer);\r
- }\r
-\r
- if (Fp != NULL) {\r
- fclose (Fp);\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-CleanUpMemory (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function cleans up any allocated buffer\r
-\r
-Arguments:\r
-\r
- NONE\r
-\r
-Returns:\r
-\r
- NONE\r
-\r
---*/\r
-{\r
- PARSED_VTF_INFO *TempFileListPtr;\r
-\r
- if (Vtf1Buffer) {\r
- free (Vtf1Buffer);\r
- }\r
-\r
- if (Vtf2Buffer) {\r
- free (Vtf2Buffer);\r
- }\r
-\r
- //\r
- // Cleanup the buffer which was allocated to read the file names from FV.INF\r
- //\r
- FileListPtr = FileListHeadPtr;\r
- while (FileListPtr != NULL) {\r
- TempFileListPtr = FileListPtr->NextVtfInfo;\r
- free (FileListPtr);\r
- FileListPtr = TempFileListPtr;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-ProcessAndCreateVtf (\r
- IN UINT64 Size\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function process the link list created during INF file parsing\r
- and create component in VTF and updates its info in FIT table\r
-\r
-Arguments:\r
-\r
- Size - Size of the Firmware Volume of which, this VTF belongs to.\r
-\r
-Returns:\r
-\r
- EFI_UNSUPPORTED - Unknown FIT type\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- PARSED_VTF_INFO *ParsedInfoPtr;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- ParsedInfoPtr = FileListHeadPtr;\r
-\r
- while (ParsedInfoPtr != NULL) {\r
-\r
- switch (ParsedInfoPtr->CompType) {\r
- //\r
- // COMP_TYPE_FIT_HEADER is a special case, hence handle it here\r
- //\r
- case COMP_TYPE_FIT_HEADER:\r
- //COMP_TYPE_FIT_HEADER 0x00\r
- Status = CreateFitTableAndInitialize (ParsedInfoPtr);\r
- break;\r
-\r
- //\r
- // COMP_TYPE_FIT_PAL_A is a special case, hence handle it here\r
- //\r
- case COMP_TYPE_FIT_PAL_A:\r
- //COMP_TYPE_FIT_PAL_A 0x0F\r
- Status = CreateAndUpdatePAL_A (ParsedInfoPtr);\r
-\r
- //\r
- // Based on VTF specification, once the PAL_A component has been written,\r
- // update the Firmware Volume info as FIT table. This will be utilized\r
- // to extract the Firmware Volume Start address where this VTF will be\r
- // of part.\r
- //\r
- if (Status == EFI_SUCCESS) {\r
- UpdateFitEntryForFwVolume (Size);\r
- }\r
- break;\r
-\r
- case COMP_TYPE_FIT_FV_BOOT:\r
- //COMP_TYPE_FIT_FV_BOOT 0x7E\r
- //\r
- // Since FIT entry for Firmware Volume has been created and it is\r
- // located at (PAL_A start - 16 byte). So we will not process any\r
- // Firmware Volume related entry from INF file\r
- //\r
- Status = EFI_SUCCESS;\r
- break;\r
-\r
- default:\r
- //\r
- // Any other component type should be handled here. This will create the\r
- // image in specified VTF and create appropriate entry about this\r
- // component in FIT Entry.\r
- //\r
- Status = CreateAndUpdateComponent (ParsedInfoPtr);\r
- if (EFI_ERROR (Status)) {\r
- Error (NULL, 0, 0002, "Error updating component", ParsedInfoPtr->CompName);\r
- return EFI_ABORTED;\r
- } else {\r
- break;}\r
- }\r
-\r
- ParsedInfoPtr = ParsedInfoPtr->NextVtfInfo;\r
- }\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-GenerateVtfImage (\r
- IN UINT64 StartAddress1,\r
- IN UINT64 Size1,\r
- IN UINT64 StartAddress2,\r
- IN UINT64 Size2,\r
- IN FILE *fp\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This is the main function which will be called from application.\r
-\r
-Arguments:\r
-\r
- StartAddress1 - The start address of the first VTF\r
- Size1 - The size of the first VTF\r
- StartAddress2 - The start address of the second VTF\r
- Size2 - The size of the second VTF\r
- fp - The pointer to BSF inf file\r
-\r
-Returns:\r
-\r
- EFI_OUT_OF_RESOURCES - Can not allocate memory\r
- The return value can be any of the values\r
- returned by the calls to following functions:\r
- GetVtfRelatedInfoFromInfFile\r
- ProcessAndCreateVtf\r
- UpdateIA32ResetVector\r
- UpdateFfsHeader\r
- WriteVtfBinary\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- FILE *VtfFP;\r
-\r
- Status = EFI_UNSUPPORTED;\r
- VtfFP = fp;\r
-\r
- if (StartAddress2 == 0) {\r
- SecondVTF = FALSE;\r
- } else {\r
- SecondVTF = TRUE;\r
- }\r
-\r
- Fv1BaseAddress = StartAddress1;\r
- Fv1EndAddress = Fv1BaseAddress + Size1;\r
- if (Fv1EndAddress != 0x100000000ULL || Size1 < 0x100000) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "Error BaseAddress and Size parameters!");\r
- if (Size1 < 0x100000) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "The FwVolumeSize must be larger than 1M!");\r
- } else if (SecondVTF != TRUE) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "BaseAddress + FwVolumeSize must equal 0x100000000!");\r
- }\r
- Usage();\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // The image buffer for the First VTF\r
- //\r
- Vtf1Buffer = malloc ((UINTN) Size1);\r
- if (Vtf1Buffer == NULL) {\r
- Error (NULL, 0, 4001, "Resource", "Not enough resources available to create memory mapped file for the Boot Strap File!");\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- memset (Vtf1Buffer, 0x00, (UINTN) Size1);\r
- Vtf1EndBuffer = (UINT8 *) Vtf1Buffer + Size1;\r
- Vtf1LastStartAddress = Fv1EndAddress | IPF_CACHE_BIT;\r
-\r
- if (SecondVTF) {\r
- Fv2BaseAddress = StartAddress2;\r
- Fv2EndAddress = Fv2BaseAddress + Size2;\r
- if (Fv2EndAddress != StartAddress1) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "Error BaseAddress and Size parameters!");\r
- if (SecondVTF == TRUE) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "FirstBaseAddress + FirstFwVolumeSize must equal 0x100000000!");\r
- Error (NULL, 0, 2000, "Invalid parameter", "SecondBaseAddress + SecondFwVolumeSize must equal FirstBaseAddress!");\r
- }\r
- Usage();\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // The image buffer for the second VTF\r
- //\r
- Vtf2Buffer = malloc ((UINTN) Size2);\r
- if (Vtf2Buffer == NULL) {\r
- Error (NULL, 0, 4001, "Resource", "Not enough resources available to create memory mapped file for the Boot Strap File!");\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- memset (Vtf2Buffer, 0x00, (UINTN) Size2);\r
- Vtf2EndBuffer = (UINT8 *) Vtf2Buffer + Size2;\r
- Vtf2LastStartAddress = Fv2EndAddress | IPF_CACHE_BIT;\r
- }\r
-\r
- Status = GetVtfRelatedInfoFromInfFile (VtfFP);\r
-\r
- if (Status != EFI_SUCCESS) {\r
- Error (NULL, 0, 0003, "Error parsing file", "the input file.");\r
- CleanUpMemory ();\r
- return Status;\r
- }\r
-\r
- Status = ProcessAndCreateVtf (Size1);\r
- if (Status != EFI_SUCCESS) {\r
- CleanUpMemory ();\r
- return Status;\r
- }\r
-\r
- if (SectionOptionFlag) {\r
- Status = UpdateIA32ResetVector (IA32BinFile, Vtf1TotalSize);\r
- if (Status != EFI_SUCCESS) {\r
- CleanUpMemory ();\r
- return Status;\r
- }\r
- }\r
-\r
- //\r
- // Re arrange the FIT Table for Ascending order of their FIT Type..\r
- //\r
- SortFitTable ();\r
-\r
- //\r
- // All components have been updated in FIT table. Now perform the FIT table\r
- // checksum. The following function will check if Checksum is required,\r
- // if yes, then it will perform the checksum otherwise not.\r
- //\r
- CalculateFitTableChecksum ();\r
-\r
- //\r
- // Write the FFS header\r
- //\r
- Vtf1TotalSize += sizeof (EFI_FFS_FILE_HEADER);\r
- Vtf1LastStartAddress -= sizeof (EFI_FFS_FILE_HEADER);\r
-\r
- Status = UpdateFfsHeader (Vtf1TotalSize, FIRST_VTF);\r
- if (Status != EFI_SUCCESS) {\r
- CleanUpMemory ();\r
- return Status;\r
- }\r
- //\r
- // Update the VTF buffer into specified VTF binary file\r
- //\r
- Status = WriteVtfBinary (OutFileName1, Vtf1TotalSize, FIRST_VTF);\r
-\r
- if (SecondVTF) {\r
- Vtf2TotalSize += sizeof (EFI_FFS_FILE_HEADER);\r
- Vtf2LastStartAddress -= sizeof (EFI_FFS_FILE_HEADER);\r
- Status = UpdateFfsHeader (Vtf2TotalSize, SECOND_VTF);\r
- if (Status != EFI_SUCCESS) {\r
- CleanUpMemory ();\r
- return Status;\r
- }\r
-\r
- //\r
- // Update the VTF buffer into specified VTF binary file\r
- //\r
- Status = WriteVtfBinary (OutFileName2, Vtf2TotalSize, SECOND_VTF);\r
- }\r
-\r
- CleanUpMemory ();\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-PeimFixupInFitTable (\r
- IN UINT64 StartAddress\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function is an entry point to fixup SAL-E entry point.\r
-\r
-Arguments:\r
-\r
- StartAddress - StartAddress for PEIM.....\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully\r
- EFI_ABORTED - Error Opening File\r
- EFI_OUT_OF_RESOURCES - System out of resources for memory allocation.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- FILE *Fp;\r
- UINT64 *StartAddressPtr;\r
- UINTN FirstFwVSize;\r
-\r
- StartAddressPtr = malloc (sizeof (UINT64));\r
- if (StartAddressPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- *StartAddressPtr = StartAddress;\r
-\r
- Fp = fopen (LongFilePath (OutFileName1), "rb");\r
-\r
- if (Fp == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", OutFileName1);\r
- if (StartAddressPtr) {\r
- free (StartAddressPtr);\r
- }\r
- return EFI_ABORTED;\r
- }\r
-\r
- FirstFwVSize = _filelength (fileno (Fp));\r
- fseek (Fp, (long) (FirstFwVSize - (UINTN) (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT)), SEEK_SET);\r
- fwrite ((VOID *) StartAddressPtr, sizeof (UINT64), 1, Fp);\r
-\r
- if (Fp) {\r
- fclose (Fp);\r
- }\r
-\r
- if (StartAddressPtr) {\r
- free (StartAddressPtr);\r
- }\r
-\r
- Status = EFI_SUCCESS;\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateSymFile (\r
- IN UINT64 BaseAddress,\r
- IN CHAR8 *DestFileName,\r
- IN CHAR8 *SourceFileName,\r
- IN UINT64 FileSize\r
-\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function adds the SYM tokens in the source file to the destination file.\r
- The SYM tokens are updated to reflect the base address.\r
-\r
-Arguments:\r
-\r
- BaseAddress - The base address for the new SYM tokens.\r
- DestFileName - The destination file.\r
- SourceFileName - The source file.\r
- FileSize - Size of bin file.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The function completed successfully.\r
- EFI_INVALID_PARAMETER - One of the input parameters was invalid.\r
- EFI_ABORTED - An error occurred.\r
-\r
---*/\r
-{\r
- FILE *SourceFile;\r
- FILE *DestFile;\r
- CHAR8 Buffer[MAX_LONG_FILE_PATH];\r
- CHAR8 Type[MAX_LONG_FILE_PATH];\r
- CHAR8 Address[MAX_LONG_FILE_PATH];\r
- CHAR8 Section[MAX_LONG_FILE_PATH];\r
- CHAR8 Token[MAX_LONG_FILE_PATH];\r
- CHAR8 BaseToken[MAX_LONG_FILE_PATH];\r
- CHAR8 FormatString[MAX_LINE_LEN];\r
- UINT64 TokenAddress;\r
- long StartLocation;\r
-\r
- //\r
- // Verify input parameters.\r
- //\r
- if (BaseAddress == 0 || DestFileName == NULL || SourceFileName == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Open the source file\r
- //\r
- SourceFile = fopen (LongFilePath (SourceFileName), "r");\r
- if (SourceFile == NULL) {\r
-\r
- //\r
- // SYM files are not required.\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Use the file name minus extension as the base for tokens\r
- //\r
- if (strlen (SourceFileName) >= MAX_LONG_FILE_PATH) {\r
- fclose (SourceFile);\r
- Error (NULL, 0, 2000, "Invalid parameter", "The source file name is too long.");\r
- return EFI_ABORTED;\r
- }\r
- strncpy (BaseToken, SourceFileName, MAX_LONG_FILE_PATH - 1);\r
- BaseToken[MAX_LONG_FILE_PATH - 1] = 0;\r
- strtok (BaseToken, ". \t\n");\r
- if (strlen (BaseToken) + strlen ("__") >= MAX_LONG_FILE_PATH) {\r
- fclose (SourceFile);\r
- Error (NULL, 0, 2000, "Invalid parameter", "The source file name is too long.");\r
- return EFI_ABORTED;\r
- }\r
- strncat (BaseToken, "__", MAX_LONG_FILE_PATH - strlen (BaseToken) - 1);\r
-\r
- //\r
- // Open the destination file\r
- //\r
- DestFile = fopen (LongFilePath (DestFileName), "a+");\r
- if (DestFile == NULL) {\r
- fclose (SourceFile);\r
- Error (NULL, 0, 0001, "Error opening file", DestFileName);\r
- return EFI_ABORTED;\r
- }\r
-\r
- //\r
- // If this is the beginning of the output file, write the symbol format info.\r
- //\r
- if (fseek (DestFile, 0, SEEK_END) != 0) {\r
- fclose (SourceFile);\r
- fclose (DestFile);\r
- Error (NULL, 0, 2000, "Invalid parameter", "not at the beginning of the output file.");\r
- return EFI_ABORTED;\r
- }\r
-\r
- StartLocation = ftell (DestFile);\r
-\r
- if (StartLocation == 0) {\r
- fprintf (DestFile, "TEXTSYM format | V1.0\n");\r
- } else if (StartLocation == -1) {\r
- fclose (SourceFile);\r
- fclose (DestFile);\r
- Error (NULL, 0, 2000, "Invalid parameter", "StartLocation error");\r
- return EFI_ABORTED;\r
- }\r
-\r
- //\r
- // Read the first line\r
- //\r
- if (fgets (Buffer, MAX_LONG_FILE_PATH, SourceFile) == NULL) {\r
- Buffer[0] = 0;\r
- }\r
-\r
- //\r
- // Make sure it matches the expected sym format\r
- //\r
- if (strcmp (Buffer, "TEXTSYM format | V1.0\n")) {\r
- fclose (SourceFile);\r
- fclose (DestFile);\r
- Error (NULL, 0, 2000, "Invalid parameter", "The symbol file does not match the expected TEXTSYM format (V1.0.)");\r
- return EFI_ABORTED;\r
- }\r
-\r
- //\r
- // Generate the format string for fscanf\r
- //\r
- sprintf (\r
- FormatString,\r
- "%%%us | %%%us | %%%us | %%%us\n",\r
- (unsigned) sizeof (Type) - 1,\r
- (unsigned) sizeof (Address) - 1,\r
- (unsigned) sizeof (Section) - 1,\r
- (unsigned) sizeof (Token) - 1\r
- );\r
-\r
- //\r
- // Read in the file\r
- //\r
- while (feof (SourceFile) == 0) {\r
-\r
- //\r
- // Read a line\r
- //\r
- if (fscanf (SourceFile, FormatString, Type, Address, Section, Token) == 4) {\r
-\r
- //\r
- // Get the token address\r
- //\r
- AsciiStringToUint64 (Address, TRUE, &TokenAddress);\r
- if (TokenAddress > FileSize) {\r
- //\r
- // Symbol offset larger than FileSize. This Symbol can't be in Bin file. Don't print them.\r
- //\r
- break;\r
- }\r
-\r
- //\r
- // Add the base address, the size of the FFS file header and the size of the peim header.\r
- //\r
- TokenAddress += BaseAddress &~IPF_CACHE_BIT;\r
-\r
- fprintf (DestFile, "%s | %016llX | ", Type, (unsigned long long) TokenAddress);\r
- fprintf (DestFile, "%s | %s\n %s\n", Section, Token, BaseToken);\r
- }\r
- }\r
-\r
- fclose (SourceFile);\r
- fclose (DestFile);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-CalculateFitTableChecksum (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will perform byte checksum on the FIT table, if the the checksum required\r
- field is set to CheckSum required. If the checksum is not required then checksum byte\r
- will have value as 0;.\r
-\r
-Arguments:\r
-\r
- NONE\r
-\r
-Returns:\r
-\r
- Status - Value returned by call to CalculateChecksum8 ()\r
- EFI_SUCCESS - The function completed successfully\r
-\r
---*/\r
-{\r
- FIT_TABLE *TmpFitPtr;\r
- UINT64 FitTableAdd;\r
- UINT64 FitTableAddOffset;\r
- UINTN RelativeAddress;\r
- UINTN Size;\r
-\r
- //\r
- // Read the Fit Table address from Itanium-based address map.\r
- //\r
- FitTableAddOffset = Fv1EndAddress - (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT + SIZE_FIT_TABLE_ADD);\r
-\r
- //\r
- // Translate this Itanium-based address in terms of local buffer address which\r
- // contains the image for Boot Strapped File\r
- //\r
- GetRelativeAddressInVtfBuffer (FitTableAddOffset, &RelativeAddress, FIRST_VTF);\r
- FitTableAdd = *(UINTN *) RelativeAddress;\r
-\r
- GetRelativeAddressInVtfBuffer (FitTableAdd, &RelativeAddress, FIRST_VTF);\r
-\r
- TmpFitPtr = (FIT_TABLE *) RelativeAddress;\r
-\r
- Size = TmpFitPtr->CompSize * 16;\r
-\r
- if ((TmpFitPtr->CvAndType & CHECKSUM_BIT_MASK) >> 7) {\r
- TmpFitPtr->CheckSum = 0;\r
- TmpFitPtr->CheckSum = CalculateChecksum8 ((UINT8 *) TmpFitPtr, Size);\r
- } else {\r
- TmpFitPtr->CheckSum = 0;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-Version (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Displays the standard utility information to SDTOUT\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
-}\r
-\r
-VOID\r
-Usage (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Displays the utility usage syntax to STDOUT\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- //\r
- // Summary usage\r
- //\r
- fprintf (stdout, "Usage: %s [options] <-f input_file> <-r BaseAddress> <-s FwVolumeSize>\n\n", UTILITY_NAME);\r
-\r
- //\r
- // Copyright declaration\r
- //\r
- fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
- //\r
- // Details Option\r
- //\r
- fprintf (stdout, "Options:\n");\r
- fprintf (stdout, " -f Input_file, --filename Input_file\n\\r
- Input_file is name of the BS Image INF file\n");\r
- fprintf (stdout, " -r BaseAddress, --baseaddr BaseAddress\n\\r
- BaseAddress is the starting address of Firmware Volume\n\\r
- where Boot Strapped Image will reside.\n");\r
- fprintf (stdout, " -s FwVolumeSize, --size FwVolumeSize\n\\r
- FwVolumeSize is the size of Firmware Volume.\n");\r
- fprintf (stdout, " -o FileName, --output FileName\n\\r
- File will be created to store the ouput content.\n");\r
- fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");\r
- fprintf (stdout, " --version Show program's version number and exit.\n");\r
- fprintf (stdout, " -h, --help Show this help message and exit.\n");\r
- fprintf (stdout, " -q, --quiet Disable all messages except FATAL ERRORS.\n");\r
- fprintf (stdout, " -d, --debug [#, 0-9] Enable debug messages at level #.\n");\r
-}\r
-\r
-int\r
-main (\r
- IN int argc,\r
- IN char **argv\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This utility uses GenVtf.dll to build a Boot Strap File Image which will be\r
- part of firmware volume image.\r
-\r
-Arguments:\r
-\r
- argc - The count of the parameters\r
- argv - The parameters\r
-\r
-\r
-Returns:\r
-\r
- 0 - No error conditions detected.\r
- 1 - One or more of the input parameters is invalid.\r
- 2 - A resource required by the utility was unavailable.\r
- - Most commonly this will be memory allocation or file creation.\r
- 3 - GenFvImage.dll could not be loaded.\r
- 4 - Error executing the GenFvImage dll.\r
- 5 - Now this tool does not support the IA32 platform\r
-\r
---*/\r
-{\r
- UINT8 Index;\r
- UINT64 StartAddress1;\r
- UINT64 StartAddress2;\r
- UINT64 FwVolSize1;\r
- UINT64 FwVolSize2;\r
- BOOLEAN FirstRoundO;\r
- BOOLEAN FirstRoundB;\r
- BOOLEAN FirstRoundS;\r
- EFI_STATUS Status;\r
- FILE *VtfFP;\r
- CHAR8 *VtfFileName;\r
-\r
- SetUtilityName (UTILITY_NAME);\r
-\r
- //\r
- // Initialize variables\r
- //\r
- StartAddress1 = 0;\r
- StartAddress2 = 0;\r
- FwVolSize1 = 0;\r
- FwVolSize2 = 0;\r
- FirstRoundB = TRUE;\r
- FirstRoundS = TRUE;\r
- FirstRoundO = TRUE;\r
- DebugMode = FALSE;\r
- OutFileName1 = NULL;\r
- OutFileName2 = NULL;\r
- VtfFP = NULL;\r
- DebugLevel = 0;\r
-\r
- //\r
- // Verify the correct number of arguments\r
- //\r
- if (argc == 1) {\r
- Usage();\r
- return 0;\r
- }\r
-\r
- if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {\r
- Usage();\r
- return 0;\r
- }\r
-\r
- if ((strcmp(argv[1], "--version") == 0)) {\r
- Version();\r
- return 0;\r
- }\r
-\r
- //\r
- // Parse the command line arguments\r
- //\r
- for (Index = 1; Index < argc; Index += 2) {\r
- if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
- if (argv[Index + 1] == NULL || argv[Index + 1][0] == '-') {\r
- Error (NULL, 0, 1003, "Invalid option value", "Output file is missing for -o option");\r
- goto ERROR;\r
- }\r
- //\r
- // Get the output file name\r
- //\r
- VTF_OUTPUT = TRUE;\r
- if (FirstRoundO) {\r
- //\r
- // It's the first output file name\r
- //\r
- OutFileName1 = (CHAR8 *)argv[Index+1];\r
- FirstRoundO = FALSE;\r
- } else {\r
- //\r
- //It's the second output file name\r
- //\r
- OutFileName2 = (CHAR8 *)argv[Index+1];\r
- }\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-f") == 0) || (stricmp (argv[Index], "--filename") == 0)) {\r
- if (argv[Index + 1] == NULL || argv[Index + 1][0] == '-') {\r
- Error (NULL, 0, 1003, "Invalid option value", "BS Image INF file is missing for -f option");\r
- goto ERROR;\r
- }\r
- //\r
- // Get the input VTF file name\r
- //\r
- VtfFileName = argv[Index+1];\r
- if (VtfFP != NULL) {\r
- //\r
- // VTF file name has been given previously, override with the new value\r
- //\r
- fclose (VtfFP);\r
- }\r
- VtfFP = fopen (LongFilePath (VtfFileName), "rb");\r
- if (VtfFP == NULL) {\r
- Error (NULL, 0, 0001, "Error opening file", VtfFileName);\r
- goto ERROR;\r
- }\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-r") == 0) || (stricmp (argv[Index], "--baseaddr") == 0)) {\r
- if (FirstRoundB) {\r
- Status = AsciiStringToUint64 (argv[Index + 1], FALSE, &StartAddress1);\r
- FirstRoundB = FALSE;\r
- } else {\r
- Status = AsciiStringToUint64 (argv[Index + 1], FALSE, &StartAddress2);\r
- }\r
- if (Status != EFI_SUCCESS) {\r
- Error (NULL, 0, 2000, "Invalid option value", "%s is Bad FV start address.", argv[Index + 1]);\r
- goto ERROR;\r
- }\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-s") == 0) || (stricmp (argv[Index], "--size") == 0)) {\r
- if (FirstRoundS) {\r
- Status = AsciiStringToUint64 (argv[Index + 1], FALSE, &FwVolSize1);\r
- FirstRoundS = FALSE;\r
- } else {\r
- Status = AsciiStringToUint64 (argv[Index + 1], FALSE, &FwVolSize2);\r
- SecondVTF = TRUE;\r
- }\r
-\r
- if (Status != EFI_SUCCESS) {\r
- Error (NULL, 0, 2000, "Invalid option value", "%s is Bad FV size.", argv[Index + 1]);\r
- goto ERROR;\r
- }\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-v") == 0) || (stricmp (argv[Index], "--verbose") == 0)) {\r
- VerboseMode = TRUE;\r
- Index--;\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-q") == 0) || (stricmp (argv[Index], "--quiet") == 0)) {\r
- QuietMode = TRUE;\r
- Index--;\r
- continue;\r
- }\r
-\r
- if ((stricmp (argv[Index], "-d") == 0) || (stricmp (argv[Index], "--debug") == 0)) {\r
- //\r
- // debug level specified\r
- //\r
- Status = AsciiStringToUint64(argv[Index + 1], FALSE, &DebugLevel);\r
- if (EFI_ERROR (Status)) {\r
- Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[Index], argv[Index + 1]);\r
- goto ERROR;\r
- }\r
- if (DebugLevel > 9) {\r
- Error (NULL, 0, 2000, "Invalid option value", "Unrecognized argument %s.", argv[Index + 1]);\r
- goto ERROR;\r
- }\r
- if((DebugLevel <= 9) &&(DebugLevel >= 5)) {\r
- DebugMode = TRUE;\r
- } else {\r
- DebugMode = FALSE;\r
- }\r
- continue;\r
- }\r
-\r
- Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized argument %s.", argv[Index]);\r
- goto ERROR;\r
- }\r
-\r
- if (VtfFP == NULL) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "No BS Image INF file is specified");\r
- goto ERROR;\r
- }\r
-\r
- if (FirstRoundB) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "No FV base address is specified");\r
- goto ERROR;\r
- }\r
-\r
- if (FirstRoundS) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "No FV Size is specified");\r
- goto ERROR;\r
- }\r
- //\r
- // All Parameters has been parsed, now set the message print level\r
- //\r
- if (QuietMode) {\r
- SetPrintLevel(40);\r
- } else if (VerboseMode) {\r
- SetPrintLevel(15);\r
- } else if (DebugMode) {\r
- SetPrintLevel(DebugLevel);\r
- }\r
-\r
- if (VerboseMode) {\r
- VerboseMsg("%s tool start.\n", UTILITY_NAME);\r
- }\r
-\r
- if (VTF_OUTPUT == FALSE) {\r
- if (SecondVTF == TRUE) {\r
- OutFileName1 = VTF_OUTPUT_FILE1;\r
- OutFileName2 = VTF_OUTPUT_FILE2;\r
- } else {\r
- OutFileName1 = VTF_OUTPUT_FILE1;\r
- }\r
- SymFileName = VTF_SYM_FILE;\r
- } else {\r
- INTN OutFileNameLen;\r
- INTN NewIndex;\r
-\r
- assert (OutFileName1);\r
- OutFileNameLen = strlen(OutFileName1);\r
-\r
- for (NewIndex = OutFileNameLen; NewIndex > 0; --NewIndex) {\r
- if (OutFileName1[NewIndex] == '/' || OutFileName1[NewIndex] == '\\') {\r
- break;\r
- }\r
- }\r
- if (NewIndex == 0) {\r
- SymFileName = VTF_SYM_FILE;\r
- } else {\r
- INTN SymFileNameLen = NewIndex + 1 + strlen(VTF_SYM_FILE);\r
- SymFileName = malloc(SymFileNameLen + 1);\r
- if (SymFileName == NULL) {\r
- Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
- goto ERROR;\r
- }\r
- memcpy(SymFileName, OutFileName1, NewIndex + 1);\r
- memcpy(SymFileName + NewIndex + 1, VTF_SYM_FILE, strlen(VTF_SYM_FILE));\r
- SymFileName[SymFileNameLen] = '\0';\r
- }\r
- if (DebugMode) {\r
- DebugMsg(UTILITY_NAME, 0, DebugLevel, SymFileName, NULL);\r
- }\r
- }\r
-\r
- //\r
- // Call the GenVtfImage\r
- //\r
- if (DebugMode) {\r
- DebugMsg(UTILITY_NAME, 0, DebugLevel, "Start to generate the VTF image\n", NULL);\r
- }\r
- Status = GenerateVtfImage (StartAddress1, FwVolSize1, StartAddress2, FwVolSize2, VtfFP);\r
-\r
- if (EFI_ERROR (Status)) {\r
- switch (Status) {\r
-\r
- case EFI_INVALID_PARAMETER:\r
- Error (NULL, 0, 2000, "Invalid parameter", "Invalid parameter passed to GenVtf function.");\r
- break;\r
-\r
- case EFI_ABORTED:\r
- Error (NULL, 0, 3000, "Invalid", "Error detected while creating the file image.");\r
- break;\r
-\r
- case EFI_OUT_OF_RESOURCES:\r
- Error (NULL, 0, 4002, "Resource", "GenVtfImage function could not allocate required resources.");\r
- break;\r
-\r
- case EFI_VOLUME_CORRUPTED:\r
- Error (NULL, 0, 3000, "Invalid", "No base address was specified.");\r
- break;\r
-\r
- default:\r
- Error (NULL, 0, 3000, "Invalid", "GenVtfImage function returned unknown status %x.", (int) Status );\r
- break;\r
- }\r
- }\r
-ERROR:\r
- if (VtfFP != NULL) {\r
- fclose (VtfFP);\r
- }\r
-\r
- if (DebugMode) {\r
- DebugMsg(UTILITY_NAME, 0, DebugLevel, "VTF image generated successful\n", NULL);\r
- }\r
-\r
- if (VerboseMode) {\r
- VerboseMsg("%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());\r
- }\r
- return GetUtilityStatus();\r
-}\r
+++ /dev/null
-{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}\r
-{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier New};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}\r
-{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Century Gothic};}\r
-{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt Times New Roman};}{\f41\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}\r
-{\f43\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana{\*\falt Verdana};}{\f113\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}\r
-{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}\r
-{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}\r
-{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}\r
-{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Century Gothic};}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}\r
-{\f258\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f259\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f261\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}\r
-{\f262\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f263\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f264\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}\r
-{\f265\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f266\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f278\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier New};}\r
-{\f279\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier New};}{\f281\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier New};}{\f282\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier New};}\r
-{\f283\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier New};}{\f284\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier New};}{\f285\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier New};}\r
-{\f286\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier New};}{\f390\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f598\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}\r
-{\f599\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f601\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f602\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f605\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}\r
-{\f606\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f628\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Century Gothic};}{\f629\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Century Gothic};}\r
-{\f631\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Century Gothic};}{\f632\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Century Gothic};}{\f635\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Century Gothic};}\r
-{\f636\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Century Gothic};}{\f648\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt Times New Roman};}{\f649\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt Times New Roman};}\r
-{\f651\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt Times New Roman};}{\f652\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt Times New Roman};}{\f653\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt Times New Roman};}\r
-{\f654\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt Times New Roman};}{\f655\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt Times New Roman};}{\f656\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt Times New Roman};}\r
-{\f657\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt Times New Roman};}{\f668\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f669\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f671\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}\r
-{\f672\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;}{\f675\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f676\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\f688\fbidi \fswiss\fcharset238\fprq2 Verdana CE{\*\falt Verdana};}\r
-{\f689\fbidi \fswiss\fcharset204\fprq2 Verdana Cyr{\*\falt Verdana};}{\f691\fbidi \fswiss\fcharset161\fprq2 Verdana Greek{\*\falt Verdana};}{\f692\fbidi \fswiss\fcharset162\fprq2 Verdana Tur{\*\falt Verdana};}\r
-{\f695\fbidi \fswiss\fcharset186\fprq2 Verdana Baltic{\*\falt Verdana};}{\f696\fbidi \fswiss\fcharset163\fprq2 Verdana (Vietnamese){\*\falt Verdana};}{\f1390\fbidi \fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}\r
-{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}\r
-{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}\r
-{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}\r
-{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}\r
-{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}\r
-{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}\r
-{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}\r
-{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}\r
-{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}\r
-{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}\r
-{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}\r
-{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}\r
-{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}\r
-{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}\r
-{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Century Gothic};}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Century Gothic};}\r
-{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Century Gothic};}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Century Gothic};}\r
-{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Century Gothic};}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Century Gothic};}\r
-{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}\r
-{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}\r
-{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}\r
-{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\r
-\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\r
-\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red8\green96\blue168;\red0\green127\blue127;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\r
-\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\f43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\f43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat heading 1;}{\s2\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \r
-\ltrch\fcs0 \fs24\lang1033\langfe1033\loch\f43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink16 \sqformat heading 2;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*\r
-\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1\r
-\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused \r
-Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs32 \ltrch\fcs0 \b\fs32\kerning32\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\ai\af0\afs28 \ltrch\fcs0 \r
-\b\i\fs28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\s17\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs16\alang1025 \ltrch\fcs0 \r
-\fs16\lang1033\langfe1033\loch\f39\hich\af39\dbch\af31505\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \slink18 \ssemihidden \sunhideused \styrsid11091224 Balloon Text;}{\*\cs18 \additive \rtlch\fcs1 \af39\afs16 \ltrch\fcs0 \f39\fs16 \r
-\sbasedon10 \slink17 \slocked \ssemihidden \styrsid11091224 Balloon Text Char;}{\*\cs19 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \sunhideused \styrsid4072718 annotation reference;}{\r
-\s20\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 \r
-\sbasedon0 \snext20 \slink21 \ssemihidden \sunhideused \styrsid4072718 annotation text;}{\*\cs21 \additive \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f43\fs20 \sbasedon10 \slink20 \slocked \ssemihidden \styrsid4072718 Comment Text Char;}{\r
-\s22\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 \r
-\sbasedon20 \snext20 \slink23 \ssemihidden \sunhideused \styrsid4072718 annotation subject;}{\*\cs23 \additive \rtlch\fcs1 \ab\af0\afs20 \ltrch\fcs0 \b\f43\fs20 \sbasedon21 \slink22 \slocked \ssemihidden \styrsid4072718 Comment Subject Char;}{\r
-\s24\ql \li0\ri20\sb60\sa60\sl-200\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin20\lin0\itap0 \rtlch\fcs1 \af0\afs16\alang1025 \ltrch\fcs0 \fs16\cf1\lang1033\langfe1033\loch\f43\hich\af43\dbch\af13\cgrid\langnp1033\langfenp1033 \r
-\sbasedon0 \snext24 \spriority0 \styrsid12480811 CellBodyLeft;}{\*\cs25 \additive \b\f2\cf13 \spriority0 \styrsid12480811 CodeCharacter;}{\*\ts26\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\r
-\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \r
-\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 \r
-\sbasedon11 \snext26 \spriority59 \styrsid12480811 Table Grid;}}{\*\revtbl {Unknown;}{Zhu, Yonghong;}}{\*\rsidtbl \rsid351840\rsid2906062\rsid3369612\rsid3607127\rsid4064336\rsid4072718\rsid4999604\rsid5056671\rsid5793818\rsid5911148\rsid7230979\rsid8326873\rsid8600807\rsid11091224\r
-\rsid12198464\rsid12480811\rsid13438422\rsid14880849\rsid15277707\rsid15819932}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator Zhu, Yonghong}\r
-{\creatim\yr2010\mo10\dy6\hr15\min21}{\revtim\yr2016\mo8\dy9\hr10\min29}{\version15}{\edmins1040}{\nofpages3}{\nofwords496}{\nofchars2832}{\nofcharsws3322}{\vern57441}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\r
-\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect \r
-\deftab360\widowctrl\ftnbj\aenddoc\revisions\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\r
-\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot13438422 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang \r
-{\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \hich )}}{\*\pnseclvl5\r
-\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl8\r
-\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\r
-\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \r
-\b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Name\r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf.exe - generate the Boot Strap File (AKA Volume Top File, or VTF) for IPF images\r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Synopsis\r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs18 \r
-\ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf.exe [}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid5056671 \hich\af43\dbch\af31505\loch\f43 -v | -q | -d}{\rtlch\fcs1 \r
-\ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid3607127 \hich\af43\dbch\af31505\loch\f43 ]}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid5056671 \hich\af43\dbch\af31505\loch\f43 \r
- }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid2906062 \hich\af43\dbch\af31505\loch\f43 [-o }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid15819932 \r
-\hich\af43\dbch\af31505\loch\f43 <}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid2906062 \hich\af43\dbch\af31505\loch\f43 OutputFile}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \r
-\b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid15819932 \hich\af43\dbch\af31505\loch\f43 >}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid2906062 \hich\af43\dbch\af31505\loch\f43 ] \hich\f43 \endash \r
-\hich\af43\dbch\af31505\loch\f43 f <FileName> -r <BaseAddr> -s <Size>}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid7230979 \r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid2906062 \hich\af43\dbch\af31505\loch\f43 GenVtf.exe \hich\f43 \endash \loch\f43 h\r
-\par \hich\af43\dbch\af31505\loch\f43 GenVtf.exe --version}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid2906062\charrsid351840 \r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Description\r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 generates}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \r
-\hich\af43\dbch\af31505\loch\f43 the Boot Strap File (AKA Volume Top File, or VTF) for IPF images. This utility }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 parses}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 the input BSF inf file and get}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 s}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \r
-\hich\af43\dbch\af31505\loch\f43 the component information. If all the\hich\af43\dbch\af31505\loch\f43 }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 required components are in a single }{\rtlch\fcs1 \r
-\af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 VTF file, then only one VTF Base Address and Size }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 is}{\rtlch\fcs1 \r
-\af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 needed and only one raw data output file and one symbol output file }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 (}{\r
-\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 which is the symbol of raw data}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 ) is needed}{\rtlch\fcs1 \r
-\af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 . If there}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 is a }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 component required }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 for the}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \r
-\hich\af43\dbch\af31505\loch\f43 the second V\hich\af43\dbch\af31505\loch\f43 TF file but there}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 is}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 no second VTF Base Address and Size specified in }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 the }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 command line interface, then this utility will exit with }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 a }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 related error message; if there}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 is a }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \r
-\hich\af43\dbch\af31505\loch\f43 second VTF Base Address and Size specified, then two raw data output files and one sym\hich\af43\dbch\af31505\loch\f43 bol output file}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \r
-\hich\af43\dbch\af31505\loch\f43 will be created}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 .\r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Options}{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \r
-\b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid3369612\charrsid12198464 \hich\af43\dbch\af31505\loch\f43 If no options ar}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid3369612 \hich\af43\dbch\af31505\loch\f43 e specified, tool prints usage.}{\rtlch\fcs1 \r
-\ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid4072718 \r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -f, --filename BS_INFFile\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Name of the BS Image INF file to use\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -r, --baseaddr hexaddress\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 The Base Address is the starting address of the Firmware Volume wh\hich\af43\dbch\af31505\loch\f43 ere the Boot Strapped Image will reside\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -s, --size Size\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 The size of the Firmware Volume\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -o, --output Filename\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 VTF Filename that will be created\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 --version\r
-\par }{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \tab }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Print version and copyright of this program and exit\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -v, --verbose\r
-\par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Turn on verbose outpu\hich\af43\dbch\af31505\loch\f43 \r
-t with informational messages printed. This is a count value, so specifying \hich\f43 \endash \loch\f43 vv can be used to increase the verbosity level.\r
-\par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -q, --quiet\r
-\par }{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \tab }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Disable all messages except FATAL ERRORS\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -d, --debug [#]\r
-\par }{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \tab }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Enable debug messages, at level #\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 -h, --help\r
-\par }{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \tab }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Print copyright, version and usage of this program and exit\r
-\par }\pard\plain \ltrpar\s2\ql \fi-1440\li0\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\tx0\tx1440\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid12480811 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid12480811\charrsid3607127 {\*\bkmkstart OLE_LINK7}{\*\bkmkstart OLE_LINK8}\hich\af43\dbch\af31505\loch\f43 \r
-Status codes returned\r
-\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts26\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \r
-\trftsWidth3\trwWidth8820\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5911148\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\r
-\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2970\clshdrawnil\clhidemark \cellx2862\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \r
-\cltxlrtb\clftsWidth3\clwWidth5850\clshdrawnil\clhidemark \cellx8712\pard\plain \ltrpar\s24\ql \li0\ri20\sb60\sa60\sl-200\slmult0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin20\lin0\pararsid5911148\yts26 \rtlch\fcs1 \r
-\af0\afs16\alang1025 \ltrch\fcs0 \fs16\cf1\lang1033\langfe1033\loch\af43\hich\af43\dbch\af13\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af2\afs18 \ltrch\fcs0 \r
-\cs25\b\f2\fs18\cf13\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811\charrsid8600807 \hich\af2\dbch\af13\loch\f2 STATUS_SUCCESS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12480811 \hich\af43\dbch\af13\loch\f43 }{\rtlch\fcs1 \ab\af2\afs18 \r
-\ltrch\fcs0 \cs25\b\f2\fs18\cf13\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811\charrsid4999604 \tab }{\rtlch\fcs1 \ab\af2\afs18 \ltrch\fcs0 \cs25\b\f2\fs18\cf13\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811 0}{\rtlch\fcs1 \r
-\ab\af2\afs18 \ltrch\fcs0 \cs25\b\f2\fs18\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811 \cell }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12480811 \hich\af43\dbch\af13\loch\f43 The action was completed as requested.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \r
-\kerning2\insrsid12480811 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\insrsid12480811 \trowd \irow0\irowband0\ltrrow\ts26\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\r
-\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \r
-\trftsWidth3\trwWidth8820\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5911148\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\r
-\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2970\clshdrawnil\clhidemark \cellx2862\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \r
-\cltxlrtb\clftsWidth3\clwWidth5850\clshdrawnil\clhidemark \cellx8712\row \ltrrow}\pard\plain \ltrpar\s24\ql \li0\ri20\sb60\sa60\sl-200\slmult0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin20\lin0\pararsid5911148\yts26 \rtlch\fcs1 \r
-\af0\afs16\alang1025 \ltrch\fcs0 \fs16\cf1\lang1033\langfe1033\loch\af43\hich\af43\dbch\af13\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af2\afs18 \ltrch\fcs0 \cs25\b\f2\fs18\cf13\kerning2\insrsid12480811\charrsid8600807 \hich\af2\dbch\af13\loch\f2 \r
-STATUS_ERROR}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12480811 \hich\af43\dbch\af13\loch\f43 }{\rtlch\fcs1 \ab\af2\afs18 \ltrch\fcs0 \cs25\b\f2\fs18\cf13\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811\charrsid4999604 \tab \tab }{\rtlch\fcs1 \r
-\ab\af2\afs18 \ltrch\fcs0 \cs25\b\f2\fs18\cf13\lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811 \hich\af2\dbch\af13\loch\f2 2}{\rtlch\fcs1 \af41\afs19 \ltrch\fcs0 \r
-\cs25\f41\fs19\cf0\lang1033\langfe2052\langfenp2052\insrsid12480811\charrsid8600807 \cell }\pard \ltrpar\s24\ql \li0\ri20\sb60\sa60\sl-200\slmult0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin20\lin0\pararsid15277707\yts26 {\r
-\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe2052\kerning2\langfenp2052\insrsid12480811 \hich\af43\dbch\af13\loch\f43 The action failed.\cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\r
-\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \r
-\fs20\insrsid12480811 \trowd \irow1\irowband1\lastrow \ltrrow\ts26\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \r
-\trftsWidth3\trwWidth8820\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5911148\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\r
-\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2970\clshdrawnil\clhidemark \cellx2862\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \r
-\cltxlrtb\clftsWidth3\clwWidth5850\clshdrawnil\clhidemark \cellx8712\row }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \r
-\ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 {\*\bkmkend OLE_LINK7}{\*\bkmkend OLE_LINK8}\hich\af43\dbch\af31505\loch\f43 Example}{\r
-\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Generate one VTF file with inf file name, base address and size specified in command line and without output filename specified. }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 Default}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 \hich\f43 filename \'93\loch\f43 \hich\f43 VTF1.RAW\'94\loch\f43 will be used.\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf \hich\f43 \endash \loch\f43 f bsf.inf \hich\f43 \endash \loch\f43 r 0xFFE00000 \hich\f43 \endash \loch\f43 s 0x200000\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Generate two VTF files with inf file name\hich\af43\dbch\af31505\loch\f43 \r
-, base address and size specified in command line and without output filename specified. }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 Default}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 \hich\f43 filename \'93\loch\f43 \hich\f43 VTF1.RAW\'94\loch\f43 \hich\f43 and \'93\loch\f43 \hich\f43 VTF2.RAW\'94\loch\f43 will be used.\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf \hich\f43 \endash \loch\f43 f bsf.inf \hich\f43 \endash \loch\f43 r 0xFFE00000 \hich\f43 \endash \loch\f43 s 0x200000 \hich\f43 \endash \loch\f43 \r
-r 0xFFD00000 \hich\f43 \endash \loch\f43 s 0x100000\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Generate one VTF file with inf file name,\hich\af43\dbch\af31505\loch\f43 base address and size specified in command line and output filename specified.\r
-\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf \hich\f43 \endash \loch\f43 o file.tmp \hich\f43 \endash \loch\f43 f bsf.inf \hich\f43 \endash \loch\f43 r 0xFFE00000 \hich\f43 \endash \loch\f43 \r
-s 0x200000\r
-\par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Generate two VTF files with inf file name, base address and size specified in command line and output filename specified.\r
-\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 GenVtf \hich\f43 \endash \loch\f43 o file1.tmp \hich\f43 \endash \loch\f43 o file2.tmp \hich\f43 \endash \loch\f43 f bsf.inf \hich\f43 \endash \loch\f43 \r
-r 0xFFE00000 \hich\f43 \endash \loch\f43 s 0x200000 \hich\f43 \endash \loch\f43 r 0xFFD00000 \hich\f43 \endash \loch\f43 s 0x100000\r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Bugs}{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \r
-\b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 No known bugs.\r
-\par \hich\af43\dbch\af31505\loch\f43 Report bugs to }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\revised\revauth1\revdttm1195920029\insrsid4064336\charrsid14420013 \hich\af43\dbch\af31505\loch\f43 edk2-\hich\af43\dbch\af31505\loch\f43 devel\r
-\hich\af43\dbch\af31505\loch\f43 @lists.01.\hich\af43\dbch\af31505\loch\f43 org}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \deleted\fs18\cf1\revauthdel1\revdttmdel1195920029\insrsid7230979\delrsid4064336 \hich\af43\dbch\af31505\loch\f43 edk\r
-\hich\af43\dbch\af31505\loch\f43 2-buildtools-devel@lists.sourceforge.net}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Files}{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \r
-\b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 None\r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 See}{\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \r
-\b\fs28\cf18\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 }{\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 also}{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \r
-\ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 None\r
-\par }\pard\plain \ltrpar\s2\ql \li-1440\ri0\sb400\sa60\sl-340\slmult0\keep\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin-1440\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \r
-\fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af43\afs28 \ltrch\fcs0 \b\fs28\cf17\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 License}{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \r
-\b\f0\fs28\cf18\insrsid7230979 \r
-\par }\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\loch\af43\hich\af43\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 Copyright (c) 1999 - }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid14880849 \hich\af43\dbch\af31505\loch\f43 201}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \r
-\fs18\cf1\lang1033\langfe2052\langfenp2052\insrsid351840 \hich\af43\dbch\af31505\loch\f43 1}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid7230979 \hich\af43\dbch\af31505\loch\f43 , Intel Corporation. All rights reserved.\r
-\par \hich\af43\dbch\af31505\loch\f43 This program and the accompanying materials\r
-\par \hich\af43\dbch\af31505\loch\f43 are licensed and made available under the terms and conditions of the BSD License\r
-\par \hich\af43\dbch\af31505\loch\f43 which accompanies this distribution. The full text of the license may be found at\r
-\par \hich\af43\dbch\af31505\loch\f43 http://opensource.org/licenses/bsd-license.php\tab \r
-\par \r
-\par \hich\af43\dbch\af31505\loch\f43 THE PROGRAM IS DISTRIBUTED UNDER THE BSD L\hich\af43\dbch\af31505\loch\f43 ICENSE ON AN "AS IS" BASIS,\r
-\par \hich\af43\dbch\af31505\loch\f43 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid7230979 \r
-\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a\r
-9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad\r
-5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6\r
-b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0\r
-0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6\r
-a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f\r
-c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512\r
-0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462\r
-a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865\r
-6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b\r
-4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b\r
-4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f\r
-7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87\r
-615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad\r
-79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b\r
-5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab\r
-999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9\r
-699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586\r
-8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6\r
-0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f\r
-9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be\r
-15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979\r
-3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d\r
-32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a\r
-f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86\r
-e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb\r
-44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a\r
-6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c\r
-3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256\r
-5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276\r
-b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8\r
-c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e\r
-51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95\r
-b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff\r
-6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6\r
-9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239\r
-b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449\r
-59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8\r
-2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468\r
-656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4\r
-350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624\r
-52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141\r
-73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000\r
-0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000\r
-000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019\r
-0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000\r
-000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027\r
-00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}\r
-{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d\r
-617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169\r
-6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363\r
-656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}\r
-{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\r
-\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\r
-\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\r
-\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\r
-\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\r
-\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\r
-\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\r
-\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\r
-\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\r
-\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\r
-\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\r
-\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\r
-\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\r
-\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\r
-\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\r
-\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\r
-\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\r
-\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\r
-\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\r
-\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;\r
-\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\r
-\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\r
-\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\r
-\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;\r
-\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;\r
-\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;\r
-\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;\r
-\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;\r
-\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;\r
-\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;\r
-\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;\r
-\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;\r
-\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;\r
-\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;\r
-\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;\r
-\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;\r
-\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;\r
-\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;\r
-\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;\r
-\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;\r
-\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;\r
-\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;\r
-\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;\r
-\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;\r
-\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;\r
-\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;\r
-\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;\r
-\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;\r
-\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000\r
-4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000\r
-d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r
-ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000007075\r
-46d3e5f1d101feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000\r
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000\r
-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000\r
-0000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file