]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFv/GenFvInternalLib.h
Check In tool source code based on Build tool project revision r1655.
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFvInternalLib.h
diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.h b/BaseTools/Source/C/GenFv/GenFvInternalLib.h
new file mode 100644 (file)
index 0000000..d6b3ad7
--- /dev/null
@@ -0,0 +1,421 @@
+/** @file\r
+\r
+Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this 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
+Module Name:\r
+  \r
+  GenFvInternalLib.h\r
+\r
+Abstract:\r
+\r
+  This file contains describes the public interfaces to the GenFvImage Library.\r
+  The basic purpose of the library is to create Firmware Volume images.\r
+\r
+**/\r
+\r
+#ifndef _EFI_GEN_FV_INTERNAL_LIB_H\r
+#define _EFI_GEN_FV_INTERNAL_LIB_H\r
+\r
+//\r
+// Include files\r
+//\r
+#include <stdlib.h>\r
+\r
+#include <Common/UefiBaseTypes.h>\r
+#include <Common/UefiCapsule.h>\r
+\r
+#include <Common/PiFirmwareFile.h>\r
+#include <Common/PiFirmwareVolume.h>\r
+#include <Guid/PiFirmwareFileSystem.h>\r
+#include <IndustryStandard/PeImage.h>\r
+\r
+#include "CommonLib.h"\r
+#include "ParseInf.h"\r
+#include "EfiUtilityMsgs.h"\r
+\r
+//\r
+// Different file separater for Linux and Windows\r
+//\r
+#define FILE_SEP_CHAR '/'\r
+\r
+//\r
+// The maximum number of Pad file guid entries.\r
+//\r
+#define MAX_NUMBER_OF_PAD_FILE_GUIDS    1024\r
+\r
+//\r
+// The maximum number of block map entries supported by the library\r
+//\r
+#define MAX_NUMBER_OF_FV_BLOCKS         100\r
+\r
+//\r
+// The maximum number of files in the FV supported by the library\r
+//\r
+#define MAX_NUMBER_OF_FILES_IN_FV       1000\r
+#define MAX_NUMBER_OF_FILES_IN_CAP      1000\r
+#define EFI_FFS_FILE_HEADER_ALIGNMENT   8\r
+\r
+//\r
+// INF file strings\r
+//\r
+#define OPTIONS_SECTION_STRING            "[options]"\r
+#define ATTRIBUTES_SECTION_STRING         "[attributes]"\r
+#define FILES_SECTION_STRING              "[files]"\r
+\r
+//\r
+// Options section\r
+//\r
+#define EFI_FV_BASE_ADDRESS_STRING        "EFI_BASE_ADDRESS"\r
+#define EFI_FV_FILE_NAME_STRING           "EFI_FILE_NAME"\r
+#define EFI_NUM_BLOCKS_STRING             "EFI_NUM_BLOCKS"\r
+#define EFI_BLOCK_SIZE_STRING             "EFI_BLOCK_SIZE"\r
+#define EFI_GUID_STRING                   "EFI_GUID"\r
+#define EFI_FV_FILESYSTEMGUID_STRING      "EFI_FV_GUID"\r
+#define EFI_FV_NAMEGUID_STRING            "EFI_FVNAME_GUID" \r
+#define EFI_CAPSULE_GUID_STRING           "EFI_CAPSULE_GUID"\r
+#define EFI_CAPSULE_HEADER_SIZE_STRING    "EFI_CAPSULE_HEADER_SIZE"\r
+#define EFI_CAPSULE_FLAGS_STRING          "EFI_CAPSULE_FLAGS"\r
+#define EFI_CAPSULE_VERSION_STRING        "EFI_CAPSULE_VERSION"\r
+#define EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING    "EFI_BOOT_DRIVER_BASE_ADDRESS"\r
+#define EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING "EFI_RUNTIME_DRIVER_BASE_ADDRESS"\r
+\r
+#define EFI_FV_TOTAL_SIZE_STRING    "EFI_FV_TOTAL_SIZE"\r
+#define EFI_FV_TAKEN_SIZE_STRING    "EFI_FV_TAKEN_SIZE"\r
+#define EFI_FV_SPACE_SIZE_STRING    "EFI_FV_SPACE_SIZE"\r
+\r
+//\r
+// Attributes section\r
+//\r
+#define EFI_FVB2_READ_DISABLED_CAP_STRING  "EFI_READ_DISABLED_CAP"\r
+#define EFI_FVB2_READ_ENABLED_CAP_STRING   "EFI_READ_ENABLED_CAP"\r
+#define EFI_FVB2_READ_STATUS_STRING        "EFI_READ_STATUS"\r
+\r
+#define EFI_FVB2_WRITE_DISABLED_CAP_STRING "EFI_WRITE_DISABLED_CAP"\r
+#define EFI_FVB2_WRITE_ENABLED_CAP_STRING  "EFI_WRITE_ENABLED_CAP"\r
+#define EFI_FVB2_WRITE_STATUS_STRING       "EFI_WRITE_STATUS"\r
+\r
+#define EFI_FVB2_LOCK_CAP_STRING           "EFI_LOCK_CAP"\r
+#define EFI_FVB2_LOCK_STATUS_STRING        "EFI_LOCK_STATUS"\r
+\r
+#define EFI_FVB2_STICKY_WRITE_STRING       "EFI_STICKY_WRITE"\r
+#define EFI_FVB2_MEMORY_MAPPED_STRING      "EFI_MEMORY_MAPPED"\r
+#define EFI_FVB2_ERASE_POLARITY_STRING     "EFI_ERASE_POLARITY"\r
+\r
+#define EFI_FVB2_READ_LOCK_CAP_STRING      "EFI_READ_LOCK_CAP"\r
+#define EFI_FVB2_READ_LOCK_STATUS_STRING   "EFI_READ_LOCK_STATUS"\r
+#define EFI_FVB2_WRITE_LOCK_CAP_STRING     "EFI_WRITE_LOCK_CAP"\r
+#define EFI_FVB2_WRITE_LOCK_STATUS_STRING  "EFI_WRITE_LOCK_STATUS"\r
+\r
+#define EFI_FVB2_ALIGNMENT_1_STRING       "EFI_FVB2_ALIGNMENT_1"   \r
+#define EFI_FVB2_ALIGNMENT_2_STRING       "EFI_FVB2_ALIGNMENT_2"   \r
+#define EFI_FVB2_ALIGNMENT_4_STRING       "EFI_FVB2_ALIGNMENT_4"   \r
+#define EFI_FVB2_ALIGNMENT_8_STRING       "EFI_FVB2_ALIGNMENT_8"   \r
+#define EFI_FVB2_ALIGNMENT_16_STRING      "EFI_FVB2_ALIGNMENT_16"  \r
+#define EFI_FVB2_ALIGNMENT_32_STRING      "EFI_FVB2_ALIGNMENT_32"  \r
+#define EFI_FVB2_ALIGNMENT_64_STRING      "EFI_FVB2_ALIGNMENT_64"  \r
+#define EFI_FVB2_ALIGNMENT_128_STRING     "EFI_FVB2_ALIGNMENT_128" \r
+#define EFI_FVB2_ALIGNMENT_256_STRING     "EFI_FVB2_ALIGNMENT_256" \r
+#define EFI_FVB2_ALIGNMENT_512_STRING     "EFI_FVB2_ALIGNMENT_512" \r
+#define EFI_FVB2_ALIGNMENT_1K_STRING      "EFI_FVB2_ALIGNMENT_1K"  \r
+#define EFI_FVB2_ALIGNMENT_2K_STRING      "EFI_FVB2_ALIGNMENT_2K"  \r
+#define EFI_FVB2_ALIGNMENT_4K_STRING      "EFI_FVB2_ALIGNMENT_4K"  \r
+#define EFI_FVB2_ALIGNMENT_8K_STRING      "EFI_FVB2_ALIGNMENT_8K"  \r
+#define EFI_FVB2_ALIGNMENT_16K_STRING     "EFI_FVB2_ALIGNMENT_16K" \r
+#define EFI_FVB2_ALIGNMENT_32K_STRING     "EFI_FVB2_ALIGNMENT_32K" \r
+#define EFI_FVB2_ALIGNMENT_64K_STRING     "EFI_FVB2_ALIGNMENT_64K" \r
+#define EFI_FVB2_ALIGNMENT_128K_STRING    "EFI_FVB2_ALIGNMENT_128K"\r
+#define EFI_FVB2_ALIGNMENT_256K_STRING    "EFI_FVB2_ALIGNMENT_256K"\r
+#define EFI_FVB2_ALIGNMNET_512K_STRING    "EFI_FVB2_ALIGNMENT_512K"\r
+#define EFI_FVB2_ALIGNMENT_1M_STRING      "EFI_FVB2_ALIGNMENT_1M"  \r
+#define EFI_FVB2_ALIGNMENT_2M_STRING      "EFI_FVB2_ALIGNMENT_2M"  \r
+#define EFI_FVB2_ALIGNMENT_4M_STRING      "EFI_FVB2_ALIGNMENT_4M"  \r
+#define EFI_FVB2_ALIGNMENT_8M_STRING      "EFI_FVB2_ALIGNMENT_8M"  \r
+#define EFI_FVB2_ALIGNMENT_16M_STRING     "EFI_FVB2_ALIGNMENT_16M" \r
+#define EFI_FVB2_ALIGNMENT_32M_STRING     "EFI_FVB2_ALIGNMENT_32M" \r
+#define EFI_FVB2_ALIGNMENT_64M_STRING     "EFI_FVB2_ALIGNMENT_64M" \r
+#define EFI_FVB2_ALIGNMENT_128M_STRING    "EFI_FVB2_ALIGNMENT_128M"\r
+#define EFI_FVB2_ALIGNMENT_256M_STRING    "EFI_FVB2_ALIGNMENT_256M"\r
+#define EFI_FVB2_ALIGNMENT_512M_STRING    "EFI_FVB2_ALIGNMENT_512M"\r
+#define EFI_FVB2_ALIGNMENT_1G_STRING      "EFI_FVB2_ALIGNMENT_1G"  \r
+#define EFI_FVB2_ALIGNMENT_2G_STRING      "EFI_FVB2_ALIGNMENT_2G"  \r
+\r
+//\r
+// File sections\r
+//\r
+#define EFI_FILE_NAME_STRING      "EFI_FILE_NAME"\r
+\r
+#define ONE_STRING                "1"\r
+#define ZERO_STRING               "0"\r
+#define TRUE_STRING               "TRUE"\r
+#define FALSE_STRING              "FALSE"\r
+#define NULL_STRING               "NULL"\r
+\r
+//\r
+// VTF (Firmware Volume Top File) signatures\r
+//\r
+#define IA32_X64_VTF_SIGNATURE_OFFSET    0x14\r
+#define IA32_X64_VTF0_SIGNATURE EFI_SIGNATURE_32('V','T','F',0)\r
+\r
+//\r
+// Defines to calculate the offset for PEI CORE entry points\r
+//\r
+#define IA32_PEI_CORE_ENTRY_OFFSET    0x20\r
+\r
+//\r
+// Defines to calculate the offset for IA32 SEC CORE entry point\r
+//\r
+#define IA32_SEC_CORE_ENTRY_OFFSET     0xD\r
+\r
+//\r
+// Defines to calculate the FIT table\r
+//\r
+#define IPF_FIT_ADDRESS_OFFSET        0x20\r
+\r
+//\r
+// Defines to calculate the offset for SALE_ENTRY\r
+//\r
+#define IPF_SALE_ENTRY_ADDRESS_OFFSET 0x18\r
+\r
+//\r
+// Symbol file definitions, current max size if 512K\r
+//\r
+#define SYMBOL_FILE_SIZE              0x80000\r
+\r
+#define FV_IMAGES_TOP_ADDRESS         0x100000000ULL\r
+\r
+//\r
+// Following definition is used for FIT in IPF\r
+//\r
+#define COMP_TYPE_FIT_PEICORE 0x10\r
+#define COMP_TYPE_FIT_UNUSED  0x7F\r
+\r
+#define FIT_TYPE_MASK         0x7F\r
+#define CHECKSUM_BIT_MASK     0x80\r
+\r
+//\r
+// Rebase File type\r
+//\r
+#define REBASE_XIP_FILE       0x1\r
+#define REBASE_BOOTTIME_FILE  0x2\r
+#define REBASE_RUNTIME_FILE   0x4\r
+\r
+//\r
+// Private data types\r
+//\r
+//\r
+// Component information\r
+//\r
+typedef struct {\r
+  UINTN Size;\r
+  CHAR8 ComponentName[_MAX_PATH];\r
+} COMPONENT_INFO;\r
+\r
+//\r
+// FV and capsule information holder\r
+//\r
+typedef struct {\r
+  BOOLEAN                 BaseAddressSet;\r
+  EFI_PHYSICAL_ADDRESS    BaseAddress;\r
+  EFI_PHYSICAL_ADDRESS    BootBaseAddress;\r
+  EFI_PHYSICAL_ADDRESS    RuntimeBaseAddress;  \r
+  EFI_GUID                FvFileSystemGuid;\r
+  BOOLEAN                 FvFileSystemGuidSet;\r
+  EFI_GUID                FvNameGuid;\r
+  BOOLEAN                 FvNameGuidSet;\r
+  UINTN                   Size;\r
+  EFI_FVB_ATTRIBUTES      FvAttributes;\r
+  CHAR8                   FvName[_MAX_PATH];\r
+  EFI_FV_BLOCK_MAP_ENTRY  FvBlocks[MAX_NUMBER_OF_FV_BLOCKS];\r
+  CHAR8                   FvFiles[MAX_NUMBER_OF_FILES_IN_FV][_MAX_PATH];\r
+  UINT32                  SizeofFvFiles[MAX_NUMBER_OF_FILES_IN_FV];\r
+  BOOLEAN                 IsPiFvImage;\r
+} FV_INFO;\r
+\r
+typedef struct {\r
+  EFI_GUID                CapGuid;\r
+  UINT32                  HeaderSize;\r
+  UINT32                  Flags;\r
+  CHAR8                   CapName[_MAX_PATH];\r
+  CHAR8                   CapFiles[MAX_NUMBER_OF_FILES_IN_CAP][_MAX_PATH];\r
+} CAP_INFO;\r
+\r
+#pragma pack(1)\r
+\r
+typedef struct {\r
+  UINT64  CompAddress;\r
+  UINT32  CompSize;\r
+  UINT16  CompVersion;\r
+  UINT8   CvAndType;\r
+  UINT8   CheckSum;\r
+} FIT_TABLE;\r
+\r
+#pragma pack()\r
+\r
+#define FV_DEFAULT_ATTRIBUTE  0x0004FEFF\r
+extern FV_INFO    mFvDataInfo;\r
+extern CAP_INFO   mCapDataInfo;\r
+extern EFI_GUID   mEfiFirmwareFileSystem2Guid;\r
+extern UINT32     mFvTotalSize;\r
+extern UINT32     mFvTakenSize;\r
+//\r
+// Local function prototypes\r
+//\r
+EFI_STATUS\r
+ParseFvInf (\r
+  IN  MEMORY_FILE  *InfFile,\r
+  OUT FV_INFO      *FvInfo\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+UpdatePeiCoreEntryInFit (\r
+  IN FIT_TABLE     *FitTablePtr,\r
+  IN UINT64        PeiCorePhysicalAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function is used to update the Pei Core address in FIT, this can be used by Sec core to pass control from\r
+  Sec to Pei Core\r
+\r
+Arguments:\r
+\r
+  FitTablePtr             - The pointer of FIT_TABLE.\r
+  PeiCorePhysicalAddress  - The address of Pei Core entry.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             - The PEI_CORE FIT entry was updated successfully.\r
+  EFI_NOT_FOUND           - Not found the PEI_CORE FIT entry.\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+UpdateFitCheckSum (\r
+  IN FIT_TABLE   *FitTablePtr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function is used to update the checksum for FIT.\r
+\r
+\r
+Arguments:\r
+\r
+  FitTablePtr             - The pointer of FIT_TABLE.\r
+\r
+Returns:\r
+\r
+  None.\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+GetPe32Info (\r
+  IN UINT8                  *Pe32,\r
+  OUT UINT32                *EntryPoint,\r
+  OUT UINT32                *BaseOfCode,\r
+  OUT UINT16                *MachineType\r
+  );\r
+\r
+EFI_STATUS\r
+ParseCapInf (\r
+  IN  MEMORY_FILE  *InfFile,\r
+  OUT CAP_INFO     *CapInfo\r
+  );\r
+\r
+EFI_STATUS\r
+FindApResetVectorPosition (\r
+  IN  MEMORY_FILE  *FvImage,\r
+  OUT UINT8        **Pointer\r
+  ); \r
+\r
+EFI_STATUS\r
+CalculateFvSize (\r
+  FV_INFO *FvInfoPtr\r
+  );\r
+\r
+EFI_STATUS\r
+FfsRebase ( \r
+  IN OUT  FV_INFO               *FvInfo, \r
+  IN      CHAR8                 *FileName,           \r
+  IN OUT  EFI_FFS_FILE_HEADER   *FfsFile,\r
+  IN      UINTN                 XipOffset,\r
+  IN      FILE                  *FvMapFile\r
+  );\r
+\r
+//\r
+// Exported function prototypes\r
+//\r
+EFI_STATUS\r
+GenerateCapImage (\r
+  IN CHAR8                *InfFileImage,\r
+  IN UINTN                InfFileSize,\r
+  IN CHAR8                *CapFileName\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This is the main function which will be called from application to \r
+  generate UEFI Capsule image.\r
+\r
+Arguments:\r
+\r
+  InfFileImage   Buffer containing the INF file contents.\r
+  InfFileSize    Size of the contents of the InfFileImage buffer.\r
+  CapFileName    Requested name for the Cap file.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             Function completed successfully.\r
+  EFI_OUT_OF_RESOURCES    Could not allocate required resources.\r
+  EFI_ABORTED             Error encountered.\r
+  EFI_INVALID_PARAMETER   A required parameter was NULL.\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+GenerateFvImage (\r
+  IN CHAR8                *InfFileImage,\r
+  IN UINTN                InfFileSize,\r
+  IN CHAR8                *FvFileName,  \r
+  IN CHAR8                *MapFileName\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This is the main function which will be called from application to \r
+  generate Firmware Image conforms to PI spec.\r
+\r
+Arguments:\r
+\r
+  InfFileImage   Buffer containing the INF file contents.\r
+  InfFileSize    Size of the contents of the InfFileImage buffer.\r
+  FvFileName     Requested name for the FV file.\r
+  MapFileName    Fv map file to log fv driver information.\r
+    \r
+Returns:\r
\r
+  EFI_SUCCESS             Function completed successfully.\r
+  EFI_OUT_OF_RESOURCES    Could not allocate required resources.\r
+  EFI_ABORTED             Error encountered.\r
+  EFI_INVALID_PARAMETER   A required parameter was NULL.\r
+\r
+--*/\r
+;\r
+\r
+#endif\r