/** @file | |
Hob command for EBL (Embedded Boot Loader) | |
Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> | |
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: Hob.c | |
Search/Replace Dir with the name of your new command | |
Boot Mode: | |
========== | |
BOOT_WITH_FULL_CONFIGURATION 0x00 | |
BOOT_WITH_MINIMAL_CONFIGURATION 0x01 | |
BOOT_ASSUMING_NO_CONFIGURATION_CHANGES 0x02 | |
BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS 0x03 | |
BOOT_WITH_DEFAULT_SETTINGS 0x04 | |
BOOT_ON_S4_RESUME 0x05 | |
BOOT_ON_S5_RESUME 0x06 | |
BOOT_ON_S2_RESUME 0x10 | |
BOOT_ON_S3_RESUME 0x11 | |
BOOT_ON_FLASH_UPDATE 0x12 | |
BOOT_IN_RECOVERY_MODE 0x20 | |
BOOT_IN_RECOVERY_MODE_MASK 0x40 | |
BOOT_SPECIAL_MASK 0x80 | |
Mem Alloc HOB Type: | |
=================== | |
typedef enum { | |
EfiReservedMemoryType = 0x00 | |
EfiLoaderCode = 0x01 | |
EfiLoaderData = 0x02 | |
EfiBootServicesCode = 0x03 | |
EfiBootServicesData = 0x04 | |
EfiRuntimeServicesCode = 0x05 | |
EfiRuntimeServicesData = 0x06 | |
EfiConventionalMemory = 0x07 | |
EfiUnusableMemory = 0x08 | |
EfiACPIReclaimMemory = 0x09 | |
EfiACPIMemoryNVS = 0x0a | |
EfiMemoryMappedIO = 0x0b | |
EfiMemoryMappedIOPortSpace = 0x0c | |
EfiPalCode = 0x0d | |
EfiMaxMemoryType = 0x0e | |
} EFI_MEMORY_TYPE; | |
Resource Hob Tye: | |
================= | |
EFI_RESOURCE_SYSTEM_MEMORY 0 | |
EFI_RESOURCE_MEMORY_MAPPED_IO 1 | |
EFI_RESOURCE_IO 2 | |
EFI_RESOURCE_FIRMWARE_DEVICE 3 | |
EFI_RESOURCE_MEMORY_MAPPED_IO_PORT 4 | |
EFI_RESOURCE_MEMORY_RESERVED 5 | |
EFI_RESOURCE_IO_RESERVED 6 | |
EFI_RESOURCE_MAX_MEMORY_TYPE 7 | |
Resource Hob Attribute (last thing printed): | |
============================================ | |
EFI_RESOURCE_ATTRIBUTE_PRESENT 0x00000001 | |
EFI_RESOURCE_ATTRIBUTE_INITIALIZED 0x00000002 | |
EFI_RESOURCE_ATTRIBUTE_TESTED 0x00000004 | |
EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC 0x00000008 | |
EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC 0x00000010 | |
EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 0x00000020 | |
EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 0x00000040 | |
EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED 0x00000080 | |
EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED 0x00000100 | |
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED 0x00000200 | |
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE 0x00000400 | |
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE 0x00000800 | |
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE 0x00001000 | |
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE 0x00002000 | |
EFI_RESOURCE_ATTRIBUTE_16_BIT_IO 0x00004000 | |
EFI_RESOURCE_ATTRIBUTE_32_BIT_IO 0x00008000 | |
EFI_RESOURCE_ATTRIBUTE_64_BIT_IO 0x00010000 | |
EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED 0x00020000 | |
**/ | |
#include "Ebl.h" | |
// BugBug: Autogen does not allow this to be included currently | |
//#include <EdkModulePkg/Include/EdkDxe.h> | |
GLOBAL_REMOVE_IF_UNREFERENCED char *mHobResourceType[] = { | |
"Memory ", | |
"MMIO ", | |
"IO ", | |
"Firmware ", | |
"MMIO Port ", | |
"Reserved ", | |
"IO Reserved", | |
"Illegal " | |
}; | |
/** | |
Dump out the HOBs in the system. HOBs are defined in the PI specification | |
and they are used to hand off information from PEI to DXE. | |
Argv[0] - "hob" | |
@param Argc Number of command arguments in Argv | |
@param Argv Array of strings that represent the parsed command line. | |
Argv[0] is the command name | |
@return EFI_SUCCESS | |
**/ | |
EFI_STATUS | |
EblHobCmd ( | |
IN UINTN Argc, | |
IN CHAR8 **Argv | |
) | |
{ | |
UINTN CurrentRow; | |
EFI_PEI_HOB_POINTERS Hob; | |
EFI_MEMORY_TYPE_INFORMATION *EfiMemoryTypeInformation; | |
UINTN Index; | |
CurrentRow = 0; | |
for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) { | |
if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) { | |
AsciiPrint ("PHIT HOB Ver %x Boot Mode %02x Top %lx Bottom %lx\n", | |
Hob.HandoffInformationTable->Version, | |
Hob.HandoffInformationTable->BootMode, | |
Hob.HandoffInformationTable->EfiMemoryTop, | |
Hob.HandoffInformationTable->EfiMemoryBottom | |
); | |
if (EblAnyKeyToContinueQtoQuit (&CurrentRow, FALSE)) { | |
return EFI_SUCCESS; | |
} | |
AsciiPrint (" Free Top %lx Free Bottom %lx End Of HOB %lx\n", | |
Hob.HandoffInformationTable->EfiFreeMemoryTop, | |
Hob.HandoffInformationTable->EfiFreeMemoryBottom, | |
Hob.HandoffInformationTable->EfiEndOfHobList | |
); | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) { | |
// mod(%) on array index is just to prevent buffer overrun | |
AsciiPrint ("Mem Alloc HOB %a %g %08lx:%lx\n", | |
(Hob.MemoryAllocation->AllocDescriptor.MemoryType < EfiMaxMemoryType) ? gMemMapType[Hob.MemoryAllocation->AllocDescriptor.MemoryType] : "ILLEGAL TYPE", | |
&Hob.MemoryAllocation->AllocDescriptor.Name, | |
Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress, | |
Hob.MemoryAllocation->AllocDescriptor.MemoryLength | |
); | |
if (CompareGuid (&gEfiHobMemoryAllocModuleGuid, &Hob.MemoryAllocation->AllocDescriptor.Name)) { | |
if (EblAnyKeyToContinueQtoQuit (&CurrentRow, FALSE)) { | |
return EFI_SUCCESS; | |
} | |
AsciiPrint (" Module Name %g EntryPoint %lx\n", &Hob.MemoryAllocationModule->ModuleName, Hob.MemoryAllocationModule->EntryPoint); | |
} | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { | |
AsciiPrint ("Resource HOB %a %g %08lx:%lx\n Attributes: %08x\n", | |
(Hob.ResourceDescriptor->ResourceType < EFI_RESOURCE_MAX_MEMORY_TYPE) ? mHobResourceType[Hob.ResourceDescriptor->ResourceType] : mHobResourceType[EFI_RESOURCE_MAX_MEMORY_TYPE], | |
&Hob.ResourceDescriptor->Owner, | |
Hob.ResourceDescriptor->PhysicalStart, | |
Hob.ResourceDescriptor->ResourceLength, | |
Hob.ResourceDescriptor->ResourceAttribute | |
); | |
if (EblAnyKeyToContinueQtoQuit (&CurrentRow, FALSE)) { | |
return EFI_SUCCESS; | |
} | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) { | |
AsciiPrint ("GUID HOB %g\n", &Hob.Guid->Name); | |
if (CompareGuid (&gEfiMemoryTypeInformationGuid, &Hob.Guid->Name)) { | |
EfiMemoryTypeInformation = GET_GUID_HOB_DATA (Hob.Guid); | |
for (Index = 0; Index < (GET_GUID_HOB_DATA_SIZE (Hob.Guid)/sizeof (EFI_MEMORY_TYPE_INFORMATION)); Index++, EfiMemoryTypeInformation++) { | |
if (EblAnyKeyToContinueQtoQuit (&CurrentRow, FALSE)) { | |
return EFI_SUCCESS; | |
} | |
AsciiPrint (" %a 0x%08x\n", | |
(EfiMemoryTypeInformation->Type < EfiMaxMemoryType) ? gMemMapType[EfiMemoryTypeInformation->Type] : "END ", | |
EfiMemoryTypeInformation->NumberOfPages | |
); | |
} | |
} | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_FV) { | |
AsciiPrint ("FV HOB %08lx:%08lx\n", Hob.FirmwareVolume->BaseAddress, Hob.FirmwareVolume->Length); | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_CPU) { | |
AsciiPrint ("CPU HOB: Mem %x IO %x\n", Hob.Cpu->SizeOfMemorySpace, Hob.Cpu->SizeOfIoSpace); | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_POOL) { | |
AsciiPrint ("Mem Pool HOB:\n"); | |
/* Not in PI | |
} else if (Hob.Header->HobType == EFI_HOB_TYPE_CV) { | |
AsciiPrint ("CV HOB: %08lx:%08lx\n", Hob.CapsuleVolume->BaseAddress, Hob.CapsuleVolume->Length); | |
*/ | |
} | |
if (EblAnyKeyToContinueQtoQuit (&CurrentRow, FALSE)) { | |
break; | |
} | |
} | |
return EFI_SUCCESS; | |
} | |
GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mCmdHobTemplate[] = | |
{ | |
{ | |
"hob", | |
"; dump HOBs", | |
NULL, | |
EblHobCmd | |
} | |
}; | |
/** | |
Initialize the commands in this in this file | |
**/ | |
VOID | |
EblInitializeHobCmd ( | |
VOID | |
) | |
{ | |
if (FeaturePcdGet (PcdEmbeddedHobCmd)) { | |
EblAddCommands (mCmdHobTemplate, sizeof (mCmdHobTemplate)/sizeof (EBL_COMMAND_TABLE)); | |
} | |
} | |