Home | History | Annotate | Line # | Download | only in debugger
      1 /*******************************************************************************
      2  *
      3  * Module Name: dbnames - Debugger commands for the acpi namespace
      4  *
      5  ******************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #include "acpi.h"
    153 #include "accommon.h"
    154 #include "acnamesp.h"
    155 #include "acdebug.h"
    156 #include "acpredef.h"
    157 #include "acinterp.h"
    158 
    159 
    160 #define _COMPONENT          ACPI_CA_DEBUGGER
    161         ACPI_MODULE_NAME    ("dbnames")
    162 
    163 
    164 /* Local prototypes */
    165 
    166 static ACPI_STATUS
    167 AcpiDbWalkAndMatchName (
    168     ACPI_HANDLE             ObjHandle,
    169     UINT32                  NestingLevel,
    170     void                    *Context,
    171     void                    **ReturnValue);
    172 
    173 static ACPI_STATUS
    174 AcpiDbWalkForPredefinedNames (
    175     ACPI_HANDLE             ObjHandle,
    176     UINT32                  NestingLevel,
    177     void                    *Context,
    178     void                    **ReturnValue);
    179 
    180 static ACPI_STATUS
    181 AcpiDbWalkForSpecificObjects (
    182     ACPI_HANDLE             ObjHandle,
    183     UINT32                  NestingLevel,
    184     void                    *Context,
    185     void                    **ReturnValue);
    186 
    187 static ACPI_STATUS
    188 AcpiDbWalkForObjectCounts (
    189     ACPI_HANDLE             ObjHandle,
    190     UINT32                  NestingLevel,
    191     void                    *Context,
    192     void                    **ReturnValue);
    193 
    194 static ACPI_STATUS
    195 AcpiDbIntegrityWalk (
    196     ACPI_HANDLE             ObjHandle,
    197     UINT32                  NestingLevel,
    198     void                    *Context,
    199     void                    **ReturnValue);
    200 
    201 static ACPI_STATUS
    202 AcpiDbWalkForReferences (
    203     ACPI_HANDLE             ObjHandle,
    204     UINT32                  NestingLevel,
    205     void                    *Context,
    206     void                    **ReturnValue);
    207 
    208 static ACPI_STATUS
    209 AcpiDbBusWalk (
    210     ACPI_HANDLE             ObjHandle,
    211     UINT32                  NestingLevel,
    212     void                    *Context,
    213     void                    **ReturnValue);
    214 
    215 /*
    216  * Arguments for the Objects command
    217  * These object types map directly to the ACPI_TYPES
    218  */
    219 static ACPI_DB_ARGUMENT_INFO    AcpiDbObjectTypes [] =
    220 {
    221     {"ANY"},
    222     {"INTEGERS"},
    223     {"STRINGS"},
    224     {"BUFFERS"},
    225     {"PACKAGES"},
    226     {"FIELDS"},
    227     {"DEVICES"},
    228     {"EVENTS"},
    229     {"METHODS"},
    230     {"MUTEXES"},
    231     {"REGIONS"},
    232     {"POWERRESOURCES"},
    233     {"PROCESSORS"},
    234     {"THERMALZONES"},
    235     {"BUFFERFIELDS"},
    236     {"DDBHANDLES"},
    237     {"DEBUG"},
    238     {"REGIONFIELDS"},
    239     {"BANKFIELDS"},
    240     {"INDEXFIELDS"},
    241     {"REFERENCES"},
    242     {"ALIASES"},
    243     {"METHODALIASES"},
    244     {"NOTIFY"},
    245     {"ADDRESSHANDLER"},
    246     {"RESOURCE"},
    247     {"RESOURCEFIELD"},
    248     {"SCOPES"},
    249     {NULL}           /* Must be null terminated */
    250 };
    251 
    252 
    253 /*******************************************************************************
    254  *
    255  * FUNCTION:    AcpiDbSetScope
    256  *
    257  * PARAMETERS:  Name                - New scope path
    258  *
    259  * RETURN:      Status
    260  *
    261  * DESCRIPTION: Set the "current scope" as maintained by this utility.
    262  *              The scope is used as a prefix to ACPI paths.
    263  *
    264  ******************************************************************************/
    265 
    266 void
    267 AcpiDbSetScope (
    268     char                    *Name)
    269 {
    270     ACPI_STATUS             Status;
    271     ACPI_NAMESPACE_NODE     *Node;
    272 
    273 
    274     if (!Name || Name[0] == 0)
    275     {
    276         AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
    277         return;
    278     }
    279 
    280     AcpiDbPrepNamestring (Name);
    281 
    282     if (ACPI_IS_ROOT_PREFIX (Name[0]))
    283     {
    284         /* Validate new scope from the root */
    285 
    286         Status = AcpiNsGetNode (AcpiGbl_RootNode, Name,
    287             ACPI_NS_NO_UPSEARCH, &Node);
    288         if (ACPI_FAILURE (Status))
    289         {
    290             goto ErrorExit;
    291         }
    292 
    293         AcpiGbl_DbScopeBuf[0] = 0;
    294     }
    295     else
    296     {
    297         /* Validate new scope relative to old scope */
    298 
    299         Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name,
    300             ACPI_NS_NO_UPSEARCH, &Node);
    301         if (ACPI_FAILURE (Status))
    302         {
    303             goto ErrorExit;
    304         }
    305     }
    306 
    307     /* Build the final pathname */
    308 
    309     if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
    310         Name))
    311     {
    312         Status = AE_BUFFER_OVERFLOW;
    313         goto ErrorExit;
    314     }
    315 
    316     if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
    317 	    __UNCONST("\\")))
    318     {
    319         Status = AE_BUFFER_OVERFLOW;
    320         goto ErrorExit;
    321     }
    322 
    323     AcpiGbl_DbScopeNode = Node;
    324     AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
    325     return;
    326 
    327 ErrorExit:
    328 
    329     AcpiOsPrintf ("Could not attach scope: %s, %s\n",
    330         Name, AcpiFormatException (Status));
    331 }
    332 
    333 
    334 /*******************************************************************************
    335  *
    336  * FUNCTION:    AcpiDbDumpNamespace
    337  *
    338  * PARAMETERS:  StartArg        - Node to begin namespace dump
    339  *              DepthArg        - Maximum tree depth to be dumped
    340  *
    341  * RETURN:      None
    342  *
    343  * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
    344  *              with type and other information.
    345  *
    346  ******************************************************************************/
    347 
    348 void
    349 AcpiDbDumpNamespace (
    350     char                    *StartArg,
    351     char                    *DepthArg)
    352 {
    353     ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
    354     UINT32                  MaxDepth = ACPI_UINT32_MAX;
    355 
    356 
    357     /* No argument given, just start at the root and dump entire namespace */
    358 
    359     if (StartArg)
    360     {
    361         SubtreeEntry = AcpiDbConvertToNode (StartArg);
    362         if (!SubtreeEntry)
    363         {
    364             return;
    365         }
    366 
    367         /* Now we can check for the depth argument */
    368 
    369         if (DepthArg)
    370         {
    371             MaxDepth = strtoul (DepthArg, NULL, 0);
    372         }
    373     }
    374 
    375     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
    376 
    377     if (((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Parent)
    378     {
    379         AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
    380             ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
    381     }
    382     else
    383     {
    384         AcpiOsPrintf ("ACPI Namespace (from %s):\n",
    385             ACPI_NAMESPACE_ROOT);
    386     }
    387 
    388     /* Display the subtree */
    389 
    390     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    391     AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
    392         ACPI_OWNER_ID_MAX, SubtreeEntry);
    393     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    394 }
    395 
    396 
    397 /*******************************************************************************
    398  *
    399  * FUNCTION:    AcpiDbDumpNamespacePaths
    400  *
    401  * PARAMETERS:  None
    402  *
    403  * RETURN:      None
    404  *
    405  * DESCRIPTION: Dump entire namespace with full object pathnames and object
    406  *              type information. Alternative to "namespace" command.
    407  *
    408  ******************************************************************************/
    409 
    410 void
    411 AcpiDbDumpNamespacePaths (
    412     void)
    413 {
    414 
    415     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
    416     AcpiOsPrintf ("ACPI Namespace (from root):\n");
    417 
    418     /* Display the entire namespace */
    419 
    420     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    421     AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
    422         ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
    423 
    424     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    425 }
    426 
    427 
    428 /*******************************************************************************
    429  *
    430  * FUNCTION:    AcpiDbDumpNamespaceByOwner
    431  *
    432  * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed
    433  *              DepthArg        - Maximum tree depth to be dumped
    434  *
    435  * RETURN:      None
    436  *
    437  * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
    438  *
    439  ******************************************************************************/
    440 
    441 void
    442 AcpiDbDumpNamespaceByOwner (
    443     char                    *OwnerArg,
    444     char                    *DepthArg)
    445 {
    446     ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
    447     UINT32                  MaxDepth = ACPI_UINT32_MAX;
    448     ACPI_OWNER_ID           OwnerId;
    449 
    450 
    451     OwnerId = (ACPI_OWNER_ID) strtoul (OwnerArg, NULL, 0);
    452 
    453     /* Now we can check for the depth argument */
    454 
    455     if (DepthArg)
    456     {
    457         MaxDepth = strtoul (DepthArg, NULL, 0);
    458     }
    459 
    460     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
    461     AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
    462 
    463     /* Display the subtree */
    464 
    465     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    466     AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
    467         OwnerId, SubtreeEntry);
    468     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    469 }
    470 
    471 
    472 /*******************************************************************************
    473  *
    474  * FUNCTION:    AcpiDbWalkAndMatchName
    475  *
    476  * PARAMETERS:  Callback from WalkNamespace
    477  *
    478  * RETURN:      Status
    479  *
    480  * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
    481  *              are supported -- '?' matches any character.
    482  *
    483  ******************************************************************************/
    484 
    485 static ACPI_STATUS
    486 AcpiDbWalkAndMatchName (
    487     ACPI_HANDLE             ObjHandle,
    488     UINT32                  NestingLevel,
    489     void                    *Context,
    490     void                    **ReturnValue)
    491 {
    492     ACPI_STATUS             Status;
    493     char                    *RequestedName = (char *) Context;
    494     UINT32                  i;
    495     ACPI_BUFFER             Buffer;
    496     ACPI_WALK_INFO          Info;
    497 
    498 
    499     /* Check for a name match */
    500 
    501     for (i = 0; i < 4; i++)
    502     {
    503         /* Wildcard support */
    504 
    505         if ((RequestedName[i] != '?') &&
    506             (RequestedName[i] != ((ACPI_NAMESPACE_NODE *)
    507                 ObjHandle)->Name.Ascii[i]))
    508         {
    509             /* No match, just exit */
    510 
    511             return (AE_OK);
    512         }
    513     }
    514 
    515     /* Get the full pathname to this object */
    516 
    517     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    518     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
    519     if (ACPI_FAILURE (Status))
    520     {
    521         AcpiOsPrintf ("Could Not get pathname for object %p\n",
    522             ObjHandle);
    523     }
    524     else
    525     {
    526         Info.Count = 0;
    527         Info.OwnerId = ACPI_OWNER_ID_MAX;
    528         Info.DebugLevel = ACPI_UINT32_MAX;
    529         Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
    530 
    531         AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
    532         (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
    533         ACPI_FREE (Buffer.Pointer);
    534     }
    535 
    536     return (AE_OK);
    537 }
    538 
    539 
    540 /*******************************************************************************
    541  *
    542  * FUNCTION:    AcpiDbFindNameInNamespace
    543  *
    544  * PARAMETERS:  NameArg         - The 4-character ACPI name to find.
    545  *                                wildcards are supported.
    546  *
    547  * RETURN:      None
    548  *
    549  * DESCRIPTION: Search the namespace for a given name (with wildcards)
    550  *
    551  ******************************************************************************/
    552 
    553 ACPI_STATUS
    554 AcpiDbFindNameInNamespace (
    555     char                    *NameArg)
    556 {
    557     char                    AcpiName[5] = "____";
    558     char                    *AcpiNamePtr = AcpiName;
    559 
    560 
    561     if (strlen (NameArg) > ACPI_NAMESEG_SIZE)
    562     {
    563         AcpiOsPrintf ("Name must be no longer than 4 characters\n");
    564         return (AE_OK);
    565     }
    566 
    567     /* Pad out name with underscores as necessary to create a 4-char name */
    568 
    569     AcpiUtStrupr (NameArg);
    570     while (*NameArg)
    571     {
    572         *AcpiNamePtr = *NameArg;
    573         AcpiNamePtr++;
    574         NameArg++;
    575     }
    576 
    577     /* Walk the namespace from the root */
    578 
    579     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
    580         ACPI_UINT32_MAX, AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
    581 
    582     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    583     return (AE_OK);
    584 }
    585 
    586 
    587 /*******************************************************************************
    588  *
    589  * FUNCTION:    AcpiDbWalkForPredefinedNames
    590  *
    591  * PARAMETERS:  Callback from WalkNamespace
    592  *
    593  * RETURN:      Status
    594  *
    595  * DESCRIPTION: Detect and display predefined ACPI names (names that start with
    596  *              an underscore)
    597  *
    598  ******************************************************************************/
    599 
    600 static ACPI_STATUS
    601 AcpiDbWalkForPredefinedNames (
    602     ACPI_HANDLE             ObjHandle,
    603     UINT32                  NestingLevel,
    604     void                    *Context,
    605     void                    **ReturnValue)
    606 {
    607     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
    608     UINT32                      *Count = (UINT32 *) Context;
    609     const ACPI_PREDEFINED_INFO  *Predefined;
    610     const ACPI_PREDEFINED_INFO  *Package = NULL;
    611     char                        *Pathname;
    612     char                        StringBuffer[48];
    613 
    614 
    615     Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
    616     if (!Predefined)
    617     {
    618         return (AE_OK);
    619     }
    620 
    621     Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
    622     if (!Pathname)
    623     {
    624         return (AE_OK);
    625     }
    626 
    627     /* If method returns a package, the info is in the next table entry */
    628 
    629     if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE)
    630     {
    631         Package = Predefined + 1;
    632     }
    633 
    634     AcpiUtGetExpectedReturnTypes (StringBuffer,
    635         Predefined->Info.ExpectedBtypes);
    636 
    637     AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname,
    638         METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList),
    639         StringBuffer);
    640 
    641     if (Package)
    642     {
    643         AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
    644             Package->RetInfo.Type, Package->RetInfo.ObjectType1,
    645             Package->RetInfo.Count1);
    646     }
    647 
    648     AcpiOsPrintf("\n");
    649 
    650     /* Check that the declared argument count matches the ACPI spec */
    651 
    652     AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined);
    653 
    654     ACPI_FREE (Pathname);
    655     (*Count)++;
    656     return (AE_OK);
    657 }
    658 
    659 
    660 /*******************************************************************************
    661  *
    662  * FUNCTION:    AcpiDbCheckPredefinedNames
    663  *
    664  * PARAMETERS:  None
    665  *
    666  * RETURN:      None
    667  *
    668  * DESCRIPTION: Validate all predefined names in the namespace
    669  *
    670  ******************************************************************************/
    671 
    672 void
    673 AcpiDbCheckPredefinedNames (
    674     void)
    675 {
    676     UINT32                  Count = 0;
    677 
    678 
    679     /* Search all nodes in namespace */
    680 
    681     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
    682         ACPI_UINT32_MAX, AcpiDbWalkForPredefinedNames,
    683         NULL, (void *) &Count, NULL);
    684 
    685     AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
    686 }
    687 
    688 
    689 /*******************************************************************************
    690  *
    691  * FUNCTION:    AcpiDbWalkForObjectCounts
    692  *
    693  * PARAMETERS:  Callback from WalkNamespace
    694  *
    695  * RETURN:      Status
    696  *
    697  * DESCRIPTION: Display short info about objects in the namespace
    698  *
    699  ******************************************************************************/
    700 
    701 static ACPI_STATUS
    702 AcpiDbWalkForObjectCounts (
    703     ACPI_HANDLE             ObjHandle,
    704     UINT32                  NestingLevel,
    705     void                    *Context,
    706     void                    **ReturnValue)
    707 {
    708     ACPI_OBJECT_INFO        *Info = (ACPI_OBJECT_INFO *) Context;
    709     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
    710 
    711 
    712     if (Node->Type > ACPI_TYPE_NS_NODE_MAX)
    713     {
    714         AcpiOsPrintf ("[%4.4s]: Unknown object type %X\n",
    715             Node->Name.Ascii, Node->Type);
    716     }
    717     else
    718     {
    719         Info->Types[Node->Type]++;
    720     }
    721 
    722     return (AE_OK);
    723 }
    724 
    725 
    726 /*******************************************************************************
    727  *
    728  * FUNCTION:    AcpiDbWalkForFields
    729  *
    730  * PARAMETERS:  Callback from WalkNamespace
    731  *
    732  * RETURN:      Status
    733  *
    734  * DESCRIPTION: Display short info about objects in the namespace
    735  *
    736  ******************************************************************************/
    737 
    738 static ACPI_STATUS
    739 AcpiDbWalkForFields (
    740     ACPI_HANDLE             ObjHandle,
    741     UINT32                  NestingLevel,
    742     void                    *Context,
    743     void                    **ReturnValue)
    744 {
    745     ACPI_OBJECT             *RetValue;
    746     ACPI_REGION_WALK_INFO   *Info = (ACPI_REGION_WALK_INFO *) Context;
    747     ACPI_BUFFER             Buffer;
    748     ACPI_STATUS             Status;
    749     ACPI_NAMESPACE_NODE     *Node = AcpiNsValidateHandle (ObjHandle);
    750 
    751 
    752     if (!Node)
    753     {
    754        return (AE_OK);
    755     }
    756     if (Node->Object->Field.RegionObj->Region.SpaceId != Info->AddressSpaceId)
    757     {
    758        return (AE_OK);
    759     }
    760 
    761     Info->Count++;
    762 
    763     /* Get and display the full pathname to this object */
    764 
    765     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    766     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
    767     if (ACPI_FAILURE (Status))
    768     {
    769         AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
    770         return (AE_OK);
    771     }
    772 
    773     AcpiOsPrintf ("%s ", (char *) Buffer.Pointer);
    774     ACPI_FREE (Buffer.Pointer);
    775 
    776     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    777     Status = AcpiEvaluateObject (ObjHandle, NULL, NULL, &Buffer);
    778     if (ACPI_FAILURE (Status))
    779     {
    780         AcpiOsPrintf ("Could Not evaluate object %p\n", ObjHandle);
    781         return (AE_OK);
    782     }
    783 
    784     /*
    785      * Since this is a field unit, surround the output in braces
    786      */
    787     AcpiOsPrintf ("{");
    788 
    789     RetValue = (ACPI_OBJECT *) Buffer.Pointer;
    790     switch (RetValue->Type)
    791     {
    792         case ACPI_TYPE_INTEGER:
    793 
    794             AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (RetValue->Integer.Value));
    795             break;
    796 
    797         case ACPI_TYPE_BUFFER:
    798 
    799             AcpiUtDumpBuffer (RetValue->Buffer.Pointer,
    800                 RetValue->Buffer.Length, DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0);
    801             break;
    802 
    803         default:
    804 
    805             break;
    806     }
    807 
    808     AcpiOsPrintf ("}\n");
    809 
    810     ACPI_FREE (Buffer.Pointer);
    811     return (AE_OK);
    812 }
    813 
    814 
    815 /*******************************************************************************
    816  *
    817  * FUNCTION:    AcpiDbWalkForSpecificObjects
    818  *
    819  * PARAMETERS:  Callback from WalkNamespace
    820  *
    821  * RETURN:      Status
    822  *
    823  * DESCRIPTION: Display short info about objects in the namespace
    824  *
    825  ******************************************************************************/
    826 
    827 static ACPI_STATUS
    828 AcpiDbWalkForSpecificObjects (
    829     ACPI_HANDLE             ObjHandle,
    830     UINT32                  NestingLevel,
    831     void                    *Context,
    832     void                    **ReturnValue)
    833 {
    834     ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
    835     ACPI_BUFFER             Buffer;
    836     ACPI_STATUS             Status;
    837 
    838 
    839     Info->Count++;
    840 
    841     /* Get and display the full pathname to this object */
    842 
    843     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    844     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
    845     if (ACPI_FAILURE (Status))
    846     {
    847         AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
    848         return (AE_OK);
    849     }
    850 
    851     AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
    852     ACPI_FREE (Buffer.Pointer);
    853 
    854     /* Dump short info about the object */
    855 
    856     (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
    857     return (AE_OK);
    858 }
    859 
    860 
    861 /*******************************************************************************
    862  *
    863  * FUNCTION:    AcpiDbDisplayObjects
    864  *
    865  * PARAMETERS:  ObjTypeArg          - Type of object to display
    866  *              DisplayCountArg     - Max depth to display
    867  *
    868  * RETURN:      None
    869  *
    870  * DESCRIPTION: Display objects in the namespace of the requested type
    871  *
    872  ******************************************************************************/
    873 
    874 ACPI_STATUS
    875 AcpiDbDisplayObjects (
    876     char                    *ObjTypeArg,
    877     char                    *DisplayCountArg)
    878 {
    879     ACPI_WALK_INFO          Info;
    880     ACPI_OBJECT_TYPE        Type;
    881     ACPI_OBJECT_INFO        *ObjectInfo;
    882     UINT32                  i;
    883     UINT32                  TotalObjects = 0;
    884 
    885 
    886     /* No argument means display summary/count of all object types */
    887 
    888     if (!ObjTypeArg)
    889     {
    890         ObjectInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_OBJECT_INFO));
    891 
    892         if (!ObjectInfo)
    893                 return (AE_NO_MEMORY);
    894 
    895         /* Walk the namespace from the root */
    896 
    897         (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
    898             ACPI_UINT32_MAX, AcpiDbWalkForObjectCounts, NULL,
    899             (void *) ObjectInfo, NULL);
    900 
    901         AcpiOsPrintf ("\nSummary of namespace objects:\n\n");
    902 
    903         for (i = 0; i < ACPI_TOTAL_TYPES; i++)
    904         {
    905             AcpiOsPrintf ("%8u   %s\n", ObjectInfo->Types[i],
    906                 AcpiUtGetTypeName (i));
    907 
    908             TotalObjects += ObjectInfo->Types[i];
    909         }
    910 
    911         AcpiOsPrintf ("\n%8u   Total namespace objects\n\n",
    912             TotalObjects);
    913 
    914         ACPI_FREE (ObjectInfo);
    915         return (AE_OK);
    916     }
    917 
    918     /* Get the object type */
    919 
    920     Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
    921     if (Type == ACPI_TYPE_NOT_FOUND)
    922     {
    923         AcpiOsPrintf ("Invalid or unsupported argument\n");
    924         return (AE_OK);
    925     }
    926 
    927     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
    928     AcpiOsPrintf (
    929         "Objects of type [%s] defined in the current ACPI Namespace:\n",
    930         AcpiUtGetTypeName (Type));
    931 
    932     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    933 
    934     Info.Count = 0;
    935     Info.OwnerId = ACPI_OWNER_ID_MAX;
    936     Info.DebugLevel = ACPI_UINT32_MAX;
    937     Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
    938 
    939     /* Walk the namespace from the root */
    940 
    941     (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
    942         AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
    943 
    944     AcpiOsPrintf (
    945         "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
    946         Info.Count, AcpiUtGetTypeName (Type));
    947 
    948     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    949     return (AE_OK);
    950 }
    951 
    952 
    953 /*******************************************************************************
    954  *
    955  * FUNCTION:    AcpiDbDisplayFields
    956  *
    957  * PARAMETERS:  ObjTypeArg          - Type of object to display
    958  *              DisplayCountArg     - Max depth to display
    959  *
    960  * RETURN:      None
    961  *
    962  * DESCRIPTION: Display objects in the namespace of the requested type
    963  *
    964  ******************************************************************************/
    965 
    966 ACPI_STATUS
    967 AcpiDbDisplayFields (
    968     UINT32                  AddressSpaceId)
    969 {
    970     ACPI_REGION_WALK_INFO  Info;
    971 
    972 
    973     Info.Count = 0;
    974     Info.OwnerId = ACPI_OWNER_ID_MAX;
    975     Info.DebugLevel = ACPI_UINT32_MAX;
    976     Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
    977     Info.AddressSpaceId = AddressSpaceId;
    978 
    979     /* Walk the namespace from the root */
    980 
    981     (void) AcpiWalkNamespace (ACPI_TYPE_LOCAL_REGION_FIELD, ACPI_ROOT_OBJECT,
    982           ACPI_UINT32_MAX, AcpiDbWalkForFields, NULL,
    983           (void *) &Info, NULL);
    984 
    985     return (AE_OK);
    986 }
    987 
    988 
    989 /*******************************************************************************
    990  *
    991  * FUNCTION:    AcpiDbIntegrityWalk
    992  *
    993  * PARAMETERS:  Callback from WalkNamespace
    994  *
    995  * RETURN:      Status
    996  *
    997  * DESCRIPTION: Examine one NS node for valid values.
    998  *
    999  ******************************************************************************/
   1000 
   1001 static ACPI_STATUS
   1002 AcpiDbIntegrityWalk (
   1003     ACPI_HANDLE             ObjHandle,
   1004     UINT32                  NestingLevel,
   1005     void                    *Context,
   1006     void                    **ReturnValue)
   1007 {
   1008     ACPI_INTEGRITY_INFO     *Info = (ACPI_INTEGRITY_INFO *) Context;
   1009     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
   1010     ACPI_OPERAND_OBJECT     *Object;
   1011     BOOLEAN                 Alias = TRUE;
   1012 
   1013 
   1014     Info->Nodes++;
   1015 
   1016     /* Verify the NS node, and dereference aliases */
   1017 
   1018     while (Alias)
   1019     {
   1020         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
   1021         {
   1022             AcpiOsPrintf (
   1023                 "Invalid Descriptor Type for Node %p [%s] - "
   1024                 "is %2.2X should be %2.2X\n",
   1025                 Node, AcpiUtGetDescriptorName (Node),
   1026                 ACPI_GET_DESCRIPTOR_TYPE (Node), ACPI_DESC_TYPE_NAMED);
   1027             return (AE_OK);
   1028         }
   1029 
   1030         if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
   1031             (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
   1032         {
   1033             Node = (ACPI_NAMESPACE_NODE *) Node->Object;
   1034         }
   1035         else
   1036         {
   1037             Alias = FALSE;
   1038         }
   1039     }
   1040 
   1041     if (Node->Type > ACPI_TYPE_LOCAL_MAX)
   1042     {
   1043         AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
   1044             Node, Node->Type);
   1045         return (AE_OK);
   1046     }
   1047 
   1048     if (!AcpiUtValidNameseg (Node->Name.Ascii))
   1049     {
   1050         AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
   1051         return (AE_OK);
   1052     }
   1053 
   1054     Object = AcpiNsGetAttachedObject (Node);
   1055     if (Object)
   1056     {
   1057         Info->Objects++;
   1058         if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
   1059         {
   1060             AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
   1061                 Object, AcpiUtGetDescriptorName (Object));
   1062         }
   1063     }
   1064 
   1065     return (AE_OK);
   1066 }
   1067 
   1068 
   1069 /*******************************************************************************
   1070  *
   1071  * FUNCTION:    AcpiDbCheckIntegrity
   1072  *
   1073  * PARAMETERS:  None
   1074  *
   1075  * RETURN:      None
   1076  *
   1077  * DESCRIPTION: Check entire namespace for data structure integrity
   1078  *
   1079  ******************************************************************************/
   1080 
   1081 void
   1082 AcpiDbCheckIntegrity (
   1083     void)
   1084 {
   1085     ACPI_INTEGRITY_INFO     Info = {0,0};
   1086 
   1087     /* Search all nodes in namespace */
   1088 
   1089     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
   1090         ACPI_UINT32_MAX, AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
   1091 
   1092     AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
   1093         Info.Nodes, Info.Objects);
   1094 }
   1095 
   1096 
   1097 /*******************************************************************************
   1098  *
   1099  * FUNCTION:    AcpiDbWalkForReferences
   1100  *
   1101  * PARAMETERS:  Callback from WalkNamespace
   1102  *
   1103  * RETURN:      Status
   1104  *
   1105  * DESCRIPTION: Check if this namespace object refers to the target object
   1106  *              that is passed in as the context value.
   1107  *
   1108  * Note: Currently doesn't check subobjects within the Node's object
   1109  *
   1110  ******************************************************************************/
   1111 
   1112 static ACPI_STATUS
   1113 AcpiDbWalkForReferences (
   1114     ACPI_HANDLE             ObjHandle,
   1115     UINT32                  NestingLevel,
   1116     void                    *Context,
   1117     void                    **ReturnValue)
   1118 {
   1119     ACPI_OPERAND_OBJECT     *ObjDesc = (ACPI_OPERAND_OBJECT  *) Context;
   1120     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
   1121 
   1122 
   1123     /* Check for match against the namespace node itself */
   1124 
   1125     if (Node == (void *) ObjDesc)
   1126     {
   1127         AcpiOsPrintf ("Object is a Node [%4.4s]\n",
   1128             AcpiUtGetNodeName (Node));
   1129     }
   1130 
   1131     /* Check for match against the object attached to the node */
   1132 
   1133     if (AcpiNsGetAttachedObject (Node) == ObjDesc)
   1134     {
   1135         AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
   1136             Node, AcpiUtGetNodeName (Node));
   1137     }
   1138 
   1139     return (AE_OK);
   1140 }
   1141 
   1142 
   1143 /*******************************************************************************
   1144  *
   1145  * FUNCTION:    AcpiDbFindReferences
   1146  *
   1147  * PARAMETERS:  ObjectArg       - String with hex value of the object
   1148  *
   1149  * RETURN:      None
   1150  *
   1151  * DESCRIPTION: Search namespace for all references to the input object
   1152  *
   1153  ******************************************************************************/
   1154 
   1155 void
   1156 AcpiDbFindReferences (
   1157     char                    *ObjectArg)
   1158 {
   1159     ACPI_OPERAND_OBJECT     *ObjDesc;
   1160     ACPI_SIZE               Address;
   1161 
   1162 
   1163     /* Convert string to object pointer */
   1164 
   1165     Address = strtoul (ObjectArg, NULL, 16);
   1166     ObjDesc = ACPI_TO_POINTER (Address);
   1167 
   1168     /* Search all nodes in namespace */
   1169 
   1170     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
   1171         ACPI_UINT32_MAX, AcpiDbWalkForReferences, NULL,
   1172         (void *) ObjDesc, NULL);
   1173 }
   1174 
   1175 
   1176 /*******************************************************************************
   1177  *
   1178  * FUNCTION:    AcpiDbBusWalk
   1179  *
   1180  * PARAMETERS:  Callback from WalkNamespace
   1181  *
   1182  * RETURN:      Status
   1183  *
   1184  * DESCRIPTION: Display info about device objects that have a corresponding
   1185  *              _PRT method.
   1186  *
   1187  ******************************************************************************/
   1188 
   1189 static ACPI_STATUS
   1190 AcpiDbBusWalk (
   1191     ACPI_HANDLE             ObjHandle,
   1192     UINT32                  NestingLevel,
   1193     void                    *Context,
   1194     void                    **ReturnValue)
   1195 {
   1196     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
   1197     ACPI_STATUS             Status;
   1198     ACPI_BUFFER             Buffer;
   1199     ACPI_NAMESPACE_NODE     *TempNode;
   1200     ACPI_DEVICE_INFO        *Info;
   1201     UINT32                  i;
   1202 
   1203 
   1204     if ((Node->Type != ACPI_TYPE_DEVICE) &&
   1205         (Node->Type != ACPI_TYPE_PROCESSOR))
   1206     {
   1207         return (AE_OK);
   1208     }
   1209 
   1210     /* Exit if there is no _PRT under this device */
   1211 
   1212     Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
   1213         ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
   1214     if (ACPI_FAILURE (Status))
   1215     {
   1216         return (AE_OK);
   1217     }
   1218 
   1219     /* Get the full path to this device object */
   1220 
   1221     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
   1222     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
   1223     if (ACPI_FAILURE (Status))
   1224     {
   1225         AcpiOsPrintf ("Could Not get pathname for object %p\n",
   1226             ObjHandle);
   1227         return (AE_OK);
   1228     }
   1229 
   1230     Status = AcpiGetObjectInfo (ObjHandle, &Info);
   1231     if (ACPI_FAILURE (Status))
   1232     {
   1233         return (AE_OK);
   1234     }
   1235 
   1236     /* Display the full path */
   1237 
   1238     AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
   1239     ACPI_FREE (Buffer.Pointer);
   1240 
   1241     if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
   1242     {
   1243         AcpiOsPrintf ("  - Is PCI Root Bridge");
   1244     }
   1245     AcpiOsPrintf ("\n");
   1246 
   1247     /* _PRT info */
   1248 
   1249     AcpiOsPrintf ("_PRT: %p\n", TempNode);
   1250 
   1251     /* Dump _ADR, _HID, _UID, _CID */
   1252 
   1253     if (Info->Valid & ACPI_VALID_ADR)
   1254     {
   1255         AcpiOsPrintf ("_ADR: %8.8X%8.8X\n",
   1256             ACPI_FORMAT_UINT64 (Info->Address));
   1257     }
   1258     else
   1259     {
   1260         AcpiOsPrintf ("_ADR: <Not Present>\n");
   1261     }
   1262 
   1263     if (Info->Valid & ACPI_VALID_HID)
   1264     {
   1265         AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
   1266     }
   1267     else
   1268     {
   1269         AcpiOsPrintf ("_HID: <Not Present>\n");
   1270     }
   1271 
   1272     if (Info->Valid & ACPI_VALID_UID)
   1273     {
   1274         AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
   1275     }
   1276     else
   1277     {
   1278         AcpiOsPrintf ("_UID: <Not Present>\n");
   1279     }
   1280 
   1281     if (Info->Valid & ACPI_VALID_CID)
   1282     {
   1283         for (i = 0; i < Info->CompatibleIdList.Count; i++)
   1284         {
   1285             AcpiOsPrintf ("_CID: %s\n",
   1286                 Info->CompatibleIdList.Ids[i].String);
   1287         }
   1288     }
   1289     else
   1290     {
   1291         AcpiOsPrintf ("_CID: <Not Present>\n");
   1292     }
   1293 
   1294     ACPI_FREE (Info);
   1295     return (AE_OK);
   1296 }
   1297 
   1298 
   1299 /*******************************************************************************
   1300  *
   1301  * FUNCTION:    AcpiDbGetBusInfo
   1302  *
   1303  * PARAMETERS:  None
   1304  *
   1305  * RETURN:      None
   1306  *
   1307  * DESCRIPTION: Display info about system buses.
   1308  *
   1309  ******************************************************************************/
   1310 
   1311 void
   1312 AcpiDbGetBusInfo (
   1313     void)
   1314 {
   1315     /* Search all nodes in namespace */
   1316 
   1317     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
   1318         ACPI_UINT32_MAX, AcpiDbBusWalk, NULL, NULL, NULL);
   1319 }
   1320