This patch enhances error handling and reporting in the CM ObjectParser. Specifically: 1. ObjectIDs used as array indexes are checked for being out of bounds, and if so an error message is printed before the assert. 2. An error message is printed for unsupported NameSpaceIDs. 3. Adds support for unimplemented parsers by allowing IDs to list a NULL parser, resulting in an unimplemented message being printed. Signed-off-by: Jeshua Smith <jeshuas@nvidia.com> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			1136 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1136 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Configuration Manager Object parser.
 | 
						|
 | 
						|
  Copyright (c) 2021 - 2023, ARM Limited. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <ConfigurationManagerObject.h>
 | 
						|
#include "ConfigurationManagerObjectParser.h"
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintString (
 | 
						|
  CONST CHAR8  *Format,
 | 
						|
  UINT8        *Ptr
 | 
						|
  );
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintStringPtr (
 | 
						|
  CONST CHAR8  *Format,
 | 
						|
  UINT8        *Ptr
 | 
						|
  );
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar4 (
 | 
						|
  CONST CHAR8  *Format,
 | 
						|
  UINT8        *Ptr
 | 
						|
  );
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar6 (
 | 
						|
  CONST CHAR8  *Format,
 | 
						|
  UINT8        *Ptr
 | 
						|
  );
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar8 (
 | 
						|
  CONST CHAR8  *Format,
 | 
						|
  UINT8        *Ptr
 | 
						|
  );
 | 
						|
 | 
						|
/** A parser for EArmObjBootArchInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmBootArchInfoParser[] = {
 | 
						|
  { "BootArchFlags", 2, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPowerManagementProfileInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPowerManagementProfileInfoParser[] = {
 | 
						|
  { "PowerManagementProfile", 1, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicCInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicCInfoParser[] = {
 | 
						|
  { "CPUInterfaceNumber",            4,                        "0x%x",   NULL },
 | 
						|
  { "AcpiProcessorUid",              4,                        "0x%x",   NULL },
 | 
						|
  { "Flags",                         4,                        "0x%x",   NULL },
 | 
						|
  { "ParkingProtocolVersion",        4,                        "0x%x",   NULL },
 | 
						|
  { "PerformanceInterruptGsiv",      4,                        "0x%x",   NULL },
 | 
						|
  { "ParkedAddress",                 8,                        "0x%llx", NULL },
 | 
						|
  { "PhysicalBaseAddress",           8,                        "0x%llx", NULL },
 | 
						|
  { "GICV",                          8,                        "0x%llx", NULL },
 | 
						|
  { "GICH",                          8,                        "0x%llx", NULL },
 | 
						|
  { "VGICMaintenanceInterrupt",      4,                        "0x%x",   NULL },
 | 
						|
  { "GICRBaseAddress",               8,                        "0x%llx", NULL },
 | 
						|
  { "MPIDR",                         8,                        "0x%llx", NULL },
 | 
						|
  { "ProcessorPowerEfficiencyClass", 1,                        "0x%x",   NULL },
 | 
						|
  { "SpeOverflowInterrupt",          2,                        "0x%x",   NULL },
 | 
						|
  { "ProximityDomain",               4,                        "0x%x",   NULL },
 | 
						|
  { "ClockDomain",                   4,                        "0x%x",   NULL },
 | 
						|
  { "AffinityFlags",                 4,                        "0x%x",   NULL },
 | 
						|
  { "CpcToken",                      sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicDInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicDInfoParser[] = {
 | 
						|
  { "PhysicalBaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "SystemVectorBase",    4, "0x%x",   NULL },
 | 
						|
  { "GicVersion",          1, "0x%x",   NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicMsiFrameInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicMsiFrameInfoParser[] = {
 | 
						|
  { "GicMsiFrameId",       4, "0x%x",   NULL },
 | 
						|
  { "PhysicalBaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "Flags",               4, "0x%x",   NULL },
 | 
						|
  { "SPICount",            2, "0x%x",   NULL },
 | 
						|
  { "SPIBase",             2, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicRedistributorInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicRedistInfoParser[] = {
 | 
						|
  { "DiscoveryRangeBaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "DiscoveryRangeLength",      4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicItsInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicItsInfoParser[] = {
 | 
						|
  { "GicItsId",            4, "0x%x",   NULL },
 | 
						|
  { "PhysicalBaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "ProximityDomain",     4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjSerialConsolePortInfo,
 | 
						|
    EArmObjSerialDebugPortInfo and EArmObjSerialPortInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmSerialPortInfoParser[] = {
 | 
						|
  { "BaseAddress",       8, "0x%llx", NULL },
 | 
						|
  { "Interrupt",         4, "0x%x",   NULL },
 | 
						|
  { "BaudRate",          8, "0x%llx", NULL },
 | 
						|
  { "Clock",             4, "0x%x",   NULL },
 | 
						|
  { "PortSubtype",       2, "0x%x",   NULL },
 | 
						|
  { "BaseAddressLength", 8, "0x%llx", NULL },
 | 
						|
  { "AccessSize",        1, "0x%d",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGenericTimerInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGenericTimerInfoParser[] = {
 | 
						|
  { "CounterControlBaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "CounterReadBaseAddress",    8, "0x%llx", NULL },
 | 
						|
  { "SecurePL1TimerGSIV",        4, "0x%x",   NULL },
 | 
						|
  { "SecurePL1TimerFlags",       4, "0x%x",   NULL },
 | 
						|
  { "NonSecurePL1TimerGSIV",     4, "0x%x",   NULL },
 | 
						|
  { "NonSecurePL1TimerFlags",    4, "0x%x",   NULL },
 | 
						|
  { "VirtualTimerGSIV",          4, "0x%x",   NULL },
 | 
						|
  { "VirtualTimerFlags",         4, "0x%x",   NULL },
 | 
						|
  { "NonSecurePL2TimerGSIV",     4, "0x%x",   NULL },
 | 
						|
  { "NonSecurePL2TimerFlags",    4, "0x%x",   NULL },
 | 
						|
  { "VirtualPL2TimerGSIV",       4, "0x%x",   NULL },
 | 
						|
  { "VirtualPL2TimerFlags",      4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPlatformGTBlockInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGTBlockInfoParser[] = {
 | 
						|
  { "GTBlockPhysicalAddress", 8,                        "0x%llx", NULL },
 | 
						|
  { "GTBlockTimerFrameCount", 4,                        "0x%x",   NULL },
 | 
						|
  { "GTBlockTimerFrameToken", sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGTBlockTimerFrameInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGTBlockTimerFrameInfoParser[] = {
 | 
						|
  { "FrameNumber",               1, "0x%x",   NULL },
 | 
						|
  { "PhysicalAddressCntBase",    8, "0x%llx", NULL },
 | 
						|
  { "PhysicalAddressCntEL0Base", 8, "0x%llx", NULL },
 | 
						|
  { "PhysicalTimerGSIV",         4, "0x%x",   NULL },
 | 
						|
  { "PhysicalTimerFlags",        4, "0x%x",   NULL },
 | 
						|
  { "VirtualTimerGSIV",          4, "0x%x",   NULL },
 | 
						|
  { "VirtualTimerFlags",         4, "0x%x",   NULL },
 | 
						|
  { "CommonFlags",               4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPlatformGenericWatchdogInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGenericWatchdogInfoParser[] = {
 | 
						|
  { "ControlFrameAddress", 8, "0x%llx", NULL },
 | 
						|
  { "RefreshFrameAddress", 8, "0x%llx", NULL },
 | 
						|
  { "TimerGSIV",           4, "0x%x",   NULL },
 | 
						|
  { "Flags",               4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPciConfigSpaceInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPciConfigSpaceInfoParser[] = {
 | 
						|
  { "BaseAddress",           8,                        "0x%llx", NULL },
 | 
						|
  { "PciSegmentGroupNumber", 2,                        "0x%x",   NULL },
 | 
						|
  { "StartBusNumber",        1,                        "0x%x",   NULL },
 | 
						|
  { "EndBusNumber",          1,                        "0x%x",   NULL },
 | 
						|
  { "AddressMapToken",       sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "InterruptMapToken",     sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjHypervisorVendorIdentity.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmHypervisorVendorIdParser[] = {
 | 
						|
  { "HypervisorVendorId", 8, "0x%llx", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjFixedFeatureFlags.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmFixedFeatureFlagsParser[] = {
 | 
						|
  { "Flags", 4, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjItsGroup.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmItsGroupNodeParser[] = {
 | 
						|
  { "Token",      sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "ItsIdCount", 4,                        "0x%x", NULL },
 | 
						|
  { "ItsIdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "Identifier", 4,                        "0x%x", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjNamedComponent.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmNamedComponentNodeParser[] = {
 | 
						|
  { "Token",             sizeof (CM_OBJECT_TOKEN), "0x%p", NULL           },
 | 
						|
  { "IdMappingCount",    4,                        "0x%x", NULL           },
 | 
						|
  { "IdMappingToken",    sizeof (CM_OBJECT_TOKEN), "0x%p", NULL           },
 | 
						|
  { "Flags",             4,                        "0x%x", NULL           },
 | 
						|
  { "CacheCoherent",     4,                        "0x%x", NULL           },
 | 
						|
  { "AllocationHints",   1,                        "0x%x", NULL           },
 | 
						|
  { "MemoryAccessFlags", 1,                        "0x%x", NULL           },
 | 
						|
  { "AddressSizeLimit",  1,                        "0x%x", NULL           },
 | 
						|
  { "ObjectName",        sizeof (CHAR8 *),         NULL,   PrintStringPtr },
 | 
						|
  { "Identifier",        4,                        "0x%x", NULL           },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjRootComplex.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmRootComplexNodeParser[] = {
 | 
						|
  { "Token",             sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "IdMappingCount",    4,                        "0x%x", NULL },
 | 
						|
  { "IdMappingToken",    sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "CacheCoherent",     4,                        "0x%x", NULL },
 | 
						|
  { "AllocationHints",   1,                        "0x%x", NULL },
 | 
						|
  { "MemoryAccessFlags", 1,                        "0x%x", NULL },
 | 
						|
  { "AtsAttribute",      4,                        "0x%x", NULL },
 | 
						|
  { "PciSegmentNumber",  4,                        "0x%x", NULL },
 | 
						|
  { "MemoryAddressSize", 1,                        "0x%x", NULL },
 | 
						|
  { "PasidCapabilities", 2,                        "0x%x", NULL },
 | 
						|
  { "Flags",             4,                        "0x%x", NULL },
 | 
						|
  { "Identifier",        4,                        "0x%x", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjSmmuV1SmmuV2.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmSmmuV1SmmuV2NodeParser[] = {
 | 
						|
  { "Token",                 sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "IdMappingCount",        4,                        "0x%x",   NULL },
 | 
						|
  { "IdMappingToken",        sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "BaseAddress",           8,                        "0x%llx", NULL },
 | 
						|
  { "Span",                  8,                        "0x%llx", NULL },
 | 
						|
  { "Model",                 4,                        "0x%x",   NULL },
 | 
						|
  { "Flags",                 4,                        "0x%x",   NULL },
 | 
						|
  { "ContextInterruptCount", 4,                        "0x%x",   NULL },
 | 
						|
  { "ContextInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "PmuInterruptCount",     4,                        "0x%x",   NULL },
 | 
						|
  { "PmuInterruptToken",     sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "SMMU_NSgIrpt",          4,                        "0x%x",   NULL },
 | 
						|
  { "SMMU_NSgIrptFlags",     4,                        "0x%x",   NULL },
 | 
						|
  { "SMMU_NSgCfgIrpt",       4,                        "0x%x",   NULL },
 | 
						|
  { "SMMU_NSgCfgIrptFlags",  4,                        "0x%x",   NULL },
 | 
						|
  { "Identifier",            4,                        "0x%x",   NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjSmmuV3.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmSmmuV3NodeParser[] = {
 | 
						|
  { "Token",                sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "IdMappingCount",       4,                        "0x%x",   NULL },
 | 
						|
  { "IdMappingToken",       sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "BaseAddress",          8,                        "0x%llx", NULL },
 | 
						|
  { "Flags",                4,                        "0x%x",   NULL },
 | 
						|
  { "VatosAddress",         8,                        "0x%llx", NULL },
 | 
						|
  { "Model",                4,                        "0x%x",   NULL },
 | 
						|
  { "EventInterrupt",       4,                        "0x%x",   NULL },
 | 
						|
  { "PriInterrupt",         4,                        "0x%x",   NULL },
 | 
						|
  { "GerrInterrupt",        4,                        "0x%x",   NULL },
 | 
						|
  { "SyncInterrupt",        4,                        "0x%x",   NULL },
 | 
						|
  { "ProximityDomain",      4,                        "0x%x",   NULL },
 | 
						|
  { "DeviceIdMappingIndex", 4,                        "0x%x",   NULL },
 | 
						|
  { "Identifier",           4,                        "0x%x",   NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPmcg.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPmcgNodeParser[] = {
 | 
						|
  { "Token",             sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "IdMappingCount",    4,                        "0x%x",   NULL },
 | 
						|
  { "IdMappingToken",    sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "BaseAddress",       8,                        "0x%llx", NULL },
 | 
						|
  { "OverflowInterrupt", 4,                        "0x%x",   NULL },
 | 
						|
  { "Page1BaseAddress",  8,                        "0x%llx", NULL },
 | 
						|
  { "ReferenceToken",    sizeof (CM_OBJECT_TOKEN), "0x%p",   NULL },
 | 
						|
  { "Identifier",        4,                        "0x%x",   NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGicItsIdentifierArray.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGicItsIdentifierParser[] = {
 | 
						|
  { "ItsId", 4, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjIdMappingArray.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmIdMappingParser[] = {
 | 
						|
  { "InputBase",            4,                        "0x%x", NULL },
 | 
						|
  { "NumIds",               4,                        "0x%x", NULL },
 | 
						|
  { "OutputBase",           4,                        "0x%x", NULL },
 | 
						|
  { "OutputReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "Flags",                4,                        "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjSmmuInterruptArray.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGenericInterruptParser[] = {
 | 
						|
  { "Interrupt", 4, "0x%x", NULL },
 | 
						|
  { "Flags",     4, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjProcHierarchyInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmProcHierarchyInfoParser[] = {
 | 
						|
  { "Token",                      sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "Flags",                      4,                        "0x%x", NULL },
 | 
						|
  { "ParentToken",                sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "GicCToken",                  sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "NoOfPrivateResources",       4,                        "0x%x", NULL },
 | 
						|
  { "PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "LpiToken",                   sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "OverrideNameUidEnabled",     1,                        "%d",   NULL },
 | 
						|
  { "OverrideName",               2,                        "0x%x", NULL },
 | 
						|
  { "OverrideUid",                4,                        "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjCacheInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmCacheInfoParser[] = {
 | 
						|
  { "Token",                 sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "NextLevelOfCacheToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "Size",                  4,                        "0x%x", NULL },
 | 
						|
  { "NumberOfSets",          4,                        "0x%x", NULL },
 | 
						|
  { "Associativity",         4,                        "0x%x", NULL },
 | 
						|
  { "Attributes",            1,                        "0x%x", NULL },
 | 
						|
  { "LineSize",              2,                        "0x%x", NULL },
 | 
						|
  { "CacheId",               4,                        "0x%x", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjProcNodeIdInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmProcNodeIdInfoParser[] = {
 | 
						|
  { "Token",    sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "VendorId", 4,                        "0x%p", NULL },
 | 
						|
  { "Level1Id", 8,                        "0x%x", NULL },
 | 
						|
  { "Level2Id", 8,                        "0x%x", NULL },
 | 
						|
  { "MajorRev", 2,                        "0x%x", NULL },
 | 
						|
  { "MinorRev", 2,                        "0x%x", NULL },
 | 
						|
  { "SpinRev",  2,                        "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjCmRef.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmObjRefParser[] = {
 | 
						|
  { "ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjMemoryAffinityInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmMemoryAffinityInfoParser[] = {
 | 
						|
  { "ProximityDomain", 4, "0x%x",   NULL },
 | 
						|
  { "BaseAddress",     8, "0x%llx", NULL },
 | 
						|
  { "Length",          8, "0x%llx", NULL },
 | 
						|
  { "Flags",           4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjDeviceHandleAcpi.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmDeviceHandleAcpiParser[] = {
 | 
						|
  { "Hid", 8, "0x%llx", NULL },
 | 
						|
  { "Uid", 4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjDeviceHandlePci.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmDeviceHandlePciParser[] = {
 | 
						|
  { "SegmentNumber",  2, "0x%x", NULL },
 | 
						|
  { "BusNumber",      1, "0x%x", NULL },
 | 
						|
  { "DeviceNumber",   1, "0x%x", NULL },
 | 
						|
  { "FunctionNumber", 1, "0x%x", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjGenericInitiatorAffinityInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmGenericInitiatorAffinityInfoParser[] = {
 | 
						|
  { "ProximityDomain",   4,                        "0x%x", NULL },
 | 
						|
  { "Flags",             4,                        "0x%x", NULL },
 | 
						|
  { "DeviceHandleType",  1,                        "0x%x", NULL },
 | 
						|
  { "DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjCmn600Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmCmn600InfoParser[] = {
 | 
						|
  { "PeriphBaseAddress",       8, "0x%llx", NULL },
 | 
						|
  { "PeriphBaseAddressLength", 8, "0x%llx", NULL },
 | 
						|
  { "RootNodeBaseAddress",     8, "0x%llx", NULL },
 | 
						|
  { "DtcCount",                1, "0x%x",   NULL },
 | 
						|
  { "DtcInterrupt[0]",         4, "0x%x",   NULL },
 | 
						|
  { "DtcFlags[0]",             4, "0x%x",   NULL },
 | 
						|
  { "DtcInterrupt[1]",         4, "0x%x",   NULL },
 | 
						|
  { "DtcFlags[1]",             4, "0x%x",   NULL },
 | 
						|
  { "DtcInterrupt[2]",         4, "0x%x",   NULL },
 | 
						|
  { "DtcFlags[2]",             4, "0x%x",   NULL },
 | 
						|
  { "DtcInterrupt[3]",         4, "0x%x",   NULL },
 | 
						|
  { "DtcFlags[3]",             4, "0x%x",   NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for the EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE structure.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  AcpiGenericAddressParser[] = {
 | 
						|
  { "AddressSpaceId",    1, "%d",     NULL },
 | 
						|
  { "RegisterBitWidth",  1, "%d",     NULL },
 | 
						|
  { "RegisterBitOffset", 1, "%d",     NULL },
 | 
						|
  { "AccessSize",        1, "%d",     NULL },
 | 
						|
  { "Address",           8, "0x%llx", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjLpiInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmLpiInfoParser[] = {
 | 
						|
  { "MinResidency",             4,                                               "0x%x",   NULL        },
 | 
						|
  { "WorstCaseWakeLatency",     4,                                               "0x%x",   NULL        },
 | 
						|
  { "Flags",                    4,                                               "0x%x",   NULL        },
 | 
						|
  { "ArchFlags",                4,                                               "0x%x",   NULL        },
 | 
						|
  { "ResCntFreq",               4,                                               "0x%x",   NULL        },
 | 
						|
  { "EnableParentState",        4,                                               "0x%x",   NULL        },
 | 
						|
  { "IsInteger",                1,                                               "%d",     NULL        },
 | 
						|
  { "IntegerEntryMethod",       8,                                               "0x%llx", NULL        },
 | 
						|
  { "RegisterEntryMethod",      sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "ResidencyCounterRegister", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "UsageCounterRegister",     sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "StateName",                16,                                              NULL,     PrintString },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPciAddressMapInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPciAddressMapInfoParser[] = {
 | 
						|
  { "SpaceCode",   1, "%d",     NULL },
 | 
						|
  { "PciAddress",  8, "0x%llx", NULL },
 | 
						|
  { "CpuAddress",  8, "0x%llx", NULL },
 | 
						|
  { "AddressSize", 8, "0x%llx", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPciInterruptMapInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmPciInterruptMapInfoParser[] = {
 | 
						|
  { "PciBus",        1,                                 "0x%x", NULL },
 | 
						|
  { "PciDevice",     1,                                 "0x%x", NULL },
 | 
						|
  { "PciInterrupt",  1,                                 "0x%x", NULL },
 | 
						|
  { "IntcInterrupt", sizeof (CM_ARM_GENERIC_INTERRUPT),
 | 
						|
    NULL, NULL, CmArmGenericInterruptParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjRmr.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmRmrInfoParser[] = {
 | 
						|
  { "Token",             sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "IdMappingCount",    4,                        "0x%x", NULL },
 | 
						|
  { "IdMappingToken",    sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
  { "Identifier",        4,                        "0x%x", NULL },
 | 
						|
  { "Flags",             4,                        "0x%x", NULL },
 | 
						|
  { "MemRangeDescCount", 4,                        "0x%x", NULL },
 | 
						|
  { "MemRangeDescToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjMemoryRangeDescriptor.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmMemoryRangeDescriptorInfoParser[] = {
 | 
						|
  { "BaseAddress", 8, "0x%llx", NULL },
 | 
						|
  { "Length",      8, "0x%llx", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjCpcInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmCpcInfoParser[] = {
 | 
						|
  { "Revision",                              4,                                               "0x%lx", NULL },
 | 
						|
  { "HighestPerformanceBuffer",              sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "HighestPerformanceInteger",             4,                                               "0x%lx", NULL },
 | 
						|
  { "NominalPerformanceBuffer",              sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "NominalPerformanceInteger",             4,                                               "0x%lx", NULL },
 | 
						|
  { "LowestNonlinearPerformanceBuffer",      sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "LowestNonlinearPerformanceInteger",     4,                                               "0x%lx", NULL },
 | 
						|
  { "LowestPerformanceBuffer",               sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "LowestPerformanceInteger",              4,                                               "0x%lx", NULL },
 | 
						|
  { "GuaranteedPerformanceRegister",         sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "DesiredPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "MinimumPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "MaximumPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "PerformanceReductionToleranceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "TimeWindowRegister",                    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "CounterWraparoundTimeBuffer",           sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "CounterWraparoundTimeInteger",          4,                                               "0x%lx", NULL },
 | 
						|
  { "ReferencePerformanceCounterRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "DeliveredPerformanceCounterRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "PerformanceLimitedRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "CPPCEnableRegister",                    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "AutonomousSelectionEnableBuffer",       sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "AutonomousSelectionEnableInteger",      4,                                               "0x%lx", NULL },
 | 
						|
  { "AutonomousActivityWindowRegister",      sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "EnergyPerformancePreferenceRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "ReferencePerformanceBuffer",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "ReferencePerformanceInteger",           4,                                               "0x%lx", NULL },
 | 
						|
  { "LowestFrequencyBuffer",                 sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "LowestFrequencyInteger",                4,                                               "0x%lx", NULL },
 | 
						|
  { "NominalFrequencyBuffer",                sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
 | 
						|
    NULL, NULL, AcpiGenericAddressParser,
 | 
						|
    ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "NominalFrequencyInteger",               4,                                               "0x%lx", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for the PCC_MAILBOX_REGISTER_INFO struct.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmMailboxRegisterInfoParser[] = {
 | 
						|
  { "Register",     sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), NULL,     NULL,
 | 
						|
    AcpiGenericAddressParser, ARRAY_SIZE (AcpiGenericAddressParser) },
 | 
						|
  { "PreserveMask", 8,                                               "0x%llx", NULL },
 | 
						|
  { "WriteMask",    8,                                               "0x%llx", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for the PCC_SUBSPACE_CHANNEL_TIMING_INFO struct.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceChannelTimingInfoParser[] = {
 | 
						|
  { "NominalLatency",           4, "0x%x", NULL },
 | 
						|
  { "MaxPeriodicAccessRate",    4, "0x%x", NULL },
 | 
						|
  { "MinRequestTurnaroundTime", 2, "0x%x", NULL },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPccSubspaceType0Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType0InfoParser[] = {
 | 
						|
  { "SubspaceId",    1,                                         "0x%x",   NULL },
 | 
						|
  { "Type",          1,                                         "0x%x",   NULL },
 | 
						|
  { "BaseAddress",   8,                                         "0x%llx", NULL },
 | 
						|
  { "AddressLength", 8,                                         "0x%llx", NULL },
 | 
						|
  { "DoorbellReg",   sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
  { "ChannelTiming", sizeof (PCC_SUBSPACE_CHANNEL_TIMING_INFO),
 | 
						|
    NULL, NULL, CmArmPccSubspaceChannelTimingInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceChannelTimingInfoParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPccSubspaceType1Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType1InfoParser[] = {
 | 
						|
  { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
 | 
						|
    NULL, NULL, CmArmPccSubspaceType0InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
 | 
						|
  { "PlatIrq",        sizeof (CM_ARM_GENERIC_INTERRUPT),
 | 
						|
    NULL, NULL, CmArmGenericInterruptParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPccSubspaceType2Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType2InfoParser[] = {
 | 
						|
  { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
 | 
						|
    NULL, NULL, CmArmPccSubspaceType0InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
 | 
						|
  { "PlatIrq",        sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
 | 
						|
    CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
  { "PlatIrqAckReg",  sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPccSubspaceType3Info or EArmObjPccSubspaceType4Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType34InfoParser[] = {
 | 
						|
  { "GenericPccInfo",       sizeof (PCC_SUBSPACE_GENERIC_INFO),
 | 
						|
    NULL, NULL, CmArmPccSubspaceType0InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
 | 
						|
  { "PlatIrq",              sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
 | 
						|
    CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
  { "PlatIrqAckReg",        sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
  { "CmdCompleteCheckReg",  sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
  { "CmdCompleteUpdateReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
  { "ErrorStatusReg",       sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EArmObjPccSubspaceType5Info.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType5InfoParser[] = {
 | 
						|
  { "GenericPccInfo",      sizeof (PCC_SUBSPACE_GENERIC_INFO),
 | 
						|
    NULL, NULL, CmArmPccSubspaceType0InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
 | 
						|
  { "Version",             2,                                 "0x%x",NULL },
 | 
						|
  { "PlatIrq",             sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,  NULL,
 | 
						|
    CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
  { "CmdCompleteCheckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
  { "ErrorStatusReg",      sizeof (PCC_MAILBOX_REGISTER_INFO),
 | 
						|
    NULL, NULL, CmArmMailboxRegisterInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for Arm namespace objects.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER_ARRAY  ArmNamespaceObjectParser[] = {
 | 
						|
  { "EArmObjReserved",                     NULL,                                  0                                },
 | 
						|
  { "EArmObjBootArchInfo",                 CmArmBootArchInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmBootArchInfoParser) },
 | 
						|
  { "EArmObjCpuInfo",                      NULL,                                  0                                },
 | 
						|
  { "EArmObjPowerManagementProfileInfo",   CmArmPowerManagementProfileInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPowerManagementProfileInfoParser) },
 | 
						|
  { "EArmObjGicCInfo",                     CmArmGicCInfoParser,                   ARRAY_SIZE (CmArmGicCInfoParser) },
 | 
						|
  { "EArmObjGicDInfo",                     CmArmGicDInfoParser,                   ARRAY_SIZE (CmArmGicDInfoParser) },
 | 
						|
  { "EArmObjGicMsiFrameInfo",              CmArmGicMsiFrameInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGicMsiFrameInfoParser) },
 | 
						|
  { "EArmObjGicRedistributorInfo",         CmArmGicRedistInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGicRedistInfoParser) },
 | 
						|
  { "EArmObjGicItsInfo",                   CmArmGicItsInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGicItsInfoParser) },
 | 
						|
  { "EArmObjSerialConsolePortInfo",        CmArmSerialPortInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmSerialPortInfoParser) },
 | 
						|
  { "EArmObjSerialDebugPortInfo",          CmArmSerialPortInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmSerialPortInfoParser) },
 | 
						|
  { "EArmObjGenericTimerInfo",             CmArmGenericTimerInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericTimerInfoParser) },
 | 
						|
  { "EArmObjPlatformGTBlockInfo",          CmArmGTBlockInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGTBlockInfoParser) },
 | 
						|
  { "EArmObjGTBlockTimerFrameInfo",        CmArmGTBlockTimerFrameInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser) },
 | 
						|
  { "EArmObjPlatformGenericWatchdogInfo",  CmArmGenericWatchdogInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericWatchdogInfoParser) },
 | 
						|
  { "EArmObjPciConfigSpaceInfo",           CmArmPciConfigSpaceInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPciConfigSpaceInfoParser) },
 | 
						|
  { "EArmObjHypervisorVendorIdentity",     CmArmHypervisorVendorIdParser,
 | 
						|
    ARRAY_SIZE (CmArmHypervisorVendorIdParser) },
 | 
						|
  { "EArmObjFixedFeatureFlags",            CmArmFixedFeatureFlagsParser,
 | 
						|
    ARRAY_SIZE (CmArmFixedFeatureFlagsParser) },
 | 
						|
  { "EArmObjItsGroup",                     CmArmItsGroupNodeParser,
 | 
						|
    ARRAY_SIZE (CmArmItsGroupNodeParser) },
 | 
						|
  { "EArmObjNamedComponent",               CmArmNamedComponentNodeParser,
 | 
						|
    ARRAY_SIZE (CmArmNamedComponentNodeParser) },
 | 
						|
  { "EArmObjRootComplex",                  CmArmRootComplexNodeParser,
 | 
						|
    ARRAY_SIZE (CmArmRootComplexNodeParser) },
 | 
						|
  { "EArmObjSmmuV1SmmuV2",                 CmArmSmmuV1SmmuV2NodeParser,
 | 
						|
    ARRAY_SIZE (CmArmSmmuV1SmmuV2NodeParser) },
 | 
						|
  { "EArmObjSmmuV3",                       CmArmSmmuV3NodeParser,
 | 
						|
    ARRAY_SIZE (CmArmSmmuV3NodeParser) },
 | 
						|
  { "EArmObjPmcg",                         CmArmPmcgNodeParser,                   ARRAY_SIZE (CmArmPmcgNodeParser) },
 | 
						|
  { "EArmObjGicItsIdentifierArray",        CmArmGicItsIdentifierParser,
 | 
						|
    ARRAY_SIZE (CmArmGicItsIdentifierParser) },
 | 
						|
  { "EArmObjIdMappingArray",               CmArmIdMappingParser,
 | 
						|
    ARRAY_SIZE (CmArmIdMappingParser) },
 | 
						|
  { "EArmObjSmmuInterruptArray",           CmArmGenericInterruptParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericInterruptParser) },
 | 
						|
  { "EArmObjProcHierarchyInfo",            CmArmProcHierarchyInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmProcHierarchyInfoParser) },
 | 
						|
  { "EArmObjCacheInfo",                    CmArmCacheInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmCacheInfoParser) },
 | 
						|
  { "EArmObjProcNodeIdInfo",               CmArmProcNodeIdInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmProcNodeIdInfoParser) },
 | 
						|
  { "EArmObjCmRef",                        CmArmObjRefParser,                     ARRAY_SIZE (CmArmObjRefParser)   },
 | 
						|
  { "EArmObjMemoryAffinityInfo",           CmArmMemoryAffinityInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMemoryAffinityInfoParser) },
 | 
						|
  { "EArmObjDeviceHandleAcpi",             CmArmDeviceHandleAcpiParser,
 | 
						|
    ARRAY_SIZE (CmArmDeviceHandleAcpiParser) },
 | 
						|
  { "EArmObjDeviceHandlePci",              CmArmDeviceHandlePciParser,
 | 
						|
    ARRAY_SIZE (CmArmDeviceHandlePciParser) },
 | 
						|
  { "EArmObjGenericInitiatorAffinityInfo",
 | 
						|
    CmArmGenericInitiatorAffinityInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmGenericInitiatorAffinityInfoParser) },
 | 
						|
  { "EArmObjSerialPortInfo",               CmArmSerialPortInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmSerialPortInfoParser) },
 | 
						|
  { "EArmObjCmn600Info",                   CmArmCmn600InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmCmn600InfoParser) },
 | 
						|
  { "EArmObjLpiInfo",                      CmArmLpiInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmLpiInfoParser) },
 | 
						|
  { "EArmObjPciAddressMapInfo",            CmArmPciAddressMapInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPciAddressMapInfoParser) },
 | 
						|
  { "EArmObjPciInterruptMapInfo",          CmPciInterruptMapInfoParser,
 | 
						|
    ARRAY_SIZE (CmPciInterruptMapInfoParser) },
 | 
						|
  { "EArmObjRmr",                          CmArmRmrInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmRmrInfoParser) },
 | 
						|
  { "EArmObjMemoryRangeDescriptor",        CmArmMemoryRangeDescriptorInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmMemoryRangeDescriptorInfoParser) },
 | 
						|
  { "EArmObjCpcInfo",                      CmArmCpcInfoParser,
 | 
						|
    ARRAY_SIZE (CmArmCpcInfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType0Info",         CmArmPccSubspaceType0InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType1Info",         CmArmPccSubspaceType1InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType1InfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType2Info",         CmArmPccSubspaceType2InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType2InfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType3Info",         CmArmPccSubspaceType34InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType34InfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType4Info",         CmArmPccSubspaceType34InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType34InfoParser) },
 | 
						|
  { "EArmObjPccSubspaceType5Info",         CmArmPccSubspaceType5InfoParser,
 | 
						|
    ARRAY_SIZE (CmArmPccSubspaceType5InfoParser) },
 | 
						|
  { "EArmObjMax",                          NULL,                                  0                                },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EStdObjCfgMgrInfo.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  StdObjCfgMgrInfoParser[] = {
 | 
						|
  { "Revision", 4, "0x%x",         NULL       },
 | 
						|
  { "OemId[6]", 6, "%c%c%c%c%c%c", PrintChar6 }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EStdObjAcpiTableList.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  StdObjAcpiTableInfoParser[] = {
 | 
						|
  { "AcpiTableSignature", 4,                                      "%c%c%c%c",         PrintChar4 },
 | 
						|
  { "AcpiTableRevision",  1,                                      "%d",               NULL       },
 | 
						|
  { "TableGeneratorId",   sizeof (ACPI_TABLE_GENERATOR_ID),       "0x%x",             NULL       },
 | 
						|
  { "AcpiTableData",      sizeof (EFI_ACPI_DESCRIPTION_HEADER *), "0x%p",             NULL       },
 | 
						|
  { "OemTableId",         8,                                      "%c%c%c%c%c%c%c%c", PrintChar8 },
 | 
						|
  { "OemRevision",        4,                                      "0x%x",             NULL       },
 | 
						|
  { "MinorRevision",      1,                                      "0x%x",             NULL       },
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for EStdObjSmbiosTableList.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER  StdObjSmbiosTableInfoParser[] = {
 | 
						|
  { "TableGeneratorId", sizeof (SMBIOS_TABLE_GENERATOR_ID), "0x%x", NULL },
 | 
						|
  { "SmbiosTableData",  sizeof (SMBIOS_STRUCTURE *),        "0x%p", NULL }
 | 
						|
};
 | 
						|
 | 
						|
/** A parser for Standard namespace objects.
 | 
						|
*/
 | 
						|
STATIC CONST CM_OBJ_PARSER_ARRAY  StdNamespaceObjectParser[] = {
 | 
						|
  { "EStdObjCfgMgrInfo",      StdObjCfgMgrInfoParser,
 | 
						|
    ARRAY_SIZE (StdObjCfgMgrInfoParser) },
 | 
						|
  { "EStdObjAcpiTableList",   StdObjAcpiTableInfoParser,
 | 
						|
    ARRAY_SIZE (StdObjAcpiTableInfoParser) },
 | 
						|
  { "EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser,
 | 
						|
    ARRAY_SIZE (StdObjSmbiosTableInfoParser) },
 | 
						|
  { "EStdObjMax",             NULL,                       0}
 | 
						|
};
 | 
						|
 | 
						|
/** Print string data.
 | 
						|
 | 
						|
  The string must be NULL terminated.
 | 
						|
 | 
						|
  @param [in]  Format  Format to print the Ptr.
 | 
						|
  @param [in]  Ptr     Pointer to the string.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintString (
 | 
						|
  IN CONST CHAR8  *Format,
 | 
						|
  IN UINT8        *Ptr
 | 
						|
  )
 | 
						|
{
 | 
						|
  if (Ptr == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  DEBUG ((DEBUG_ERROR, "%a", Ptr));
 | 
						|
}
 | 
						|
 | 
						|
/** Print string from pointer.
 | 
						|
 | 
						|
  The string must be NULL terminated.
 | 
						|
 | 
						|
  @param [in]  Format      Format to print the string.
 | 
						|
  @param [in]  Ptr         Pointer to the string pointer.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintStringPtr (
 | 
						|
  IN CONST CHAR8  *Format,
 | 
						|
  IN UINT8        *Ptr
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8  *String;
 | 
						|
 | 
						|
  if (Ptr == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  String = *(UINT8 **)Ptr;
 | 
						|
 | 
						|
  if (String == NULL) {
 | 
						|
    String = (UINT8 *)"(NULLPTR)";
 | 
						|
  }
 | 
						|
 | 
						|
  PrintString (Format, String);
 | 
						|
}
 | 
						|
 | 
						|
/** Print 4 characters.
 | 
						|
 | 
						|
  @param [in]  Format  Format to print the Ptr.
 | 
						|
  @param [in]  Ptr     Pointer to the characters.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar4 (
 | 
						|
  IN  CONST CHAR8  *Format,
 | 
						|
  IN  UINT8        *Ptr
 | 
						|
  )
 | 
						|
{
 | 
						|
  DEBUG ((
 | 
						|
    DEBUG_ERROR,
 | 
						|
    (Format != NULL) ? Format : "%c%c%c%c",
 | 
						|
    Ptr[0],
 | 
						|
    Ptr[1],
 | 
						|
    Ptr[2],
 | 
						|
    Ptr[3]
 | 
						|
    ));
 | 
						|
}
 | 
						|
 | 
						|
/** Print 6 characters.
 | 
						|
 | 
						|
  @param [in]  Format  Format to print the Ptr.
 | 
						|
  @param [in]  Ptr     Pointer to the characters.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar6 (
 | 
						|
  IN  CONST CHAR8  *Format,
 | 
						|
  IN  UINT8        *Ptr
 | 
						|
  )
 | 
						|
{
 | 
						|
  DEBUG ((
 | 
						|
    DEBUG_ERROR,
 | 
						|
    (Format != NULL) ? Format : "%c%c%c%c%c%c",
 | 
						|
    Ptr[0],
 | 
						|
    Ptr[1],
 | 
						|
    Ptr[2],
 | 
						|
    Ptr[3],
 | 
						|
    Ptr[4],
 | 
						|
    Ptr[5]
 | 
						|
    ));
 | 
						|
}
 | 
						|
 | 
						|
/** Print 8 characters.
 | 
						|
 | 
						|
  @param [in]  Format  Format to print the Ptr.
 | 
						|
  @param [in]  Ptr     Pointer to the characters.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
PrintChar8 (
 | 
						|
  IN  CONST CHAR8  *Format,
 | 
						|
  IN  UINT8        *Ptr
 | 
						|
  )
 | 
						|
{
 | 
						|
  DEBUG ((
 | 
						|
    DEBUG_ERROR,
 | 
						|
    (Format != NULL) ? Format : "%c%c%c%c%c%c%c%c",
 | 
						|
    Ptr[0],
 | 
						|
    Ptr[1],
 | 
						|
    Ptr[2],
 | 
						|
    Ptr[3],
 | 
						|
    Ptr[4],
 | 
						|
    Ptr[5],
 | 
						|
    Ptr[6],
 | 
						|
    Ptr[7]
 | 
						|
    ));
 | 
						|
}
 | 
						|
 | 
						|
/** Print fields of the objects.
 | 
						|
 | 
						|
  @param [in]  Data           Pointer to the object to print.
 | 
						|
  @param [in]  Parser         Parser containing the object fields.
 | 
						|
  @param [in]  ItemCount      Number of entries/fields in the Parser.
 | 
						|
  @param [in]  RemainingSize  Parse at most *RemainingSize bytes.
 | 
						|
                              This function decrements the value
 | 
						|
                              from the number bytes consumed.
 | 
						|
  @param [in]  IndentLevel    Indentation to use when printing.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
PrintCmObjDesc (
 | 
						|
  IN        VOID           *Data,
 | 
						|
  IN  CONST CM_OBJ_PARSER  *Parser,
 | 
						|
  IN        UINTN          ItemCount,
 | 
						|
  IN        INTN           *RemainingSize,
 | 
						|
  IN        UINT32         IndentLevel
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Index;
 | 
						|
  UINT32  IndentIndex;
 | 
						|
  INTN    SubStructSize;
 | 
						|
 | 
						|
  if ((Data == NULL)    ||
 | 
						|
      (Parser == NULL)  ||
 | 
						|
      (ItemCount == 0)  ||
 | 
						|
      (RemainingSize == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // Print each field.
 | 
						|
  for (Index = 0; Index < ItemCount; Index++) {
 | 
						|
    // Check there is enough space in left.
 | 
						|
    *RemainingSize -= Parser[Index].Length;
 | 
						|
    if (*RemainingSize < 0) {
 | 
						|
      DEBUG ((
 | 
						|
        DEBUG_INFO,
 | 
						|
        "\nERROR: %a: Buffer overrun\n",
 | 
						|
        Parser[Index].NameStr
 | 
						|
        ));
 | 
						|
      ASSERT (0);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Indentation
 | 
						|
    for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) {
 | 
						|
      DEBUG ((DEBUG_INFO, "  "));
 | 
						|
    }
 | 
						|
 | 
						|
    DEBUG ((
 | 
						|
      DEBUG_INFO,
 | 
						|
      "%-*a :",
 | 
						|
      OUTPUT_FIELD_COLUMN_WIDTH - 2 * IndentLevel,
 | 
						|
      Parser[Index].NameStr
 | 
						|
      ));
 | 
						|
    if (Parser[Index].PrintFormatter != NULL) {
 | 
						|
      Parser[Index].PrintFormatter (Parser[Index].Format, Data);
 | 
						|
    } else if (Parser[Index].Format != NULL) {
 | 
						|
      switch (Parser[Index].Length) {
 | 
						|
        case 1:
 | 
						|
          DEBUG ((DEBUG_INFO, Parser[Index].Format, *(UINT8 *)Data));
 | 
						|
          break;
 | 
						|
        case 2:
 | 
						|
          DEBUG ((DEBUG_INFO, Parser[Index].Format, *(UINT16 *)Data));
 | 
						|
          break;
 | 
						|
        case 4:
 | 
						|
          DEBUG ((DEBUG_INFO, Parser[Index].Format, *(UINT32 *)Data));
 | 
						|
          break;
 | 
						|
        case 8:
 | 
						|
          DEBUG ((DEBUG_INFO, Parser[Index].Format, ReadUnaligned64 (Data)));
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          DEBUG ((
 | 
						|
            DEBUG_INFO,
 | 
						|
            "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
 | 
						|
            Parser[Index].NameStr,
 | 
						|
            Parser[Index].Length
 | 
						|
            ));
 | 
						|
      } // switch
 | 
						|
    } else if (Parser[Index].SubObjParser != NULL) {
 | 
						|
      SubStructSize = Parser[Index].Length;
 | 
						|
 | 
						|
      DEBUG ((DEBUG_INFO, "\n"));
 | 
						|
      PrintCmObjDesc (
 | 
						|
        Data,
 | 
						|
        Parser[Index].SubObjParser,
 | 
						|
        Parser[Index].SubObjItemCount,
 | 
						|
        &SubStructSize,
 | 
						|
        IndentLevel + 1
 | 
						|
        );
 | 
						|
    } else {
 | 
						|
      ASSERT (0);
 | 
						|
      DEBUG ((
 | 
						|
        DEBUG_INFO,
 | 
						|
        "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
 | 
						|
        Parser[Index].NameStr,
 | 
						|
        Parser[Index].Length
 | 
						|
        ));
 | 
						|
    }
 | 
						|
 | 
						|
    DEBUG ((DEBUG_INFO, "\n"));
 | 
						|
    Data = (UINT8 *)Data + Parser[Index].Length;
 | 
						|
  } // for
 | 
						|
}
 | 
						|
 | 
						|
/** Parse and print a CmObjDesc.
 | 
						|
 | 
						|
  @param [in]  CmObjDesc  The CmObjDesc to parse and print.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ParseCmObjDesc (
 | 
						|
  IN  CONST CM_OBJ_DESCRIPTOR  *CmObjDesc
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                       ObjId;
 | 
						|
  UINTN                       NameSpaceId;
 | 
						|
  UINT32                      ObjIndex;
 | 
						|
  UINT32                      ObjectCount;
 | 
						|
  INTN                        RemainingSize;
 | 
						|
  INTN                        Offset;
 | 
						|
  CONST  CM_OBJ_PARSER_ARRAY  *ParserArray;
 | 
						|
 | 
						|
  if ((CmObjDesc == NULL) || (CmObjDesc->Data == NULL)) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  NameSpaceId = GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId);
 | 
						|
  ObjId       = GET_CM_OBJECT_ID (CmObjDesc->ObjectId);
 | 
						|
 | 
						|
  switch (NameSpaceId) {
 | 
						|
    case EObjNameSpaceStandard:
 | 
						|
      if (ObjId >= EStdObjMax) {
 | 
						|
        ASSERT (0);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      if (ObjId >= ARRAY_SIZE (StdNamespaceObjectParser)) {
 | 
						|
        DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the StdNamespaceObjectParser array\n", ObjId));
 | 
						|
        ASSERT (0);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      ParserArray = &StdNamespaceObjectParser[ObjId];
 | 
						|
      break;
 | 
						|
    case EObjNameSpaceArm:
 | 
						|
      if (ObjId >= EArmObjMax) {
 | 
						|
        ASSERT (0);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      if (ObjId >= ARRAY_SIZE (ArmNamespaceObjectParser)) {
 | 
						|
        DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the ArmNamespaceObjectParser array\n", ObjId));
 | 
						|
        ASSERT (0);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      ParserArray = &ArmNamespaceObjectParser[ObjId];
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      // Not supported
 | 
						|
      DEBUG ((DEBUG_ERROR, "NameSpaceId 0x%x, ObjId 0x%x is not supported by the parser\n", NameSpaceId, ObjId));
 | 
						|
      ASSERT (0);
 | 
						|
      return;
 | 
						|
  } // switch
 | 
						|
 | 
						|
  ObjectCount   = CmObjDesc->Count;
 | 
						|
  RemainingSize = CmObjDesc->Size;
 | 
						|
  Offset        = 0;
 | 
						|
 | 
						|
  for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) {
 | 
						|
    DEBUG ((
 | 
						|
      DEBUG_INFO,
 | 
						|
      "\n%-*a [%d/%d]:\n",
 | 
						|
      OUTPUT_FIELD_COLUMN_WIDTH,
 | 
						|
      ParserArray->ObjectName,
 | 
						|
      ObjIndex + 1,
 | 
						|
      ObjectCount
 | 
						|
      ));
 | 
						|
    if (ParserArray->Parser == NULL) {
 | 
						|
      DEBUG ((DEBUG_ERROR, "Parser not implemented\n"));
 | 
						|
      RemainingSize = 0;
 | 
						|
    } else {
 | 
						|
      PrintCmObjDesc (
 | 
						|
        (VOID *)((UINTN)CmObjDesc->Data + Offset),
 | 
						|
        ParserArray->Parser,
 | 
						|
        ParserArray->ItemCount,
 | 
						|
        &RemainingSize,
 | 
						|
        1
 | 
						|
        );
 | 
						|
      if ((RemainingSize > CmObjDesc->Size) ||
 | 
						|
          (RemainingSize < 0))
 | 
						|
      {
 | 
						|
        ASSERT (0);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      Offset = CmObjDesc->Size - RemainingSize;
 | 
						|
    }
 | 
						|
  } // for
 | 
						|
 | 
						|
  ASSERT (RemainingSize == 0);
 | 
						|
}
 |