dbdisply.c revision 1.14
1/*******************************************************************************
2 *
3 * Module Name: dbdisply - debug display commands
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2018, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
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.
25 *
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.
29 *
30 * NO WARRANTY
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.
42 */
43
44#include "acpi.h"
45#include "accommon.h"
46#include "amlcode.h"
47#include "acdispat.h"
48#include "acnamesp.h"
49#include "acparser.h"
50#include "acinterp.h"
51#include "acevents.h"
52#include "acdebug.h"
53
54
55#define _COMPONENT          ACPI_CA_DEBUGGER
56        ACPI_MODULE_NAME    ("dbdisply")
57
58/* Local prototypes */
59
60static void
61AcpiDbDumpParserDescriptor (
62    ACPI_PARSE_OBJECT       *Op);
63
64static void *
65AcpiDbGetPointer (
66    void                    *Target);
67
68static ACPI_STATUS
69AcpiDbDisplayNonRootHandlers (
70    ACPI_HANDLE             ObjHandle,
71    UINT32                  NestingLevel,
72    void                    *Context,
73    void                    **ReturnValue);
74
75/*
76 * System handler information.
77 * Used for Handlers command, in AcpiDbDisplayHandlers.
78 */
79#define ACPI_PREDEFINED_PREFIX          "%25s (%.2X) : "
80#define ACPI_HANDLER_NAME_STRING               "%30s : "
81#define ACPI_HANDLER_PRESENT_STRING                    "%-9s (%p)\n"
82#define ACPI_HANDLER_PRESENT_STRING2                   "%-9s (%p)"
83#define ACPI_HANDLER_NOT_PRESENT_STRING                "%-9s\n"
84
85/* All predefined Address Space IDs */
86
87static ACPI_ADR_SPACE_TYPE  AcpiGbl_SpaceIdList[] =
88{
89    ACPI_ADR_SPACE_SYSTEM_MEMORY,
90    ACPI_ADR_SPACE_SYSTEM_IO,
91    ACPI_ADR_SPACE_PCI_CONFIG,
92    ACPI_ADR_SPACE_EC,
93    ACPI_ADR_SPACE_SMBUS,
94    ACPI_ADR_SPACE_CMOS,
95    ACPI_ADR_SPACE_PCI_BAR_TARGET,
96    ACPI_ADR_SPACE_IPMI,
97    ACPI_ADR_SPACE_GPIO,
98    ACPI_ADR_SPACE_GSBUS,
99    ACPI_ADR_SPACE_DATA_TABLE,
100    ACPI_ADR_SPACE_FIXED_HARDWARE
101};
102
103/* Global handler information */
104
105typedef struct acpi_handler_info
106{
107    void                    *Handler;
108    char                    *Name;
109
110} ACPI_HANDLER_INFO;
111
112static ACPI_HANDLER_INFO    AcpiGbl_HandlerList[] =
113{
114    {&AcpiGbl_GlobalNotify[0].Handler,  __UNCONST("System Notifications")},
115    {&AcpiGbl_GlobalNotify[1].Handler,  __UNCONST("Device Notifications")},
116    {&AcpiGbl_TableHandler,             __UNCONST("ACPI Table Events")},
117    {&AcpiGbl_ExceptionHandler,         __UNCONST("Control Method Exceptions")},
118    {&AcpiGbl_InterfaceHandler,         __UNCONST("OSI Invocations")}
119};
120
121
122/*******************************************************************************
123 *
124 * FUNCTION:    AcpiDbGetPointer
125 *
126 * PARAMETERS:  Target          - Pointer to string to be converted
127 *
128 * RETURN:      Converted pointer
129 *
130 * DESCRIPTION: Convert an ascii pointer value to a real value
131 *
132 ******************************************************************************/
133
134static void *
135AcpiDbGetPointer (
136    void                    *Target)
137{
138    void                    *ObjPtr;
139    ACPI_SIZE               Address;
140
141
142    Address = strtoul (Target, NULL, 16);
143    ObjPtr = ACPI_TO_POINTER (Address);
144    return (ObjPtr);
145}
146
147
148/*******************************************************************************
149 *
150 * FUNCTION:    AcpiDbDumpParserDescriptor
151 *
152 * PARAMETERS:  Op              - A parser Op descriptor
153 *
154 * RETURN:      None
155 *
156 * DESCRIPTION: Display a formatted parser object
157 *
158 ******************************************************************************/
159
160static void
161AcpiDbDumpParserDescriptor (
162    ACPI_PARSE_OBJECT       *Op)
163{
164    const ACPI_OPCODE_INFO  *Info;
165
166
167    Info = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
168
169    AcpiOsPrintf ("Parser Op Descriptor:\n");
170    AcpiOsPrintf ("%20.20s : %4.4X\n", "Opcode", Op->Common.AmlOpcode);
171
172    ACPI_DEBUG_ONLY_MEMBERS (AcpiOsPrintf ("%20.20s : %s\n", "Opcode Name",
173        Info->Name));
174
175    AcpiOsPrintf ("%20.20s : %p\n", "Value/ArgList", Op->Common.Value.Arg);
176    AcpiOsPrintf ("%20.20s : %p\n", "Parent", Op->Common.Parent);
177    AcpiOsPrintf ("%20.20s : %p\n", "NextOp", Op->Common.Next);
178}
179
180
181/*******************************************************************************
182 *
183 * FUNCTION:    AcpiDbDecodeAndDisplayObject
184 *
185 * PARAMETERS:  Target          - String with object to be displayed. Names
186 *                                and hex pointers are supported.
187 *              OutputType      - Byte, Word, Dword, or Qword (B|W|D|Q)
188 *
189 * RETURN:      None
190 *
191 * DESCRIPTION: Display a formatted ACPI object
192 *
193 ******************************************************************************/
194
195void
196AcpiDbDecodeAndDisplayObject (
197    char                    *Target,
198    char                    *OutputType)
199{
200    void                    *ObjPtr;
201    ACPI_NAMESPACE_NODE     *Node;
202    ACPI_OPERAND_OBJECT     *ObjDesc;
203    UINT32                  Display = DB_BYTE_DISPLAY;
204    char                    Buffer[80];
205    ACPI_BUFFER             RetBuf;
206    ACPI_STATUS             Status;
207    UINT32                  Size;
208
209
210    if (!Target)
211    {
212        return;
213    }
214
215    /* Decode the output type */
216
217    if (OutputType)
218    {
219        AcpiUtStrupr (OutputType);
220        if (OutputType[0] == 'W')
221        {
222            Display = DB_WORD_DISPLAY;
223        }
224        else if (OutputType[0] == 'D')
225        {
226            Display = DB_DWORD_DISPLAY;
227        }
228        else if (OutputType[0] == 'Q')
229        {
230            Display = DB_QWORD_DISPLAY;
231        }
232    }
233
234    RetBuf.Length = sizeof (Buffer);
235    RetBuf.Pointer = Buffer;
236
237    /* Differentiate between a number and a name */
238
239    if ((Target[0] >= 0x30) && (Target[0] <= 0x39))
240    {
241        ObjPtr = AcpiDbGetPointer (Target);
242        if (!AcpiOsReadable (ObjPtr, 16))
243        {
244            AcpiOsPrintf (
245                "Address %p is invalid in this address space\n",
246                ObjPtr);
247            return;
248        }
249
250        /* Decode the object type */
251
252        switch (ACPI_GET_DESCRIPTOR_TYPE (ObjPtr))
253        {
254        case ACPI_DESC_TYPE_NAMED:
255
256            /* This is a namespace Node */
257
258            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_NAMESPACE_NODE)))
259            {
260                AcpiOsPrintf (
261                    "Cannot read entire Named object at address %p\n",
262                    ObjPtr);
263                return;
264            }
265
266            Node = ObjPtr;
267            goto DumpNode;
268
269        case ACPI_DESC_TYPE_OPERAND:
270
271            /* This is a ACPI OPERAND OBJECT */
272
273            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_OPERAND_OBJECT)))
274            {
275                AcpiOsPrintf (
276                    "Cannot read entire ACPI object at address %p\n",
277                    ObjPtr);
278                return;
279            }
280
281            AcpiUtDebugDumpBuffer (ObjPtr, sizeof (ACPI_OPERAND_OBJECT),
282                Display, ACPI_UINT32_MAX);
283            AcpiExDumpObjectDescriptor (ObjPtr, 1);
284            break;
285
286        case ACPI_DESC_TYPE_PARSER:
287
288            /* This is a Parser Op object */
289
290            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_PARSE_OBJECT)))
291            {
292                AcpiOsPrintf (
293                    "Cannot read entire Parser object at address %p\n",
294                    ObjPtr);
295                return;
296            }
297
298            AcpiUtDebugDumpBuffer (ObjPtr, sizeof (ACPI_PARSE_OBJECT),
299                Display, ACPI_UINT32_MAX);
300            AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr);
301            break;
302
303        default:
304
305            /* Is not a recognizeable object */
306
307            AcpiOsPrintf (
308                "Not a known ACPI internal object, descriptor type %2.2X\n",
309                ACPI_GET_DESCRIPTOR_TYPE (ObjPtr));
310
311            Size = 16;
312            if (AcpiOsReadable (ObjPtr, 64))
313            {
314                Size = 64;
315            }
316
317            /* Just dump some memory */
318
319            AcpiUtDebugDumpBuffer (ObjPtr, Size, Display, ACPI_UINT32_MAX);
320            break;
321        }
322
323        return;
324    }
325
326    /* The parameter is a name string that must be resolved to a Named obj */
327
328    Node = AcpiDbLocalNsLookup (Target);
329    if (!Node)
330    {
331        return;
332    }
333
334
335DumpNode:
336    /* Now dump the NS node */
337
338    Status = AcpiGetName (Node, ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
339    if (ACPI_FAILURE (Status))
340    {
341        AcpiOsPrintf ("Could not convert name to pathname\n");
342    }
343
344    else
345    {
346        AcpiOsPrintf ("Object %p: Namespace Node - Pathname: %s\n",
347            Node, (char *) RetBuf.Pointer);
348    }
349
350    if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
351    {
352        AcpiOsPrintf ("Invalid Named object at address %p\n", Node);
353        return;
354    }
355
356    AcpiUtDebugDumpBuffer ((void *) Node, sizeof (ACPI_NAMESPACE_NODE),
357        Display, ACPI_UINT32_MAX);
358    AcpiExDumpNamespaceNode (Node, 1);
359
360    ObjDesc = AcpiNsGetAttachedObject (Node);
361    if (ObjDesc)
362    {
363        AcpiOsPrintf ("\nAttached Object %p:", ObjDesc);
364        if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
365        {
366            AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
367                ObjDesc);
368            return;
369        }
370
371        if (ACPI_GET_DESCRIPTOR_TYPE (
372            ((ACPI_NAMESPACE_NODE *) ObjDesc)) == ACPI_DESC_TYPE_NAMED)
373        {
374            AcpiOsPrintf (" Namespace Node - ");
375            Status = AcpiGetName ((ACPI_NAMESPACE_NODE *) ObjDesc,
376                ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
377            if (ACPI_FAILURE (Status))
378            {
379                AcpiOsPrintf ("Could not convert name to pathname\n");
380            }
381            else
382            {
383                AcpiOsPrintf ("Pathname: %s",
384                    (char *) RetBuf.Pointer);
385            }
386
387            AcpiOsPrintf ("\n");
388            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
389                sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX);
390        }
391        else
392        {
393            AcpiOsPrintf ("\n");
394            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
395                sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
396        }
397
398        AcpiExDumpObjectDescriptor (ObjDesc, 1);
399    }
400}
401
402
403/*******************************************************************************
404 *
405 * FUNCTION:    AcpiDbDisplayMethodInfo
406 *
407 * PARAMETERS:  StartOp         - Root of the control method parse tree
408 *
409 * RETURN:      None
410 *
411 * DESCRIPTION: Display information about the current method
412 *
413 ******************************************************************************/
414
415void
416AcpiDbDisplayMethodInfo (
417    ACPI_PARSE_OBJECT       *StartOp)
418{
419    ACPI_WALK_STATE         *WalkState;
420    ACPI_OPERAND_OBJECT     *ObjDesc;
421    ACPI_NAMESPACE_NODE     *Node;
422    ACPI_PARSE_OBJECT       *RootOp;
423    ACPI_PARSE_OBJECT       *Op;
424    const ACPI_OPCODE_INFO  *OpInfo;
425    UINT32                  NumOps = 0;
426    UINT32                  NumOperands = 0;
427    UINT32                  NumOperators = 0;
428    UINT32                  NumRemainingOps = 0;
429    UINT32                  NumRemainingOperands = 0;
430    UINT32                  NumRemainingOperators = 0;
431    BOOLEAN                 CountRemaining = FALSE;
432
433
434    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
435    if (!WalkState)
436    {
437        AcpiOsPrintf ("There is no method currently executing\n");
438        return;
439    }
440
441    ObjDesc = WalkState->MethodDesc;
442    Node = WalkState->MethodNode;
443
444    AcpiOsPrintf ("Currently executing control method is [%4.4s]\n",
445        AcpiUtGetNodeName (Node));
446    AcpiOsPrintf ("%X Arguments, SyncLevel = %X\n",
447        (UINT32) ObjDesc->Method.ParamCount,
448        (UINT32) ObjDesc->Method.SyncLevel);
449
450    RootOp = StartOp;
451    while (RootOp->Common.Parent)
452    {
453        RootOp = RootOp->Common.Parent;
454    }
455
456    Op = RootOp;
457
458    while (Op)
459    {
460        if (Op == StartOp)
461        {
462            CountRemaining = TRUE;
463        }
464
465        NumOps++;
466        if (CountRemaining)
467        {
468            NumRemainingOps++;
469        }
470
471        /* Decode the opcode */
472
473        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
474        switch (OpInfo->Class)
475        {
476        case AML_CLASS_ARGUMENT:
477
478            if (CountRemaining)
479            {
480                NumRemainingOperands++;
481            }
482
483            NumOperands++;
484            break;
485
486        case AML_CLASS_UNKNOWN:
487
488            /* Bad opcode or ASCII character */
489
490            continue;
491
492        default:
493
494            if (CountRemaining)
495            {
496                NumRemainingOperators++;
497            }
498
499            NumOperators++;
500            break;
501        }
502
503        Op = AcpiPsGetDepthNext (StartOp, Op);
504    }
505
506    AcpiOsPrintf (
507        "Method contains:       %X AML Opcodes - %X Operators, %X Operands\n",
508        NumOps, NumOperators, NumOperands);
509
510    AcpiOsPrintf (
511        "Remaining to execute:  %X AML Opcodes - %X Operators, %X Operands\n",
512        NumRemainingOps, NumRemainingOperators, NumRemainingOperands);
513}
514
515
516/*******************************************************************************
517 *
518 * FUNCTION:    AcpiDbDisplayLocals
519 *
520 * PARAMETERS:  None
521 *
522 * RETURN:      None
523 *
524 * DESCRIPTION: Display all locals for the currently running control method
525 *
526 ******************************************************************************/
527
528void
529AcpiDbDisplayLocals (
530    void)
531{
532    ACPI_WALK_STATE         *WalkState;
533
534
535    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
536    if (!WalkState)
537    {
538        AcpiOsPrintf ("There is no method currently executing\n");
539        return;
540    }
541
542    AcpiDbDecodeLocals (WalkState);
543}
544
545
546/*******************************************************************************
547 *
548 * FUNCTION:    AcpiDbDisplayArguments
549 *
550 * PARAMETERS:  None
551 *
552 * RETURN:      None
553 *
554 * DESCRIPTION: Display all arguments for the currently running control method
555 *
556 ******************************************************************************/
557
558void
559AcpiDbDisplayArguments (
560    void)
561{
562    ACPI_WALK_STATE         *WalkState;
563
564
565    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
566    if (!WalkState)
567    {
568        AcpiOsPrintf ("There is no method currently executing\n");
569        return;
570    }
571
572    AcpiDbDecodeArguments (WalkState);
573}
574
575
576/*******************************************************************************
577 *
578 * FUNCTION:    AcpiDbDisplayResults
579 *
580 * PARAMETERS:  None
581 *
582 * RETURN:      None
583 *
584 * DESCRIPTION: Display current contents of a method result stack
585 *
586 ******************************************************************************/
587
588void
589AcpiDbDisplayResults (
590    void)
591{
592    UINT32                  i;
593    ACPI_WALK_STATE         *WalkState;
594    ACPI_OPERAND_OBJECT     *ObjDesc;
595    UINT32                  ResultCount = 0;
596    ACPI_NAMESPACE_NODE     *Node;
597    ACPI_GENERIC_STATE      *Frame;
598    UINT32                  Index; /* Index onto current frame */
599
600
601    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
602    if (!WalkState)
603    {
604        AcpiOsPrintf ("There is no method currently executing\n");
605        return;
606    }
607
608    ObjDesc = WalkState->MethodDesc;
609    Node  = WalkState->MethodNode;
610
611    if (WalkState->Results)
612    {
613        ResultCount = WalkState->ResultCount;
614    }
615
616    AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n",
617        AcpiUtGetNodeName (Node), ResultCount);
618
619    /* From the top element of result stack */
620
621    Frame = WalkState->Results;
622    Index = (ResultCount - 1) % ACPI_RESULTS_FRAME_OBJ_NUM;
623
624    for (i = 0; i < ResultCount; i++)
625    {
626        ObjDesc = Frame->Results.ObjDesc[Index];
627        AcpiOsPrintf ("Result%u: ", i);
628        AcpiDbDisplayInternalObject (ObjDesc, WalkState);
629
630        if (Index == 0)
631        {
632            Frame = Frame->Results.Next;
633            Index = ACPI_RESULTS_FRAME_OBJ_NUM;
634        }
635
636        Index--;
637    }
638}
639
640
641/*******************************************************************************
642 *
643 * FUNCTION:    AcpiDbDisplayCallingTree
644 *
645 * PARAMETERS:  None
646 *
647 * RETURN:      None
648 *
649 * DESCRIPTION: Display current calling tree of nested control methods
650 *
651 ******************************************************************************/
652
653void
654AcpiDbDisplayCallingTree (
655    void)
656{
657    ACPI_WALK_STATE         *WalkState;
658    ACPI_NAMESPACE_NODE     *Node;
659
660
661    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
662    if (!WalkState)
663    {
664        AcpiOsPrintf ("There is no method currently executing\n");
665        return;
666    }
667
668    Node = WalkState->MethodNode;
669    AcpiOsPrintf ("Current Control Method Call Tree\n");
670
671    while (WalkState)
672    {
673        Node = WalkState->MethodNode;
674        AcpiOsPrintf ("    [%4.4s]\n", AcpiUtGetNodeName (Node));
675
676        WalkState = WalkState->Next;
677    }
678}
679
680
681/*******************************************************************************
682 *
683 * FUNCTION:    AcpiDbDisplayObjectType
684 *
685 * PARAMETERS:  ObjectArg       - User entered NS node handle
686 *
687 * RETURN:      None
688 *
689 * DESCRIPTION: Display type of an arbitrary NS node
690 *
691 ******************************************************************************/
692
693void
694AcpiDbDisplayObjectType (
695    char                    *ObjectArg)
696{
697    ACPI_SIZE               Arg;
698    ACPI_HANDLE             Handle;
699    ACPI_DEVICE_INFO        *Info;
700    ACPI_STATUS             Status;
701    UINT32                  i;
702
703
704    Arg = strtoul (ObjectArg, NULL, 16);
705    Handle = ACPI_TO_POINTER (Arg);
706
707    Status = AcpiGetObjectInfo (Handle, &Info);
708    if (ACPI_FAILURE (Status))
709    {
710        AcpiOsPrintf ("Could not get object info, %s\n",
711            AcpiFormatException (Status));
712        return;
713    }
714
715    AcpiOsPrintf ("ADR: %8.8X%8.8X, Flags: %X\n",
716        ACPI_FORMAT_UINT64 (Info->Address), Info->Flags);
717
718    AcpiOsPrintf ("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
719        Info->HighestDstates[0], Info->HighestDstates[1],
720        Info->HighestDstates[2], Info->HighestDstates[3]);
721
722    AcpiOsPrintf ("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
723        Info->LowestDstates[0], Info->LowestDstates[1],
724        Info->LowestDstates[2], Info->LowestDstates[3],
725        Info->LowestDstates[4]);
726
727    if (Info->Valid & ACPI_VALID_HID)
728    {
729        AcpiOsPrintf ("HID: %s\n", Info->HardwareId.String);
730    }
731
732    if (Info->Valid & ACPI_VALID_UID)
733    {
734        AcpiOsPrintf ("UID: %s\n", Info->UniqueId.String);
735    }
736
737    if (Info->Valid & ACPI_VALID_CID)
738    {
739        for (i = 0; i < Info->CompatibleIdList.Count; i++)
740        {
741            AcpiOsPrintf ("CID %u: %s\n", i,
742                Info->CompatibleIdList.Ids[i].String);
743        }
744    }
745
746    ACPI_FREE (Info);
747}
748
749
750/*******************************************************************************
751 *
752 * FUNCTION:    AcpiDbDisplayResultObject
753 *
754 * PARAMETERS:  ObjDesc         - Object to be displayed
755 *              WalkState       - Current walk state
756 *
757 * RETURN:      None
758 *
759 * DESCRIPTION: Display the result of an AML opcode
760 *
761 * Note: Curently only displays the result object if we are single stepping.
762 * However, this output may be useful in other contexts and could be enabled
763 * to do so if needed.
764 *
765 ******************************************************************************/
766
767void
768AcpiDbDisplayResultObject (
769    ACPI_OPERAND_OBJECT     *ObjDesc,
770    ACPI_WALK_STATE         *WalkState)
771{
772
773#ifndef ACPI_APPLICATION
774    if (AcpiGbl_DbThreadId != AcpiOsGetThreadId())
775    {
776        return;
777    }
778#endif
779
780    /* Only display if single stepping */
781
782    if (!AcpiGbl_CmSingleStep)
783    {
784        return;
785    }
786
787    AcpiOsPrintf ("ResultObj: ");
788    AcpiDbDisplayInternalObject (ObjDesc, WalkState);
789    AcpiOsPrintf ("\n");
790}
791
792
793/*******************************************************************************
794 *
795 * FUNCTION:    AcpiDbDisplayArgumentObject
796 *
797 * PARAMETERS:  ObjDesc         - Object to be displayed
798 *              WalkState       - Current walk state
799 *
800 * RETURN:      None
801 *
802 * DESCRIPTION: Display the result of an AML opcode
803 *
804 ******************************************************************************/
805
806void
807AcpiDbDisplayArgumentObject (
808    ACPI_OPERAND_OBJECT     *ObjDesc,
809    ACPI_WALK_STATE         *WalkState)
810{
811
812#ifndef ACPI_APPLICATION
813    if (AcpiGbl_DbThreadId != AcpiOsGetThreadId())
814    {
815        return;
816    }
817#endif
818
819    if (!AcpiGbl_CmSingleStep)
820    {
821        return;
822    }
823
824    AcpiOsPrintf ("ArgObj:    ");
825    AcpiDbDisplayInternalObject (ObjDesc, WalkState);
826}
827
828
829#if (!ACPI_REDUCED_HARDWARE)
830/*******************************************************************************
831 *
832 * FUNCTION:    AcpiDbDisplayGpes
833 *
834 * PARAMETERS:  None
835 *
836 * RETURN:      None
837 *
838 * DESCRIPTION: Display the current GPE structures
839 *
840 ******************************************************************************/
841
842void
843AcpiDbDisplayGpes (
844    void)
845{
846    ACPI_GPE_BLOCK_INFO     *GpeBlock;
847    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
848    ACPI_GPE_EVENT_INFO     *GpeEventInfo;
849    ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
850    const char              *GpeType;
851    ACPI_GPE_NOTIFY_INFO    *Notify;
852    UINT32                  GpeIndex;
853    UINT32                  Block = 0;
854    UINT32                  i;
855    UINT32                  j;
856    UINT32                  Count;
857    char                    Buffer[80];
858    ACPI_BUFFER             RetBuf;
859    ACPI_STATUS             Status;
860
861
862    RetBuf.Length = sizeof (Buffer);
863    RetBuf.Pointer = Buffer;
864
865    Block = 0;
866
867    /* Walk the GPE lists */
868
869    GpeXruptInfo = AcpiGbl_GpeXruptListHead;
870    while (GpeXruptInfo)
871    {
872        GpeBlock = GpeXruptInfo->GpeBlockListHead;
873        while (GpeBlock)
874        {
875            Status = AcpiGetName (GpeBlock->Node,
876                ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
877            if (ACPI_FAILURE (Status))
878            {
879                AcpiOsPrintf ("Could not convert name to pathname\n");
880            }
881
882            if (GpeBlock->Node == AcpiGbl_FadtGpeDevice)
883            {
884                GpeType = "FADT-defined GPE block";
885            }
886            else
887            {
888                GpeType = "GPE Block Device";
889            }
890
891            AcpiOsPrintf (
892                "\nBlock %u - Info %p  DeviceNode %p [%s] - %s\n",
893                Block, GpeBlock, GpeBlock->Node, Buffer, GpeType);
894
895            AcpiOsPrintf (
896                "    Registers:    %u (%u GPEs)\n",
897                GpeBlock->RegisterCount, GpeBlock->GpeCount);
898
899            AcpiOsPrintf (
900                "    GPE range:    0x%X to 0x%X on interrupt %u\n",
901                GpeBlock->BlockBaseNumber,
902                GpeBlock->BlockBaseNumber + (GpeBlock->GpeCount - 1),
903                GpeXruptInfo->InterruptNumber);
904
905            AcpiOsPrintf (
906                "    RegisterInfo: %p  Status %8.8X%8.8X Enable %8.8X%8.8X\n",
907                GpeBlock->RegisterInfo,
908                ACPI_FORMAT_UINT64 (
909                    GpeBlock->RegisterInfo->StatusAddress.Address),
910                ACPI_FORMAT_UINT64 (
911                    GpeBlock->RegisterInfo->EnableAddress.Address));
912
913            AcpiOsPrintf ("    EventInfo:    %p\n", GpeBlock->EventInfo);
914
915            /* Examine each GPE Register within the block */
916
917            for (i = 0; i < GpeBlock->RegisterCount; i++)
918            {
919                GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
920
921                AcpiOsPrintf (
922                    "    Reg %u: (GPE %.2X-%.2X)  "
923                    "RunEnable %2.2X WakeEnable %2.2X"
924                    " Status %8.8X%8.8X Enable %8.8X%8.8X\n",
925                    i, GpeRegisterInfo->BaseGpeNumber,
926                    GpeRegisterInfo->BaseGpeNumber +
927                        (ACPI_GPE_REGISTER_WIDTH - 1),
928                    GpeRegisterInfo->EnableForRun,
929                    GpeRegisterInfo->EnableForWake,
930                    ACPI_FORMAT_UINT64 (
931                        GpeRegisterInfo->StatusAddress.Address),
932                    ACPI_FORMAT_UINT64 (
933                        GpeRegisterInfo->EnableAddress.Address));
934
935                /* Now look at the individual GPEs in this byte register */
936
937                for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
938                {
939                    GpeIndex = (i * ACPI_GPE_REGISTER_WIDTH) + j;
940                    GpeEventInfo = &GpeBlock->EventInfo[GpeIndex];
941
942                    if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
943                        ACPI_GPE_DISPATCH_NONE)
944                    {
945                        /* This GPE is not used (no method or handler), ignore it */
946
947                        continue;
948                    }
949
950                    AcpiOsPrintf (
951                        "        GPE %.2X: %p  RunRefs %2.2X Flags %2.2X (",
952                        GpeBlock->BlockBaseNumber + GpeIndex, GpeEventInfo,
953                        GpeEventInfo->RuntimeCount, GpeEventInfo->Flags);
954
955                    /* Decode the flags byte */
956
957                    if (GpeEventInfo->Flags & ACPI_GPE_LEVEL_TRIGGERED)
958                    {
959                        AcpiOsPrintf ("Level, ");
960                    }
961                    else
962                    {
963                        AcpiOsPrintf ("Edge,  ");
964                    }
965
966                    if (GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE)
967                    {
968                        AcpiOsPrintf ("CanWake, ");
969                    }
970                    else
971                    {
972                        AcpiOsPrintf ("RunOnly, ");
973                    }
974
975                    switch (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags))
976                    {
977                    case ACPI_GPE_DISPATCH_NONE:
978
979                        AcpiOsPrintf ("NotUsed");
980                        break;
981
982                    case ACPI_GPE_DISPATCH_METHOD:
983
984                        AcpiOsPrintf ("Method");
985                        break;
986
987                    case ACPI_GPE_DISPATCH_HANDLER:
988
989                        AcpiOsPrintf ("Handler");
990                        break;
991
992                    case ACPI_GPE_DISPATCH_NOTIFY:
993
994                        Count = 0;
995                        Notify = GpeEventInfo->Dispatch.NotifyList;
996                        while (Notify)
997                        {
998                            Count++;
999                            Notify = Notify->Next;
1000                        }
1001
1002                        AcpiOsPrintf ("Implicit Notify on %u devices",
1003                            Count);
1004                        break;
1005
1006                    case ACPI_GPE_DISPATCH_RAW_HANDLER:
1007
1008                        AcpiOsPrintf ("RawHandler");
1009                        break;
1010
1011                    default:
1012
1013                        AcpiOsPrintf ("UNKNOWN: %X",
1014                            ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags));
1015                        break;
1016                    }
1017
1018                    AcpiOsPrintf (")\n");
1019                }
1020            }
1021
1022            Block++;
1023            GpeBlock = GpeBlock->Next;
1024        }
1025
1026        GpeXruptInfo = GpeXruptInfo->Next;
1027    }
1028}
1029#endif /* !ACPI_REDUCED_HARDWARE */
1030
1031
1032/*******************************************************************************
1033 *
1034 * FUNCTION:    AcpiDbDisplayHandlers
1035 *
1036 * PARAMETERS:  None
1037 *
1038 * RETURN:      None
1039 *
1040 * DESCRIPTION: Display the currently installed global handlers
1041 *
1042 ******************************************************************************/
1043
1044void
1045AcpiDbDisplayHandlers (
1046    void)
1047{
1048    ACPI_OPERAND_OBJECT     *ObjDesc;
1049    ACPI_OPERAND_OBJECT     *HandlerObj;
1050    ACPI_ADR_SPACE_TYPE     SpaceId;
1051    UINT32                  i;
1052
1053
1054    /* Operation region handlers */
1055
1056    AcpiOsPrintf ("\nOperation Region Handlers at the namespace root:\n");
1057
1058    ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
1059    if (ObjDesc)
1060    {
1061        for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_SpaceIdList); i++)
1062        {
1063            SpaceId = AcpiGbl_SpaceIdList[i];
1064
1065            AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1066                AcpiUtGetRegionName ((UINT8) SpaceId), SpaceId);
1067
1068            HandlerObj = AcpiEvFindRegionHandler (
1069                SpaceId, ObjDesc->CommonNotify.Handler);
1070            if (HandlerObj)
1071            {
1072                AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
1073                    (HandlerObj->AddressSpace.HandlerFlags &
1074                        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ?
1075                        "Default" : "User",
1076                    HandlerObj->AddressSpace.Handler);
1077
1078                goto FoundHandler;
1079            }
1080
1081            /* There is no handler for this SpaceId */
1082
1083            AcpiOsPrintf ("None\n");
1084
1085        FoundHandler:;
1086        }
1087
1088        /* Find all handlers for user-defined SpaceIDs */
1089
1090        HandlerObj = ObjDesc->CommonNotify.Handler;
1091        while (HandlerObj)
1092        {
1093            if (HandlerObj->AddressSpace.SpaceId >= ACPI_USER_REGION_BEGIN)
1094            {
1095                AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1096                    "User-defined ID", HandlerObj->AddressSpace.SpaceId);
1097                AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
1098                    (HandlerObj->AddressSpace.HandlerFlags &
1099                        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ?
1100                        "Default" : "User",
1101                    HandlerObj->AddressSpace.Handler);
1102            }
1103
1104            HandlerObj = HandlerObj->AddressSpace.Next;
1105        }
1106    }
1107
1108#if (!ACPI_REDUCED_HARDWARE)
1109
1110    /* Fixed event handlers */
1111
1112    AcpiOsPrintf ("\nFixed Event Handlers:\n");
1113
1114    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
1115    {
1116        AcpiOsPrintf (ACPI_PREDEFINED_PREFIX, AcpiUtGetEventName (i), i);
1117        if (AcpiGbl_FixedEventHandlers[i].Handler)
1118        {
1119            AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User",
1120                AcpiGbl_FixedEventHandlers[i].Handler);
1121        }
1122        else
1123        {
1124            AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1125        }
1126    }
1127
1128#endif /* !ACPI_REDUCED_HARDWARE */
1129
1130    /* Miscellaneous global handlers */
1131
1132    AcpiOsPrintf ("\nMiscellaneous Global Handlers:\n");
1133
1134    for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_HandlerList); i++)
1135    {
1136        AcpiOsPrintf (ACPI_HANDLER_NAME_STRING,
1137            AcpiGbl_HandlerList[i].Name);
1138
1139        if (AcpiGbl_HandlerList[i].Handler)
1140        {
1141            AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User",
1142                AcpiGbl_HandlerList[i].Handler);
1143        }
1144        else
1145        {
1146            AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1147        }
1148    }
1149
1150
1151    /* Other handlers that are installed throughout the namespace */
1152
1153    AcpiOsPrintf ("\nOperation Region Handlers for specific devices:\n");
1154
1155    (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1156        ACPI_UINT32_MAX, AcpiDbDisplayNonRootHandlers,
1157        NULL, NULL, NULL);
1158}
1159
1160
1161/*******************************************************************************
1162 *
1163 * FUNCTION:    AcpiDbDisplayNonRootHandlers
1164 *
1165 * PARAMETERS:  ACPI_WALK_CALLBACK
1166 *
1167 * RETURN:      Status
1168 *
1169 * DESCRIPTION: Display information about all handlers installed for a
1170 *              device object.
1171 *
1172 ******************************************************************************/
1173
1174static ACPI_STATUS
1175AcpiDbDisplayNonRootHandlers (
1176    ACPI_HANDLE             ObjHandle,
1177    UINT32                  NestingLevel,
1178    void                    *Context,
1179    void                    **ReturnValue)
1180{
1181    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
1182    ACPI_OPERAND_OBJECT     *ObjDesc;
1183    ACPI_OPERAND_OBJECT     *HandlerObj;
1184    char                    *Pathname;
1185
1186
1187    ObjDesc = AcpiNsGetAttachedObject (Node);
1188    if (!ObjDesc)
1189    {
1190        return (AE_OK);
1191    }
1192
1193    Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
1194    if (!Pathname)
1195    {
1196        return (AE_OK);
1197    }
1198
1199    /* Display all handlers associated with this device */
1200
1201    HandlerObj = ObjDesc->CommonNotify.Handler;
1202    while (HandlerObj)
1203    {
1204        AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1205            AcpiUtGetRegionName ((UINT8) HandlerObj->AddressSpace.SpaceId),
1206            HandlerObj->AddressSpace.SpaceId);
1207
1208        AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING2,
1209            (HandlerObj->AddressSpace.HandlerFlags &
1210                ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User",
1211            HandlerObj->AddressSpace.Handler);
1212
1213        AcpiOsPrintf (" Device Name: %s (%p)\n", Pathname, Node);
1214
1215        HandlerObj = HandlerObj->AddressSpace.Next;
1216    }
1217
1218    ACPI_FREE (Pathname);
1219    return (AE_OK);
1220}
1221