1 /*******************************************************************************
3 * Module Name: dbnames - Debugger commands for the acpi namespace
5 ******************************************************************************/
8 * Copyright (C) 2000 - 2016, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
53 #define _COMPONENT ACPI_CA_DEBUGGER
54 ACPI_MODULE_NAME ("dbnames")
57 /* Local prototypes */
60 AcpiDbWalkAndMatchName (
61 ACPI_HANDLE ObjHandle,
67 AcpiDbWalkForPredefinedNames (
68 ACPI_HANDLE ObjHandle,
74 AcpiDbWalkForSpecificObjects (
75 ACPI_HANDLE ObjHandle,
81 AcpiDbWalkForObjectCounts (
82 ACPI_HANDLE ObjHandle,
89 ACPI_HANDLE ObjHandle,
95 AcpiDbWalkForReferences (
96 ACPI_HANDLE ObjHandle,
103 ACPI_HANDLE ObjHandle,
109 * Arguments for the Objects command
110 * These object types map directly to the ACPI_TYPES
112 static ACPI_DB_ARGUMENT_INFO AcpiDbObjectTypes [] =
142 {NULL} /* Must be null terminated */
146 /*******************************************************************************
148 * FUNCTION: AcpiDbSetScope
150 * PARAMETERS: Name - New scope path
154 * DESCRIPTION: Set the "current scope" as maintained by this utility.
155 * The scope is used as a prefix to ACPI paths.
157 ******************************************************************************/
164 ACPI_NAMESPACE_NODE *Node;
167 if (!Name || Name[0] == 0)
169 AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
173 AcpiDbPrepNamestring (Name);
175 if (ACPI_IS_ROOT_PREFIX (Name[0]))
177 /* Validate new scope from the root */
179 Status = AcpiNsGetNode (AcpiGbl_RootNode, Name,
180 ACPI_NS_NO_UPSEARCH, &Node);
181 if (ACPI_FAILURE (Status))
186 AcpiGbl_DbScopeBuf[0] = 0;
190 /* Validate new scope relative to old scope */
192 Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name,
193 ACPI_NS_NO_UPSEARCH, &Node);
194 if (ACPI_FAILURE (Status))
200 /* Build the final pathname */
202 if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
205 Status = AE_BUFFER_OVERFLOW;
209 if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
212 Status = AE_BUFFER_OVERFLOW;
216 AcpiGbl_DbScopeNode = Node;
217 AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
222 AcpiOsPrintf ("Could not attach scope: %s, %s\n",
223 Name, AcpiFormatException (Status));
227 /*******************************************************************************
229 * FUNCTION: AcpiDbDumpNamespace
231 * PARAMETERS: StartArg - Node to begin namespace dump
232 * DepthArg - Maximum tree depth to be dumped
236 * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
237 * with type and other information.
239 ******************************************************************************/
242 AcpiDbDumpNamespace (
246 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
247 UINT32 MaxDepth = ACPI_UINT32_MAX;
250 /* No argument given, just start at the root and dump entire namespace */
254 SubtreeEntry = AcpiDbConvertToNode (StartArg);
260 /* Now we can check for the depth argument */
264 MaxDepth = strtoul (DepthArg, NULL, 0);
268 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
269 AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
270 ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
272 /* Display the subtree */
274 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
275 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
276 ACPI_OWNER_ID_MAX, SubtreeEntry);
277 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
281 /*******************************************************************************
283 * FUNCTION: AcpiDbDumpNamespacePaths
289 * DESCRIPTION: Dump entire namespace with full object pathnames and object
290 * type information. Alternative to "namespace" command.
292 ******************************************************************************/
295 AcpiDbDumpNamespacePaths (
299 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
300 AcpiOsPrintf ("ACPI Namespace (from root):\n");
302 /* Display the entire namespace */
304 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
305 AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
306 ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
308 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
312 /*******************************************************************************
314 * FUNCTION: AcpiDbDumpNamespaceByOwner
316 * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed
317 * DepthArg - Maximum tree depth to be dumped
321 * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
323 ******************************************************************************/
326 AcpiDbDumpNamespaceByOwner (
330 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
331 UINT32 MaxDepth = ACPI_UINT32_MAX;
332 ACPI_OWNER_ID OwnerId;
335 OwnerId = (ACPI_OWNER_ID) strtoul (OwnerArg, NULL, 0);
337 /* Now we can check for the depth argument */
341 MaxDepth = strtoul (DepthArg, NULL, 0);
344 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
345 AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
347 /* Display the subtree */
349 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
350 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
351 OwnerId, SubtreeEntry);
352 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
356 /*******************************************************************************
358 * FUNCTION: AcpiDbWalkAndMatchName
360 * PARAMETERS: Callback from WalkNamespace
364 * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
365 * are supported -- '?' matches any character.
367 ******************************************************************************/
370 AcpiDbWalkAndMatchName (
371 ACPI_HANDLE ObjHandle,
377 char *RequestedName = (char *) Context;
383 /* Check for a name match */
385 for (i = 0; i < 4; i++)
387 /* Wildcard support */
389 if ((RequestedName[i] != '?') &&
390 (RequestedName[i] != ((ACPI_NAMESPACE_NODE *)
391 ObjHandle)->Name.Ascii[i]))
393 /* No match, just exit */
399 /* Get the full pathname to this object */
401 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
402 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
403 if (ACPI_FAILURE (Status))
405 AcpiOsPrintf ("Could Not get pathname for object %p\n",
410 Info.OwnerId = ACPI_OWNER_ID_MAX;
411 Info.DebugLevel = ACPI_UINT32_MAX;
412 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
414 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
415 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
416 ACPI_FREE (Buffer.Pointer);
423 /*******************************************************************************
425 * FUNCTION: AcpiDbFindNameInNamespace
427 * PARAMETERS: NameArg - The 4-character ACPI name to find.
428 * wildcards are supported.
432 * DESCRIPTION: Search the namespace for a given name (with wildcards)
434 ******************************************************************************/
437 AcpiDbFindNameInNamespace (
440 char AcpiName[5] = "____";
441 char *AcpiNamePtr = AcpiName;
444 if (strlen (NameArg) > ACPI_NAME_SIZE)
446 AcpiOsPrintf ("Name must be no longer than 4 characters\n");
450 /* Pad out name with underscores as necessary to create a 4-char name */
452 AcpiUtStrupr (NameArg);
455 *AcpiNamePtr = *NameArg;
460 /* Walk the namespace from the root */
462 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
463 ACPI_UINT32_MAX, AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
465 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
470 /*******************************************************************************
472 * FUNCTION: AcpiDbWalkForPredefinedNames
474 * PARAMETERS: Callback from WalkNamespace
478 * DESCRIPTION: Detect and display predefined ACPI names (names that start with
481 ******************************************************************************/
484 AcpiDbWalkForPredefinedNames (
485 ACPI_HANDLE ObjHandle,
490 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
491 UINT32 *Count = (UINT32 *) Context;
492 const ACPI_PREDEFINED_INFO *Predefined;
493 const ACPI_PREDEFINED_INFO *Package = NULL;
495 char StringBuffer[48];
498 Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
504 Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
510 /* If method returns a package, the info is in the next table entry */
512 if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE)
514 Package = Predefined + 1;
517 AcpiUtGetExpectedReturnTypes (StringBuffer,
518 Predefined->Info.ExpectedBtypes);
520 AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname,
521 METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList),
526 AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
527 Package->RetInfo.Type, Package->RetInfo.ObjectType1,
528 Package->RetInfo.Count1);
533 /* Check that the declared argument count matches the ACPI spec */
535 AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined);
537 ACPI_FREE (Pathname);
543 /*******************************************************************************
545 * FUNCTION: AcpiDbCheckPredefinedNames
551 * DESCRIPTION: Validate all predefined names in the namespace
553 ******************************************************************************/
556 AcpiDbCheckPredefinedNames (
562 /* Search all nodes in namespace */
564 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
565 ACPI_UINT32_MAX, AcpiDbWalkForPredefinedNames,
566 NULL, (void *) &Count, NULL);
568 AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
572 /*******************************************************************************
574 * FUNCTION: AcpiDbWalkForObjectCounts
576 * PARAMETERS: Callback from WalkNamespace
580 * DESCRIPTION: Display short info about objects in the namespace
582 ******************************************************************************/
585 AcpiDbWalkForObjectCounts (
586 ACPI_HANDLE ObjHandle,
591 ACPI_OBJECT_INFO *Info = (ACPI_OBJECT_INFO *) Context;
592 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
595 if (Node->Type > ACPI_TYPE_NS_NODE_MAX)
597 AcpiOsPrintf ("[%4.4s]: Unknown object type %X\n",
598 Node->Name.Ascii, Node->Type);
602 Info->Types[Node->Type]++;
609 /*******************************************************************************
611 * FUNCTION: AcpiDbWalkForSpecificObjects
613 * PARAMETERS: Callback from WalkNamespace
617 * DESCRIPTION: Display short info about objects in the namespace
619 ******************************************************************************/
622 AcpiDbWalkForSpecificObjects (
623 ACPI_HANDLE ObjHandle,
628 ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context;
635 /* Get and display the full pathname to this object */
637 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
638 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
639 if (ACPI_FAILURE (Status))
641 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
645 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
646 ACPI_FREE (Buffer.Pointer);
648 /* Dump short info about the object */
650 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
655 /*******************************************************************************
657 * FUNCTION: AcpiDbDisplayObjects
659 * PARAMETERS: ObjTypeArg - Type of object to display
660 * DisplayCountArg - Max depth to display
664 * DESCRIPTION: Display objects in the namespace of the requested type
666 ******************************************************************************/
669 AcpiDbDisplayObjects (
671 char *DisplayCountArg)
674 ACPI_OBJECT_TYPE Type;
675 ACPI_OBJECT_INFO *ObjectInfo;
677 UINT32 TotalObjects = 0;
680 /* No argument means display summary/count of all object types */
684 ObjectInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_OBJECT_INFO));
686 /* Walk the namespace from the root */
688 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
689 ACPI_UINT32_MAX, AcpiDbWalkForObjectCounts, NULL,
690 (void *) ObjectInfo, NULL);
692 AcpiOsPrintf ("\nSummary of namespace objects:\n\n");
694 for (i = 0; i < ACPI_TOTAL_TYPES; i++)
696 AcpiOsPrintf ("%8u %s\n", ObjectInfo->Types[i],
697 AcpiUtGetTypeName (i));
699 TotalObjects += ObjectInfo->Types[i];
702 AcpiOsPrintf ("\n%8u Total namespace objects\n\n",
705 ACPI_FREE (ObjectInfo);
709 /* Get the object type */
711 Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
712 if (Type == ACPI_TYPE_NOT_FOUND)
714 AcpiOsPrintf ("Invalid or unsupported argument\n");
718 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
720 "Objects of type [%s] defined in the current ACPI Namespace:\n",
721 AcpiUtGetTypeName (Type));
723 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
726 Info.OwnerId = ACPI_OWNER_ID_MAX;
727 Info.DebugLevel = ACPI_UINT32_MAX;
728 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
730 /* Walk the namespace from the root */
732 (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
733 AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
736 "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
737 Info.Count, AcpiUtGetTypeName (Type));
739 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
744 /*******************************************************************************
746 * FUNCTION: AcpiDbIntegrityWalk
748 * PARAMETERS: Callback from WalkNamespace
752 * DESCRIPTION: Examine one NS node for valid values.
754 ******************************************************************************/
757 AcpiDbIntegrityWalk (
758 ACPI_HANDLE ObjHandle,
763 ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context;
764 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
765 ACPI_OPERAND_OBJECT *Object;
766 BOOLEAN Alias = TRUE;
771 /* Verify the NS node, and dereference aliases */
775 if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
778 "Invalid Descriptor Type for Node %p [%s] - "
779 "is %2.2X should be %2.2X\n",
780 Node, AcpiUtGetDescriptorName (Node),
781 ACPI_GET_DESCRIPTOR_TYPE (Node), ACPI_DESC_TYPE_NAMED);
785 if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS) ||
786 (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
788 Node = (ACPI_NAMESPACE_NODE *) Node->Object;
796 if (Node->Type > ACPI_TYPE_LOCAL_MAX)
798 AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
803 if (!AcpiUtValidAcpiName (Node->Name.Ascii))
805 AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
809 Object = AcpiNsGetAttachedObject (Node);
813 if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
815 AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
816 Object, AcpiUtGetDescriptorName (Object));
824 /*******************************************************************************
826 * FUNCTION: AcpiDbCheckIntegrity
832 * DESCRIPTION: Check entire namespace for data structure integrity
834 ******************************************************************************/
837 AcpiDbCheckIntegrity (
840 ACPI_INTEGRITY_INFO Info = {0,0};
842 /* Search all nodes in namespace */
844 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
845 ACPI_UINT32_MAX, AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
847 AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
848 Info.Nodes, Info.Objects);
852 /*******************************************************************************
854 * FUNCTION: AcpiDbWalkForReferences
856 * PARAMETERS: Callback from WalkNamespace
860 * DESCRIPTION: Check if this namespace object refers to the target object
861 * that is passed in as the context value.
863 * Note: Currently doesn't check subobjects within the Node's object
865 ******************************************************************************/
868 AcpiDbWalkForReferences (
869 ACPI_HANDLE ObjHandle,
874 ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context;
875 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
878 /* Check for match against the namespace node itself */
880 if (Node == (void *) ObjDesc)
882 AcpiOsPrintf ("Object is a Node [%4.4s]\n",
883 AcpiUtGetNodeName (Node));
886 /* Check for match against the object attached to the node */
888 if (AcpiNsGetAttachedObject (Node) == ObjDesc)
890 AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
891 Node, AcpiUtGetNodeName (Node));
898 /*******************************************************************************
900 * FUNCTION: AcpiDbFindReferences
902 * PARAMETERS: ObjectArg - String with hex value of the object
906 * DESCRIPTION: Search namespace for all references to the input object
908 ******************************************************************************/
911 AcpiDbFindReferences (
914 ACPI_OPERAND_OBJECT *ObjDesc;
918 /* Convert string to object pointer */
920 Address = strtoul (ObjectArg, NULL, 16);
921 ObjDesc = ACPI_TO_POINTER (Address);
923 /* Search all nodes in namespace */
925 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
926 ACPI_UINT32_MAX, AcpiDbWalkForReferences, NULL,
927 (void *) ObjDesc, NULL);
931 /*******************************************************************************
933 * FUNCTION: AcpiDbBusWalk
935 * PARAMETERS: Callback from WalkNamespace
939 * DESCRIPTION: Display info about device objects that have a corresponding
942 ******************************************************************************/
946 ACPI_HANDLE ObjHandle,
951 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
954 ACPI_NAMESPACE_NODE *TempNode;
955 ACPI_DEVICE_INFO *Info;
959 if ((Node->Type != ACPI_TYPE_DEVICE) &&
960 (Node->Type != ACPI_TYPE_PROCESSOR))
965 /* Exit if there is no _PRT under this device */
967 Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
968 ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
969 if (ACPI_FAILURE (Status))
974 /* Get the full path to this device object */
976 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
977 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
978 if (ACPI_FAILURE (Status))
980 AcpiOsPrintf ("Could Not get pathname for object %p\n",
985 Status = AcpiGetObjectInfo (ObjHandle, &Info);
986 if (ACPI_FAILURE (Status))
991 /* Display the full path */
993 AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
994 ACPI_FREE (Buffer.Pointer);
996 if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
998 AcpiOsPrintf (" - Is PCI Root Bridge");
1000 AcpiOsPrintf ("\n");
1004 AcpiOsPrintf ("_PRT: %p\n", TempNode);
1006 /* Dump _ADR, _HID, _UID, _CID */
1008 if (Info->Valid & ACPI_VALID_ADR)
1010 AcpiOsPrintf ("_ADR: %8.8X%8.8X\n",
1011 ACPI_FORMAT_UINT64 (Info->Address));
1015 AcpiOsPrintf ("_ADR: <Not Present>\n");
1018 if (Info->Valid & ACPI_VALID_HID)
1020 AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
1024 AcpiOsPrintf ("_HID: <Not Present>\n");
1027 if (Info->Valid & ACPI_VALID_UID)
1029 AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
1033 AcpiOsPrintf ("_UID: <Not Present>\n");
1036 if (Info->Valid & ACPI_VALID_CID)
1038 for (i = 0; i < Info->CompatibleIdList.Count; i++)
1040 AcpiOsPrintf ("_CID: %s\n",
1041 Info->CompatibleIdList.Ids[i].String);
1046 AcpiOsPrintf ("_CID: <Not Present>\n");
1054 /*******************************************************************************
1056 * FUNCTION: AcpiDbGetBusInfo
1062 * DESCRIPTION: Display info about system busses.
1064 ******************************************************************************/
1070 /* Search all nodes in namespace */
1072 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
1073 ACPI_UINT32_MAX, AcpiDbBusWalk, NULL, NULL, NULL);
1076 #endif /* ACPI_DEBUGGER */