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