#include "Support.h"\r
#include "Debug.h"\r
#include "PeLoader.h"\r
+#include "TianoDecompress.h"\r
+\r
+STATIC\r
+VOID\r
+SystemHang(\r
+ VOID\r
+ )\r
+{\r
+ CHAR8 PrintBuffer[256];\r
+ AsciiSPrint (PrintBuffer, 256, "## FATEL ERROR ##: Fail to load DUET images! System hang!\n");\r
+ CpuDeadLoop();\r
+}\r
\r
VOID\r
EfiLoader (\r
UINTN BfvPageNumber;\r
UINTN BfvBase;\r
EFI_MAIN_ENTRYPOINT EfiMainEntrypoint;\r
+ CHAR8 PrintBuffer[256];\r
static EFILDRHANDOFF Handoff;\r
\r
-PrintHeader ('A');\r
-\r
ClearScreen();\r
- PrintString("EFI Loader\n");\r
+ \r
+ PrintHeader ('A');\r
\r
-// PrintString("&BiosMemoryMapBaseAddress = "); \r
-// PrintValue64 ((UINT64)(&BiosMemoryMapBaseAddress));\r
-// PrintString(" BiosMemoryMapBaseAddress = "); \r
-// PrintValue(BiosMemoryMapBaseAddress);\r
-// PrintString("\n");\r
+ AsciiSPrint (PrintBuffer, 256, "Enter DUET Loader ...\n", BiosMemoryMapBaseAddress);\r
+ PrintString (PrintBuffer);\r
+\r
+ AsciiSPrint (PrintBuffer, 256, "BiosMemoryMapBaseAddress = 0x%x\n", BiosMemoryMapBaseAddress);\r
+ PrintString (PrintBuffer);\r
\r
//\r
// Add all EfiConventionalMemory descriptors to the table. If there are partial pages, then\r
NumberOfMemoryMapEntries = 0;\r
GenMemoryMap (&NumberOfMemoryMapEntries, EfiMemoryDescriptor, BiosMemoryMap);\r
\r
+ AsciiSPrint (PrintBuffer, 256, "Get %d entries of memory map!\n", NumberOfMemoryMapEntries);\r
+ PrintString (PrintBuffer);\r
+\r
//\r
// Get information on where the image is in memory\r
//\r
EFILDRHeader = (EFILDR_HEADER *)(UINTN)(EFILDR_HEADER_ADDRESS);\r
EFILDRImage = (EFILDR_IMAGE *)(UINTN)(EFILDR_HEADER_ADDRESS + sizeof(EFILDR_HEADER));\r
\r
-PrintHeader ('D');\r
\r
//\r
// Point to the 4th image (Bfv)\r
// Decompress the image\r
//\r
\r
- Status = UefiDecompressGetInfo (\r
- NULL, \r
+ AsciiSPrint (PrintBuffer, 256, "Decompress BFV image, Image Address=0x%x! Offset=0x%x\n", \r
+ (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
+ EFILDRImage->Offset);\r
+ PrintString (PrintBuffer);\r
+\r
+ Status = TianoGetInfo (\r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
&DestinationSize, \r
&ScratchSize\r
);\r
+\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for BFV!\n");\r
+ PrintString (PrintBuffer);\r
+ SystemHang();\r
}\r
\r
Status = TianoDecompress (\r
- NULL, \r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
(VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
(VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
ScratchSize\r
);\r
+\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ AsciiSPrint (PrintBuffer, 256, "Fail to decompress BFV!\n");\r
+ PrintString (PrintBuffer);\r
+ SystemHang();\r
}\r
\r
BfvPageNumber = EFI_SIZE_TO_PAGES (DestinationSize);\r
BfvBase = (UINTN) FindSpace (BfvPageNumber, &NumberOfMemoryMapEntries, EfiMemoryDescriptor, EfiRuntimeServicesData, EFI_MEMORY_WB);\r
if (BfvBase == 0) {\r
- CpuDeadLoop();\r
+ SystemHang();\r
}\r
ZeroMem ((VOID *)(UINTN)BfvBase, BfvPageNumber * EFI_PAGE_SIZE);\r
CopyMem ((VOID *)(UINTN)BfvBase, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize);\r
\r
-PrintHeader ('B');\r
+ PrintHeader ('B');\r
\r
//\r
// Point to the 2nd image (DxeIpl)\r
//\r
// Decompress the image\r
//\r
+ AsciiSPrint (PrintBuffer, 256, "Decompress DxeIpl image, Image Address=0x%x! Offset=0x%x\n", \r
+ (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
+ EFILDRImage->Offset);\r
\r
- Status = UefiDecompressGetInfo (\r
- NULL, \r
+ Status = TianoGetInfo (\r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
&DestinationSize, \r
&ScratchSize\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for DxeIpl!\n");\r
+ PrintString (PrintBuffer);\r
+ SystemHang();\r
}\r
\r
Status = TianoDecompress (\r
- NULL, \r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
(VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
ScratchSize\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ AsciiSPrint (PrintBuffer, 256, "Fail to decompress DxeIpl image\n");\r
+ PrintString (PrintBuffer);\r
+ SystemHang();\r
}\r
\r
+ AsciiSPrint (PrintBuffer, 256, "Start load DxeIpl PE image\n");\r
+ PrintString (PrintBuffer); \r
+\r
//\r
// Load and relocate the EFI PE/COFF Firmware Image \r
//\r
EfiMemoryDescriptor\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ AsciiSPrint (PrintBuffer, 256, "Fail to load and relocate DxeIpl PE image!\n");\r
+ PrintString (PrintBuffer);\r
+ SystemHang();\r
}\r
\r
// PrintString("Image.NoPages = "); \r
// Decompress the image\r
//\r
\r
- Status = UefiDecompressGetInfo (\r
- NULL, \r
+ Status = TianoGetInfo (\r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
&DestinationSize, \r
&ScratchSize\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ SystemHang();\r
}\r
\r
Status = TianoDecompress (\r
- NULL, \r
(VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
EFILDRImage->Length,\r
(VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
ScratchSize\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ SystemHang();\r
}\r
\r
//\r
EfiMemoryDescriptor\r
);\r
if (EFI_ERROR (Status)) {\r
- CpuDeadLoop();\r
+ SystemHang();\r
}\r
\r
PrintHeader ('E');\r
// There was a problem loading the image, so HALT the system.\r
//\r
\r
- CpuDeadLoop();\r
+ SystemHang();\r
}\r
\r