/** @file\r
- EFI image format for PE32+. Please note some data structures are different\r
- for IA-32 and Itanium-based images, look for UINTN and the #ifdef EFI_IA64\r
+ EFI image format for PE32 and PE32+. Please note some data structures are \r
+ different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and \r
+ EFI_IMAGE_NT_HEADERS64 is for PE32+. \r
\r
- @bug Fix text - doc as defined in MSFT EFI specification.\r
+ This file is coded to the Visual Studio, Microsoft Portable Executable and \r
+ Common Object File Format Specification, Revision 8.0 - May 16, 2006. \r
\r
Copyright (c) 2006, Intel Corporation \r
All rights reserved. This program and the accompanying materials \r
#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10\r
#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11\r
#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12\r
+#define EFI_IMAGE_SUBSYSTEM_EFI_EFI_ROM 13\r
+\r
#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13\r
\r
-//\r
-// BugBug: Need to get a real answer for this problem. This is not in the\r
-// PE specification.\r
-//\r
-// A SAL runtime driver does not get fixed up when a transition to\r
-// virtual mode is made. In all other cases it should be treated\r
-// like a EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER image\r
-//\r
-#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13\r
\r
//\r
// PE32+ Machine type for EFI images\r
#define EFI_IMAGE_OS2_SIGNATURE 0x454E // NE\r
#define EFI_IMAGE_OS2_SIGNATURE_LE 0x454C // LE\r
#define EFI_IMAGE_NT_SIGNATURE 0x00004550 // PE00\r
-#define EFI_IMAGE_EDOS_SIGNATURE 0x44454550 // PEED\r
\r
///\r
/// PE images can start with an optional DOS header, so if an image is run\r
\r
///\r
/// @attention\r
-/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
-/// are for use ONLY by tools. All proper EFI code MUST use\r
-/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
+/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and \r
+/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary\r
+/// after NT additional fields.\r
///\r
#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b\r
\r
\r
///\r
/// @attention\r
-/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
-/// are for use ONLY by tools. All proper EFI code MUST use\r
-/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
+/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and \r
+/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary\r
+/// after NT additional fields.\r
///\r
#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b\r
\r
EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];\r
} EFI_IMAGE_OPTIONAL_HEADER64;\r
\r
+\r
///\r
/// @attention\r
/// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY\r
\r
#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)\r
\r
+\r
//\r
// Processor specific definition of EFI_IMAGE_OPTIONAL_HEADER so the\r
// type name EFI_IMAGE_OPTIONAL_HEADER is appropriate to the build. Same for\r
//\r
#if defined (MDE_CPU_IA32)\r
\r
-typedef EFI_IMAGE_OPTIONAL_HEADER32 EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS32 EFI_IMAGE_NT_HEADERS;\r
-\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC\r
#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
(((Machine) == EFI_IMAGE_MACHINE_IA32) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
\r
-#elif defined (MDE_CPU_IPF)\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_X64) \r
+\r
+//\r
+// @bug - Remove me when other package updated. \r
+//\r
+typedef EFI_IMAGE_NT_HEADERS32 EFI_IMAGE_NT_HEADERS;\r
\r
-typedef EFI_IMAGE_OPTIONAL_HEADER64 EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64 EFI_IMAGE_NT_HEADERS;\r
+#elif defined (MDE_CPU_IPF)\r
\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
(((Machine) == EFI_IMAGE_MACHINE_IPF) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
\r
-#elif defined (MDE_CPU_X64)\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) \r
\r
-typedef EFI_IMAGE_OPTIONAL_HEADER64 EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64 EFI_IMAGE_NT_HEADERS;\r
+#elif defined (MDE_CPU_X64)\r
\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
(((Machine) == EFI_IMAGE_MACHINE_X64) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_IA32) \r
+\r
+//\r
+// @bug - Remove me when other package updated. \r
+//\r
+typedef EFI_IMAGE_NT_HEADERS32 EFI_IMAGE_NT_HEADERS;\r
+\r
#elif defined (MDE_CPU_EBC)\r
\r
//\r
// It does not make sense to have a PE loader coded in EBC. You need to \r
// understand the basic \r
//\r
-typedef EFI_IMAGE_OPTIONAL_HEADER64 EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64 EFI_IMAGE_NT_HEADERS;\r
-\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_EBC)\r
\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) \r
+\r
#else\r
#error Unknown Processor Type\r
#endif\r
//\r
// I386 relocation types.\r
//\r
-#define EFI_IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary\r
-#define EFI_IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included\r
-#define EFI_IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address\r
-#define EFI_IMAGE_REL_I386_SECTION 012\r
-#define EFI_IMAGE_REL_I386_SECREL 013\r
-#define EFI_IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary\r
+#define EFI_IMAGE_REL_I386_DIR16 0x0001 // Direct 16-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_REL16 0x0002 // PC-relative 16-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_DIR32 0x0006 // Direct 32-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_DIR32NB 0x0007 // Direct 32-bit reference to the symbols virtual address, base not included\r
+#define EFI_IMAGE_REL_I386_SEG12 0x0009 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address\r
+#define EFI_IMAGE_REL_I386_SECTION 0x001a\r
+#define EFI_IMAGE_REL_I386_SECREL 0x000b\r
+#define EFI_IMAGE_REL_I386_REL32 0x0014 // PC-relative 32-bit reference to the symbols virtual address\r
+\r
+//\r
+// x64 processor relocation types.\r
+//\r
+#define IMAGE_REL_AMD64_ABSOLUTE 0x0000\r
+#define IMAGE_REL_AMD64_ADDR64 0x0001\r
+#define IMAGE_REL_AMD64_ADDR32 0x0002\r
+#define IMAGE_REL_AMD64_ADDR32NB 0x0003\r
+#define IMAGE_REL_AMD64_REL32 0x0004\r
+#define IMAGE_REL_AMD64_REL32_1 0x0005\r
+#define IMAGE_REL_AMD64_REL32_2 0x0006\r
+#define IMAGE_REL_AMD64_REL32_3 0x0007\r
+#define IMAGE_REL_AMD64_REL32_4 0x0008\r
+#define IMAGE_REL_AMD64_REL32_5 0x0009\r
+#define IMAGE_REL_AMD64_SECTION 0x000A\r
+#define IMAGE_REL_AMD64_SECREL 0x000B\r
+#define IMAGE_REL_AMD64_SECREL7 0x000C\r
+#define IMAGE_REL_AMD64_TOKEN 0x000D\r
+#define IMAGE_REL_AMD64_SREL32 0x000E\r
+#define IMAGE_REL_AMD64_PAIR 0x000F\r
+#define IMAGE_REL_AMD64_SSPAN32 0x0010\r
\r
///\r
/// Based relocation format.\r
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0\r
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1\r
\r
+\r
+//\r
+// Union of PE32, PE32+, and TE headers\r
+//\r
+typedef union {\r
+ EFI_IMAGE_NT_HEADERS32 Pe32;\r
+ EFI_IMAGE_NT_HEADERS64 Pe32Plus;\r
+ EFI_TE_IMAGE_HEADER Te;\r
+} EFI_IMAGE_OPTIONAL_HEADER_UNION;\r
+\r
+typedef union {\r
+ EFI_IMAGE_NT_HEADERS32 *Pe32;\r
+ EFI_IMAGE_NT_HEADERS64 *Pe32Plus;\r
+ EFI_TE_IMAGE_HEADER *Te;\r
+ EFI_IMAGE_OPTIONAL_HEADER_UNION *Union;\r
+} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;\r
+\r
#endif\r