/** @file Configuration Manager Object parser. Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include "ConfigurationManagerObjectParser.h" STATIC VOID EFIAPI PrintOemId ( 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} }; /** 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 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 EArmObjGTBlockTimerFrameInfo. */ 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 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} }; /** 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} }; /** 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*), "%a", 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} }; /** 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} }; /** 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} }; /** 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} }; /** 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} }; /** 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} }; /** 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%llx", NULL}, {"WorstCaseWakeLatency", 4, "0x%llx", NULL}, {"Flags", 4, "0x%llx", NULL}, {"ArchFlags", 4, "0x%llx", NULL}, {"ResCntFreq", 4, "0x%llx", NULL}, {"EnableParentState", 4, "0x%llx", 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, "0x%a", NULL}, }; /** 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", CmArmGTBlockTimerFrameInfoParser, ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser)}, {"EArmObjGTBlockTimerFrameInfo", CmArmGTBlockInfoParser, ARRAY_SIZE (CmArmGTBlockInfoParser)}, {"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)}, {"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", PrintOemId} }; /** A parser for EStdObjAcpiTableList. */ STATIC CONST CM_OBJ_PARSER StdObjAcpiTableInfoParser[] = { {"AcpiTableSignature", 4, "0x%x", NULL}, {"AcpiTableRevision", 1, "%d", NULL}, {"TableGeneratorId", sizeof (ACPI_TABLE_GENERATOR_ID), "0x%x", NULL}, {"AcpiTableData", sizeof (EFI_ACPI_DESCRIPTION_HEADER*), "0x%p", NULL}, {"OemTableId", 8, "0x%LLX", NULL}, {"OemRevision", 4, "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)}, }; /** Print OEM Id. @param [in] Format Format to print the Ptr. @param [in] Ptr Pointer to the OEM Id. **/ STATIC VOID EFIAPI PrintOemId ( 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 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_ERROR, "\nERROR: %a: Buffer overrun\n", Parser[Index].NameStr )); ASSERT (0); return; } // Indentation for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) { DEBUG ((DEBUG_ERROR, " ")); } DEBUG (( DEBUG_ERROR, "%-*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_ERROR, Parser[Index].Format, *(UINT8*)Data)); break; case 2: DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT16*)Data)); break; case 4: DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT32*)Data)); break; case 8: DEBUG ((DEBUG_ERROR, Parser[Index].Format, ReadUnaligned64(Data))); break; default: DEBUG (( DEBUG_ERROR, "\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_ERROR, "\n")); PrintCmObjDesc ( Data, Parser[Index].SubObjParser, Parser[Index].SubObjItemCount, &SubStructSize, IndentLevel + 1 ); } else { ASSERT (0); DEBUG (( DEBUG_ERROR, "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n", Parser[Index].NameStr, Parser[Index].Length )); } DEBUG ((DEBUG_ERROR, "\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; 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; } ParserArray = &StdNamespaceObjectParser[ObjId]; break; case EObjNameSpaceArm: if (ObjId >= EArmObjMax) { ASSERT (0); return; } ParserArray = &ArmNamespaceObjectParser[ObjId]; break; default: // Not supported ASSERT (0); return; } // switch ObjectCount = CmObjDesc->Count; RemainingSize = CmObjDesc->Size; for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) { DEBUG (( DEBUG_ERROR, "\n%-*a [%d/%d]:\n", OUTPUT_FIELD_COLUMN_WIDTH, ParserArray->ObjectName, ObjIndex + 1, ObjectCount )); PrintCmObjDesc ( CmObjDesc->Data, ParserArray->Parser, ParserArray->ItemCount, &RemainingSize, 1 ); } // for }