\r
**/\r
\r
-//\r
-// Define the maximum debug and assert message length that this library supports \r
-//\r
-#define MAX_DEBUG_MESSAGE_LENGTH 0x100\r
-\r
/**\r
\r
Prints a debug message to the debug output device if the specified error level is enabled.\r
...\r
)\r
{\r
- CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
- VA_LIST Marker;\r
-\r
- //\r
- // If Format is NULL, then ASSERT().\r
- //\r
- ASSERT (Format != NULL);\r
-\r
- //\r
- // Print the assert message to a buffer\r
- //\r
- VA_START (Marker, Format);\r
- AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker);\r
- VA_END (Marker);\r
}\r
\r
\r
IN CONST CHAR8 *Description\r
)\r
{\r
- CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
-\r
- //\r
- // Print the assert message to a buffer\r
- //\r
- AsciiSPrint (Buffer, sizeof (Buffer), "ASSERT %s(%d): %s\n", FileName, LineNumber, Description);\r
-\r
- //\r
- // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings\r
- //\r
- if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {\r
- CpuBreakpoint ();\r
- } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {\r
- CpuDeadLoop ();\r
- }\r
}\r
\r
\r
IN UINTN Length\r
)\r
{\r
- //\r
- // If Buffer is NULL, then ASSERT().\r
- //\r
- ASSERT (Buffer != NULL);\r
-\r
- //\r
- // SetMem() checks for the the ASSERT() condition on Length and returns Buffer\r
- //\r
- return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue));\r
+ return Buffer;\r
}\r
\r
\r
VOID\r
)\r
{\r
- return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);\r
+ return FALSE;\r
}\r
\r
\r
VOID\r
)\r
{\r
- return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);\r
+ return FALSE;\r
}\r
\r
\r
VOID\r
)\r
{\r
- return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);\r
+ return FALSE;\r
}\r
\r
\r
VOID\r
)\r
{\r
- return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);\r
+ return FALSE;\r
}\r
);\r
\r
\r
+/**\r
+ Retrieves the magic value from the PE/COFF header.\r
+\r
+ @param Hdr The buffer in which to return the PE32, PE32+, or TE header.\r
+\r
+ @return EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC - Image is PE32\r
+ @return EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC - Image is PE32+\r
+\r
+**/\r
+UINT16\r
+PeCoffLoaderGetPeHeaderMagicValue (\r
+ IN EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr\r
+ )\r
+{\r
+ //\r
+ // NOTE: Some versions of Linux ELILO for Itanium have an incorrect magic value \r
+ // in the PE/COFF Header. If the MachineType is Itanium(IA64) and the \r
+ // Magic value in the OptionalHeader is EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC\r
+ // then override the returned value to EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
+ //\r
+ if (Hdr.Pe32->FileHeader.Machine == EFI_IMAGE_MACHINE_IA64 && Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ return EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
+ }\r
+ //\r
+ // Return the magic value from the PC/COFF Optional Header\r
+ //\r
+ return Hdr.Pe32->OptionalHeader.Magic;\r
+}\r
+\r
\r
/**\r
Retrieves the PE or TE Header from a PE/COFF or TE image.\r
RETURN_STATUS Status;\r
EFI_IMAGE_DOS_HEADER DosHdr;\r
UINTN Size;\r
+ UINT16 Magic;\r
\r
//\r
// Read the DOS image header to check for it's existance\r
ImageContext->IsTeImage = FALSE;\r
ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;\r
\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
+\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
\r
- } else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
+ } else if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
//\r
// Use PE32+ offset\r
//\r
EFI_IMAGE_SECTION_HEADER SectionHeader;\r
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY DebugEntry;\r
UINT32 NumberOfRvaAndSizes;\r
+ UINT16 Magic;\r
\r
if (NULL == ImageContext) {\r
return RETURN_INVALID_PARAMETER;\r
return Status;\r
}\r
\r
+ Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
+\r
//\r
// Retrieve the base address of the image\r
//\r
if (!(ImageContext->IsTeImage)) {\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
}\r
\r
if (!(ImageContext->IsTeImage)) {\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
CHAR8 *FixupData;\r
PHYSICAL_ADDRESS BaseAddress;\r
UINT32 NumberOfRvaAndSizes;\r
+ UINT16 Magic;\r
\r
ASSERT (ImageContext != NULL);\r
\r
\r
if (!(ImageContext->IsTeImage)) {\r
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+\r
+ Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
+\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
UINTN Size;\r
UINT32 TempDebugEntryRva;\r
UINT32 NumberOfRvaAndSizes;\r
+ UINT16 Magic;\r
\r
ASSERT (ImageContext != NULL);\r
\r
//\r
// Get image's entry point\r
//\r
+ Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
if (!(ImageContext->IsTeImage)) {\r
//\r
// Sizes of AddressOfEntryPoint are different so we need to do this safely\r
//\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
// the optional header to verify a desired directory entry is there.\r
//\r
if (!(ImageContext->IsTeImage)) {\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r
CHAR8 *FixupData;\r
UINTN Adjust;\r
RETURN_STATUS Status;\r
+ UINT16 Magic;\r
\r
OldBase = (CHAR8 *)((UINTN)ImageBase);\r
NewBase = (CHAR8 *)((UINTN)VirtImageBase);\r
return ;\r
}\r
\r
- //\r
- // Get some data from the PE type dependent data\r
- //\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
+\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
// Use PE32 offset\r
//\r