nsdump.c revision 87031
1/******************************************************************************
2 *
3 * Module Name: nsdump - table dumping routines for debug
4 *              $Revision: 116 $
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights.  You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26
27 * make derivatives, distribute, use and display any portion of the Covered
28 * Code in any form, with the right to sublicense such rights; and
29 *
30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31 * license (with the right to sublicense), under only those claims of Intel
32 * patents that are infringed by the Original Intel Code, to make, use, sell,
33 * offer to sell, and import the Covered Code and derivative works thereof
34 * solely to the minimum extent necessary to exercise the above copyright
35 * license, and in no event shall the patent license extend to any additions
36 * to or modifications of the Original Intel Code.  No other license or right
37 * is granted directly or by implication, estoppel or otherwise;
38 *
39 * The above copyright and patent license is granted only if the following
40 * conditions are met:
41 *
42 * 3. Conditions
43 *
44 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45 * Redistribution of source code of any substantial portion of the Covered
46 * Code or modification with rights to further distribute source must include
47 * the above Copyright Notice, the above License, this list of Conditions,
48 * and the following Disclaimer and Export Compliance provision.  In addition,
49 * Licensee must cause all Covered Code to which Licensee contributes to
50 * contain a file documenting the changes Licensee made to create that Covered
51 * Code and the date of any change.  Licensee must include in that file the
52 * documentation of any changes made by any predecessor Licensee.  Licensee
53 * must include a prominent statement that the modification is derived,
54 * directly or indirectly, from Original Intel Code.
55 *
56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57 * Redistribution of source code of any substantial portion of the Covered
58 * Code or modification without rights to further distribute source must
59 * include the following Disclaimer and Export Compliance provision in the
60 * documentation and/or other materials provided with distribution.  In
61 * addition, Licensee may not authorize further sublicense of source of any
62 * portion of the Covered Code, and must include terms to the effect that the
63 * license from Licensee to its licensee is limited to the intellectual
64 * property embodied in the software Licensee provides to its licensee, and
65 * not to intellectual property embodied in modifications its licensee may
66 * make.
67 *
68 * 3.3. Redistribution of Executable. Redistribution in executable form of any
69 * substantial portion of the Covered Code or modification must reproduce the
70 * above Copyright Notice, and the following Disclaimer and Export Compliance
71 * provision in the documentation and/or other materials provided with the
72 * distribution.
73 *
74 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * Intel Code.
76 *
77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78 * Intel shall be used in advertising or otherwise to promote the sale, use or
79 * other dealings in products derived from or relating to the Covered Code
80 * without prior written authorization from Intel.
81 *
82 * 4. Disclaimer and Export Compliance
83 *
84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * PARTICULAR PURPOSE.
91 *
92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * LIMITED REMEDY.
100 *
101 * 4.3. Licensee shall not export, either directly or indirectly, any of this
102 * software or system incorporating such software without first obtaining any
103 * required license or other approval from the U. S. Department of Commerce or
104 * any other agency or department of the United States Government.  In the
105 * event Licensee exports any such software from the United States or
106 * re-exports any such software from a foreign destination, Licensee shall
107 * ensure that the distribution and export/re-export of the software is in
108 * compliance with all laws, regulations, orders, or other restrictions of the
109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110 * any of its subsidiaries will export/re-export any technical data, process,
111 * software, or service, directly or indirectly, to any country for which the
112 * United States government or any agency thereof requires an export license,
113 * other governmental approval, or letter of assurance, without first obtaining
114 * such license, approval or letter.
115 *
116 *****************************************************************************/
117
118#define __NSDUMP_C__
119
120#include "acpi.h"
121#include "acinterp.h"
122#include "acnamesp.h"
123#include "actables.h"
124#include "acparser.h"
125
126
127#define _COMPONENT          ACPI_NAMESPACE
128        MODULE_NAME         ("nsdump")
129
130#if defined(ACPI_DEBUG) || defined(ENABLE_DEBUGGER)
131
132
133/*******************************************************************************
134 *
135 * FUNCTION:    AcpiNsPrintPathname
136 *
137 * PARAMETERS:  NumSegment          - Number of ACPI name segments
138 *              Pathname            - The compressed (internal) path
139 *
140 * DESCRIPTION: Print an object's full namespace pathname
141 *
142 ******************************************************************************/
143
144void
145AcpiNsPrintPathname (
146    UINT32                  NumSegments,
147    char                    *Pathname)
148{
149    UINT32                  i;
150
151    PROC_NAME ("AcpiNsPrintPathname");
152
153
154    if (!(AcpiDbgLevel & ACPI_LV_NAMES) || !(AcpiDbgLayer & ACPI_NAMESPACE))
155    {
156        return;
157    }
158
159        /* Print the entire name */
160
161    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "["));
162
163    for (i = 0; i < NumSegments; i++)
164    {
165        AcpiOsPrintf ("%4.4s.", (char *) &Pathname[i * 4]);
166    }
167
168    AcpiOsPrintf ("]\n");
169}
170
171
172/*******************************************************************************
173 *
174 * FUNCTION:    AcpiNsDumpPathname
175 *
176 * PARAMETERS:  Handle              - Object
177 *              Msg                 - Prefix message
178 *              Level               - Desired debug level
179 *              Component           - Caller's component ID
180 *
181 * DESCRIPTION: Print an object's full namespace pathname
182 *              Manages allocation/freeing of a pathname buffer
183 *
184 ******************************************************************************/
185
186ACPI_STATUS
187AcpiNsDumpPathname (
188    ACPI_HANDLE             Handle,
189    NATIVE_CHAR             *Msg,
190    UINT32                  Level,
191    UINT32                  Component)
192{
193    NATIVE_CHAR             *Buffer;
194    UINT32                  Length;
195
196
197    FUNCTION_TRACE ("NsDumpPathname");
198
199
200    /* Do this only if the requested debug level and component are enabled */
201
202    if (!(AcpiDbgLevel & Level) || !(AcpiDbgLayer & Component))
203    {
204        return_ACPI_STATUS (AE_OK);
205    }
206
207    Buffer = ACPI_MEM_ALLOCATE (PATHNAME_MAX);
208    if (!Buffer)
209    {
210        return_ACPI_STATUS (AE_NO_MEMORY);
211    }
212
213    /* Convert handle to a full pathname and print it (with supplied message) */
214
215    Length = PATHNAME_MAX;
216    if (ACPI_SUCCESS (AcpiNsHandleToPathname (Handle, &Length, Buffer)))
217    {
218        AcpiOsPrintf ("%s %s (Node %p)\n", Msg, Buffer, Handle);
219    }
220
221    ACPI_MEM_FREE (Buffer);
222
223    return_ACPI_STATUS (AE_OK);
224}
225
226
227/*******************************************************************************
228 *
229 * FUNCTION:    AcpiNsDumpOneObject
230 *
231 * PARAMETERS:  Handle              - Node to be dumped
232 *              Level               - Nesting level of the handle
233 *              Context             - Passed into WalkNamespace
234 *
235 * DESCRIPTION: Dump a single Node
236 *              This procedure is a UserFunction called by AcpiNsWalkNamespace.
237 *
238 ******************************************************************************/
239
240ACPI_STATUS
241AcpiNsDumpOneObject (
242    ACPI_HANDLE             ObjHandle,
243    UINT32                  Level,
244    void                    *Context,
245    void                    **ReturnValue)
246{
247    ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
248    ACPI_NAMESPACE_NODE     *ThisNode;
249    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
250    ACPI_OBJECT_TYPE8       ObjType;
251    ACPI_OBJECT_TYPE8       Type;
252    UINT32                  BytesToDump;
253    UINT32                  DownstreamSiblingMask = 0;
254    UINT32                  LevelTmp;
255    UINT32                  WhichBit;
256    UINT32                  i;
257
258
259    PROC_NAME ("NsDumpOneObject");
260
261
262    ThisNode = AcpiNsMapHandleToNode (ObjHandle);
263
264    LevelTmp    = Level;
265    Type        = ThisNode->Type;
266    WhichBit    = 1;
267
268
269    if (!(AcpiDbgLevel & Info->DebugLevel))
270    {
271        return (AE_OK);
272    }
273
274    if (!((ACPI_LV_TABLES & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
275    {
276        return (AE_OK);
277    }
278
279    if (!ObjHandle)
280    {
281        ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Null object handle\n"));
282        return (AE_OK);
283    }
284
285    /* Check if the owner matches */
286
287    if ((Info->OwnerId != ACPI_UINT32_MAX) &&
288        (Info->OwnerId != ThisNode->OwnerId))
289    {
290        return (AE_OK);
291    }
292
293    /* Indent the object according to the level */
294
295    while (LevelTmp--)
296    {
297        /* Print appropriate characters to form tree structure */
298
299        if (LevelTmp)
300        {
301            if (DownstreamSiblingMask & WhichBit)
302            {
303                AcpiOsPrintf ("|");
304            }
305            else
306            {
307                AcpiOsPrintf (" ");
308            }
309
310            WhichBit <<= 1;
311        }
312        else
313        {
314            if (AcpiNsExistDownstreamSibling (ThisNode + 1))
315            {
316                DownstreamSiblingMask |= (1 << (Level - 1));
317                AcpiOsPrintf ("+");
318            }
319            else
320            {
321                DownstreamSiblingMask &= ACPI_UINT32_MAX ^ (1 << (Level - 1));
322                AcpiOsPrintf ("+");
323            }
324
325            if (ThisNode->Child == NULL)
326            {
327                AcpiOsPrintf ("-");
328            }
329            else if (AcpiNsExistDownstreamSibling (ThisNode->Child))
330            {
331                AcpiOsPrintf ("+");
332            }
333            else
334            {
335                AcpiOsPrintf ("-");
336            }
337        }
338    }
339
340    /* Check the integrity of our data */
341
342    if (Type > INTERNAL_TYPE_MAX)
343    {
344        Type = INTERNAL_TYPE_DEF_ANY;  /* prints as *ERROR* */
345    }
346
347    if (!AcpiUtValidAcpiName (ThisNode->Name))
348    {
349        REPORT_WARNING (("Invalid ACPI Name %08X\n", ThisNode->Name));
350    }
351
352    /*
353     * Now we can print out the pertinent information
354     */
355    AcpiOsPrintf (" %4.4s %-12s %p",
356            (char *) &ThisNode->Name, AcpiUtGetTypeName (Type), ThisNode);
357
358    ObjDesc = AcpiNsGetAttachedObject (ThisNode);
359
360    switch (Info->DisplayType)
361    {
362    case ACPI_DISPLAY_SUMMARY:
363
364        if (!ObjDesc)
365        {
366            /* No attached object, we are done */
367
368            AcpiOsPrintf ("\n");
369            return (AE_OK);
370        }
371
372        switch (Type)
373        {
374        case ACPI_TYPE_PROCESSOR:
375            AcpiOsPrintf (" ID %d Addr %.4X Len %.4X\n",
376                        ObjDesc->Processor.ProcId,
377                        ObjDesc->Processor.Address,
378                        ObjDesc->Processor.Length);
379            break;
380
381        case ACPI_TYPE_DEVICE:
382            AcpiOsPrintf (" Notification object: %p", ObjDesc);
383            break;
384
385        case ACPI_TYPE_METHOD:
386            AcpiOsPrintf (" Args %d Len %.4X Aml %p \n",
387                        ObjDesc->Method.ParamCount,
388                        ObjDesc->Method.AmlLength,
389                        ObjDesc->Method.AmlStart);
390            break;
391
392        case ACPI_TYPE_INTEGER:
393            AcpiOsPrintf (" = %8.8X%8.8X\n",
394                        HIDWORD (ObjDesc->Integer.Value),
395                        LODWORD (ObjDesc->Integer.Value));
396            break;
397
398        case ACPI_TYPE_PACKAGE:
399            AcpiOsPrintf (" Elements %.2X\n",
400                        ObjDesc->Package.Count);
401            break;
402
403        case ACPI_TYPE_BUFFER:
404            AcpiOsPrintf (" Len %.2X",
405                        ObjDesc->Buffer.Length);
406
407            /* Dump some of the buffer */
408
409            if (ObjDesc->Buffer.Length > 0)
410            {
411                AcpiOsPrintf (" =");
412                for (i = 0; (i < ObjDesc->Buffer.Length && i < 12); i++)
413                {
414                    AcpiOsPrintf (" %.2X", ObjDesc->Buffer.Pointer[i]);
415                }
416            }
417            AcpiOsPrintf ("\n");
418            break;
419
420        case ACPI_TYPE_STRING:
421            AcpiOsPrintf (" Len %.2X", ObjDesc->String.Length);
422
423            if (ObjDesc->String.Length > 0)
424            {
425                 AcpiOsPrintf (" = \"%.32s\"...", ObjDesc->String.Pointer);
426            }
427            AcpiOsPrintf ("\n");
428            break;
429
430        case ACPI_TYPE_REGION:
431            AcpiOsPrintf (" [%s]", AcpiUtGetRegionName (ObjDesc->Region.SpaceId));
432            if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
433            {
434                AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n",
435                            HIDWORD(ObjDesc->Region.Address),
436                            LODWORD(ObjDesc->Region.Address),
437                            ObjDesc->Region.Length);
438            }
439            else
440            {
441                AcpiOsPrintf (" [Address/Length not evaluated]\n");
442            }
443            break;
444
445        case INTERNAL_TYPE_REFERENCE:
446            AcpiOsPrintf (" [%s]\n",
447                    AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode));
448            break;
449
450        case ACPI_TYPE_BUFFER_FIELD:
451            if (ObjDesc->BufferField.BufferObj &&
452                ObjDesc->BufferField.BufferObj->Buffer.Node)
453            {
454                AcpiOsPrintf (" Buf [%4.4s]",
455                        (char *) &ObjDesc->BufferField.BufferObj->Buffer.Node->Name);
456            }
457            break;
458
459        case INTERNAL_TYPE_REGION_FIELD:
460            AcpiOsPrintf (" Rgn [%4.4s]",
461                    (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name);
462            break;
463
464        case INTERNAL_TYPE_BANK_FIELD:
465            AcpiOsPrintf (" Rgn [%4.4s] Bnk [%4.4s]",
466                    (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name,
467                    (char *) &ObjDesc->BankField.BankObj->CommonField.Node->Name);
468            break;
469
470        case INTERNAL_TYPE_INDEX_FIELD:
471            AcpiOsPrintf (" Idx [%4.4s] Dat [%4.4s]",
472                    (char *) &ObjDesc->IndexField.IndexObj->CommonField.Node->Name,
473                    (char *) &ObjDesc->IndexField.DataObj->CommonField.Node->Name);
474            break;
475
476        default:
477            AcpiOsPrintf (" Object %p\n", ObjDesc);
478            break;
479        }
480
481        /* Common field handling */
482
483        switch (Type)
484        {
485        case ACPI_TYPE_BUFFER_FIELD:
486        case INTERNAL_TYPE_REGION_FIELD:
487        case INTERNAL_TYPE_BANK_FIELD:
488        case INTERNAL_TYPE_INDEX_FIELD:
489            AcpiOsPrintf (" Off %.2X Len %.2X Acc %.2d\n",
490                    (ObjDesc->CommonField.BaseByteOffset * 8)
491                        + ObjDesc->CommonField.StartFieldBitOffset,
492                    ObjDesc->CommonField.BitLength,
493                    ObjDesc->CommonField.AccessBitWidth);
494            break;
495        }
496
497        break;
498
499
500    case ACPI_DISPLAY_OBJECTS:
501
502        AcpiOsPrintf ("%p O:%p",
503                ThisNode, ObjDesc);
504
505        if (!ObjDesc)
506        {
507            /* No attached object, we are done */
508
509            AcpiOsPrintf ("\n");
510            return (AE_OK);
511        }
512
513        AcpiOsPrintf ("(R%d)",
514                ObjDesc->Common.ReferenceCount);
515
516        switch (Type)
517        {
518        case ACPI_TYPE_METHOD:
519
520            /* Name is a Method and its AML offset/length are set */
521
522            AcpiOsPrintf (" M:%p-%X\n", ObjDesc->Method.AmlStart,
523                                        ObjDesc->Method.AmlLength);
524            break;
525
526        case ACPI_TYPE_INTEGER:
527
528            AcpiOsPrintf (" N:%X%X\n", HIDWORD(ObjDesc->Integer.Value),
529                                       LODWORD(ObjDesc->Integer.Value));
530            break;
531
532        case ACPI_TYPE_STRING:
533
534            AcpiOsPrintf (" S:%p-%X\n", ObjDesc->String.Pointer,
535                                        ObjDesc->String.Length);
536            break;
537
538        case ACPI_TYPE_BUFFER:
539
540            AcpiOsPrintf (" B:%p-%X\n", ObjDesc->Buffer.Pointer,
541                                        ObjDesc->Buffer.Length);
542            break;
543
544        default:
545
546            AcpiOsPrintf ("\n");
547            break;
548        }
549        break;
550
551
552    default:
553        AcpiOsPrintf ("\n");
554        break;
555    }
556
557    /* If debug turned off, done */
558
559    if (!(AcpiDbgLevel & ACPI_LV_VALUES))
560    {
561        return (AE_OK);
562    }
563
564
565    /* If there is an attached object, display it */
566
567    ObjDesc = AcpiNsGetAttachedObject (ThisNode);
568
569    /* Dump attached objects */
570
571    while (ObjDesc)
572    {
573        ObjType = INTERNAL_TYPE_INVALID;
574
575        /* Decode the type of attached object and dump the contents */
576
577        AcpiOsPrintf ("        Attached Object %p: ", ObjDesc);
578
579        if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_NAMED))
580        {
581            AcpiOsPrintf ("(Ptr to Node)\n");
582            BytesToDump = sizeof (ACPI_NAMESPACE_NODE);
583        }
584
585        else if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_INTERNAL))
586        {
587            ObjType = ObjDesc->Common.Type;
588
589            if (ObjType > INTERNAL_TYPE_MAX)
590            {
591                AcpiOsPrintf ("(Ptr to ACPI Object type %X [UNKNOWN])\n", ObjType);
592                BytesToDump = 32;
593            }
594            else
595            {
596                AcpiOsPrintf ("(Ptr to ACPI Object type %2.2X [%s])\n",
597                                    ObjType, AcpiUtGetTypeName (ObjType));
598                BytesToDump = sizeof (ACPI_OPERAND_OBJECT);
599            }
600        }
601        else
602        {
603            AcpiOsPrintf ("(String or Buffer - not descriptor)\n");
604            BytesToDump = 16;
605        }
606
607        DUMP_BUFFER (ObjDesc, BytesToDump);
608
609        /* If value is NOT an internal object, we are done */
610
611        if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_NAMED))
612        {
613            goto Cleanup;
614        }
615
616        /*
617         * Valid object, get the pointer to next level, if any
618         */
619        switch (ObjType)
620        {
621        case ACPI_TYPE_STRING:
622            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->String.Pointer;
623            break;
624
625        case ACPI_TYPE_BUFFER:
626            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->Buffer.Pointer;
627            break;
628
629        case ACPI_TYPE_BUFFER_FIELD:
630            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj;
631            break;
632
633        case ACPI_TYPE_PACKAGE:
634            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->Package.Elements;
635            break;
636
637        case ACPI_TYPE_METHOD:
638            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->Method.AmlStart;
639            break;
640
641        case INTERNAL_TYPE_REGION_FIELD:
642            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->Field.RegionObj;
643            break;
644
645        case INTERNAL_TYPE_BANK_FIELD:
646            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BankField.RegionObj;
647            break;
648
649        case INTERNAL_TYPE_INDEX_FIELD:
650            ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->IndexField.IndexObj;
651            break;
652
653       default:
654            goto Cleanup;
655        }
656
657        ObjType = INTERNAL_TYPE_INVALID;   /* Terminate loop after next pass */
658    }
659
660Cleanup:
661    AcpiOsPrintf ("\n");
662    return (AE_OK);
663}
664
665
666/*******************************************************************************
667 *
668 * FUNCTION:    AcpiNsDumpObjects
669 *
670 * PARAMETERS:  Type                - Object type to be dumped
671 *              MaxDepth            - Maximum depth of dump.  Use ACPI_UINT32_MAX
672 *                                    for an effectively unlimited depth.
673 *              OwnerId             - Dump only objects owned by this ID.  Use
674 *                                    ACPI_UINT32_MAX to match all owners.
675 *              StartHandle         - Where in namespace to start/end search
676 *
677 * DESCRIPTION: Dump typed objects within the loaded namespace.
678 *              Uses AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObject.
679 *
680 ******************************************************************************/
681
682void
683AcpiNsDumpObjects (
684    ACPI_OBJECT_TYPE8       Type,
685    UINT8                   DisplayType,
686    UINT32                  MaxDepth,
687    UINT32                  OwnerId,
688    ACPI_HANDLE             StartHandle)
689{
690    ACPI_WALK_INFO          Info;
691
692
693    FUNCTION_ENTRY ();
694
695
696    Info.DebugLevel = ACPI_LV_TABLES;
697    Info.OwnerId = OwnerId;
698    Info.DisplayType = DisplayType;
699
700
701    AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, NS_WALK_NO_UNLOCK, AcpiNsDumpOneObject,
702                        (void *) &Info, NULL);
703}
704
705
706#ifndef _ACPI_ASL_COMPILER
707/*******************************************************************************
708 *
709 * FUNCTION:    AcpiNsDumpOneDevice
710 *
711 * PARAMETERS:  Handle              - Node to be dumped
712 *              Level               - Nesting level of the handle
713 *              Context             - Passed into WalkNamespace
714 *
715 * DESCRIPTION: Dump a single Node that represents a device
716 *              This procedure is a UserFunction called by AcpiNsWalkNamespace.
717 *
718 ******************************************************************************/
719
720ACPI_STATUS
721AcpiNsDumpOneDevice (
722    ACPI_HANDLE             ObjHandle,
723    UINT32                  Level,
724    void                    *Context,
725    void                    **ReturnValue)
726{
727    ACPI_DEVICE_INFO        Info;
728    ACPI_STATUS             Status;
729    UINT32                  i;
730
731
732    PROC_NAME ("NsDumpOneDevice");
733
734
735    Status = AcpiNsDumpOneObject (ObjHandle, Level, Context, ReturnValue);
736
737    Status = AcpiGetObjectInfo (ObjHandle, &Info);
738    if (ACPI_SUCCESS (Status))
739    {
740        for (i = 0; i < Level; i++)
741        {
742            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " "));
743        }
744
745        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "    HID: %s, ADR: %8.8X%8.8X, Status: %x\n",
746                        Info.HardwareId, HIDWORD(Info.Address), LODWORD(Info.Address), Info.CurrentStatus));
747    }
748
749    return (Status);
750}
751
752
753/*******************************************************************************
754 *
755 * FUNCTION:    AcpiNsDumpRootDevices
756 *
757 * PARAMETERS:  None
758 *
759 * DESCRIPTION: Dump all objects of type "device"
760 *
761 ******************************************************************************/
762
763void
764AcpiNsDumpRootDevices (void)
765{
766    ACPI_HANDLE             SysBusHandle;
767
768
769    PROC_NAME ("NsDumpRootDevices");
770
771
772    /* Only dump the table if tracing is enabled */
773
774    if (!(ACPI_LV_TABLES & AcpiDbgLevel))
775    {
776        return;
777    }
778
779    AcpiGetHandle (0, NS_SYSTEM_BUS, &SysBusHandle);
780
781    ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Display of all devices in the namespace:\n"));
782    AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, SysBusHandle, ACPI_UINT32_MAX, NS_WALK_NO_UNLOCK,
783                        AcpiNsDumpOneDevice, NULL, NULL);
784}
785
786#endif
787
788/*******************************************************************************
789 *
790 * FUNCTION:    AcpiNsDumpTables
791 *
792 * PARAMETERS:  SearchBase          - Root of subtree to be dumped, or
793 *                                    NS_ALL to dump the entire namespace
794 *              MaxDepth            - Maximum depth of dump.  Use INT_MAX
795 *                                    for an effectively unlimited depth.
796 *
797 * DESCRIPTION: Dump the name space, or a portion of it.
798 *
799 ******************************************************************************/
800
801void
802AcpiNsDumpTables (
803    ACPI_HANDLE             SearchBase,
804    UINT32                  MaxDepth)
805{
806    ACPI_HANDLE             SearchHandle = SearchBase;
807
808
809    FUNCTION_TRACE ("NsDumpTables");
810
811
812    if (!AcpiGbl_RootNode)
813    {
814        /*
815         * If the name space has not been initialized,
816         * there is nothing to dump.
817         */
818        ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "name space not initialized!\n"));
819        return_VOID;
820    }
821
822    if (NS_ALL == SearchBase)
823    {
824        /*  entire namespace    */
825
826        SearchHandle = AcpiGbl_RootNode;
827        ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n"));
828    }
829
830
831    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth,
832            ACPI_UINT32_MAX, SearchHandle);
833    return_VOID;
834}
835
836
837/*******************************************************************************
838 *
839 * FUNCTION:    AcpiNsDumpEntry
840 *
841 * PARAMETERS:  Handle              - Node to be dumped
842 *              DebugLevel          - Output level
843 *
844 * DESCRIPTION: Dump a single Node
845 *
846 ******************************************************************************/
847
848void
849AcpiNsDumpEntry (
850    ACPI_HANDLE             Handle,
851    UINT32                  DebugLevel)
852{
853    ACPI_WALK_INFO          Info;
854
855
856    FUNCTION_ENTRY ();
857
858
859    Info.DebugLevel = DebugLevel;
860    Info.OwnerId = ACPI_UINT32_MAX;
861    Info.DisplayType = ACPI_DISPLAY_SUMMARY;
862
863    AcpiNsDumpOneObject (Handle, 1, &Info, NULL);
864}
865
866#endif
867
868