1 /*******************************************************************************
3 * Module Name: dmobject - ACPI object decode and display
5 ******************************************************************************/
8 * Copyright (C) 2000 - 2013, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
51 #ifdef ACPI_DISASSEMBLER
53 #define _COMPONENT ACPI_CA_DEBUGGER
54 ACPI_MODULE_NAME ("dmnames")
56 /* Local prototypes */
60 ACPI_NAMESPACE_NODE
*Node
);
63 /*******************************************************************************
65 * FUNCTION: AcpiDmDumpMethodInfo
67 * PARAMETERS: Status - Method execution status
68 * WalkState - Current state of the parse tree walk
69 * Op - Executing parse op
73 * DESCRIPTION: Called when a method has been aborted because of an error.
74 * Dumps the method execution stack, and the method locals/args,
75 * and disassembles the AML opcode that failed.
77 ******************************************************************************/
80 AcpiDmDumpMethodInfo (
82 ACPI_WALK_STATE
*WalkState
,
83 ACPI_PARSE_OBJECT
*Op
)
85 ACPI_PARSE_OBJECT
*Next
;
86 ACPI_THREAD_STATE
*Thread
;
87 ACPI_WALK_STATE
*NextWalkState
;
88 ACPI_NAMESPACE_NODE
*PreviousMethod
= NULL
;
91 /* Ignore control codes, they are not errors */
93 if ((Status
& AE_CODE_MASK
) == AE_CODE_CONTROL
)
98 /* We may be executing a deferred opcode */
100 if (WalkState
->DeferredNode
)
102 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
107 * If there is no Thread, we are not actually executing a method.
108 * This can happen when the iASL compiler calls the interpreter
109 * to perform constant folding.
111 Thread
= WalkState
->Thread
;
117 /* Display exception and method name */
119 AcpiOsPrintf ("\n**** Exception %s during execution of method ",
120 AcpiFormatException (Status
));
121 AcpiNsPrintNodePathname (WalkState
->MethodNode
, NULL
);
123 /* Display stack of executing methods */
125 AcpiOsPrintf ("\n\nMethod Execution Stack:\n");
126 NextWalkState
= Thread
->WalkStateList
;
128 /* Walk list of linked walk states */
130 while (NextWalkState
)
132 AcpiOsPrintf (" Method [%4.4s] executing: ",
133 AcpiUtGetNodeName (NextWalkState
->MethodNode
));
135 /* First method is the currently executing method */
137 if (NextWalkState
== WalkState
)
141 /* Display currently executing ASL statement */
143 Next
= Op
->Common
.Next
;
144 Op
->Common
.Next
= NULL
;
146 AcpiDmDisassemble (NextWalkState
, Op
, ACPI_UINT32_MAX
);
147 Op
->Common
.Next
= Next
;
153 * This method has called another method
154 * NOTE: the method call parse subtree is already deleted at this
155 * point, so we cannot disassemble the method invocation.
157 AcpiOsPrintf ("Call to method ");
158 AcpiNsPrintNodePathname (PreviousMethod
, NULL
);
161 PreviousMethod
= NextWalkState
->MethodNode
;
162 NextWalkState
= NextWalkState
->Next
;
166 /* Display the method locals and arguments */
169 AcpiDmDisplayLocals (WalkState
);
171 AcpiDmDisplayArguments (WalkState
);
176 /*******************************************************************************
178 * FUNCTION: AcpiDmDecodeInternalObject
180 * PARAMETERS: ObjDesc - Object to be displayed
184 * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers.
186 ******************************************************************************/
189 AcpiDmDecodeInternalObject (
190 ACPI_OPERAND_OBJECT
*ObjDesc
)
197 AcpiOsPrintf (" Uninitialized");
201 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc
) != ACPI_DESC_TYPE_OPERAND
)
203 AcpiOsPrintf (" %p [%s]", ObjDesc
, AcpiUtGetDescriptorName (ObjDesc
));
207 AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc
));
209 switch (ObjDesc
->Common
.Type
)
211 case ACPI_TYPE_INTEGER
:
213 AcpiOsPrintf (" %8.8X%8.8X",
214 ACPI_FORMAT_UINT64 (ObjDesc
->Integer
.Value
));
217 case ACPI_TYPE_STRING
:
219 AcpiOsPrintf ("(%u) \"%.24s",
220 ObjDesc
->String
.Length
, ObjDesc
->String
.Pointer
);
222 if (ObjDesc
->String
.Length
> 24)
224 AcpiOsPrintf ("...");
232 case ACPI_TYPE_BUFFER
:
234 AcpiOsPrintf ("(%u)", ObjDesc
->Buffer
.Length
);
235 for (i
= 0; (i
< 8) && (i
< ObjDesc
->Buffer
.Length
); i
++)
237 AcpiOsPrintf (" %2.2X", ObjDesc
->Buffer
.Pointer
[i
]);
243 AcpiOsPrintf (" %p", ObjDesc
);
249 /*******************************************************************************
251 * FUNCTION: AcpiDmDecodeNode
253 * PARAMETERS: Node - Object to be displayed
257 * DESCRIPTION: Short display of a namespace node
259 ******************************************************************************/
263 ACPI_NAMESPACE_NODE
*Node
)
266 AcpiOsPrintf ("<Node> Name %4.4s",
267 AcpiUtGetNodeName (Node
));
269 if (Node
->Flags
& ANOBJ_METHOD_ARG
)
271 AcpiOsPrintf (" [Method Arg]");
273 if (Node
->Flags
& ANOBJ_METHOD_LOCAL
)
275 AcpiOsPrintf (" [Method Local]");
280 /* These types have no attached object */
282 case ACPI_TYPE_DEVICE
:
284 AcpiOsPrintf (" Device");
287 case ACPI_TYPE_THERMAL
:
289 AcpiOsPrintf (" Thermal Zone");
294 AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node
));
300 /*******************************************************************************
302 * FUNCTION: AcpiDmDisplayInternalObject
304 * PARAMETERS: ObjDesc - Object to be displayed
305 * WalkState - Current walk state
309 * DESCRIPTION: Short display of an internal object
311 ******************************************************************************/
314 AcpiDmDisplayInternalObject (
315 ACPI_OPERAND_OBJECT
*ObjDesc
,
316 ACPI_WALK_STATE
*WalkState
)
321 AcpiOsPrintf ("%p ", ObjDesc
);
325 AcpiOsPrintf ("<Null Object>\n");
329 /* Decode the object type */
331 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc
))
333 case ACPI_DESC_TYPE_PARSER
:
335 AcpiOsPrintf ("<Parser> ");
338 case ACPI_DESC_TYPE_NAMED
:
340 AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE
*) ObjDesc
);
343 case ACPI_DESC_TYPE_OPERAND
:
345 Type
= ObjDesc
->Common
.Type
;
346 if (Type
> ACPI_TYPE_LOCAL_MAX
)
348 AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32
) Type
);
352 /* Decode the ACPI object type */
354 switch (ObjDesc
->Common
.Type
)
356 case ACPI_TYPE_LOCAL_REFERENCE
:
358 AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (ObjDesc
));
360 /* Decode the refererence */
362 switch (ObjDesc
->Reference
.Class
)
364 case ACPI_REFCLASS_LOCAL
:
366 AcpiOsPrintf ("%X ", ObjDesc
->Reference
.Value
);
369 ObjDesc
= WalkState
->LocalVariables
370 [ObjDesc
->Reference
.Value
].Object
;
371 AcpiOsPrintf ("%p", ObjDesc
);
372 AcpiDmDecodeInternalObject (ObjDesc
);
376 case ACPI_REFCLASS_ARG
:
378 AcpiOsPrintf ("%X ", ObjDesc
->Reference
.Value
);
381 ObjDesc
= WalkState
->Arguments
382 [ObjDesc
->Reference
.Value
].Object
;
383 AcpiOsPrintf ("%p", ObjDesc
);
384 AcpiDmDecodeInternalObject (ObjDesc
);
388 case ACPI_REFCLASS_INDEX
:
390 switch (ObjDesc
->Reference
.TargetType
)
392 case ACPI_TYPE_BUFFER_FIELD
:
394 AcpiOsPrintf ("%p", ObjDesc
->Reference
.Object
);
395 AcpiDmDecodeInternalObject (ObjDesc
->Reference
.Object
);
398 case ACPI_TYPE_PACKAGE
:
400 AcpiOsPrintf ("%p", ObjDesc
->Reference
.Where
);
401 if (!ObjDesc
->Reference
.Where
)
403 AcpiOsPrintf (" Uninitialized WHERE pointer");
407 AcpiDmDecodeInternalObject (
408 *(ObjDesc
->Reference
.Where
));
414 AcpiOsPrintf ("Unknown index target type");
419 case ACPI_REFCLASS_REFOF
:
421 if (!ObjDesc
->Reference
.Object
)
423 AcpiOsPrintf ("Uninitialized reference subobject pointer");
427 /* Reference can be to a Node or an Operand object */
429 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc
->Reference
.Object
))
431 case ACPI_DESC_TYPE_NAMED
:
432 AcpiDmDecodeNode (ObjDesc
->Reference
.Object
);
435 case ACPI_DESC_TYPE_OPERAND
:
436 AcpiDmDecodeInternalObject (ObjDesc
->Reference
.Object
);
444 case ACPI_REFCLASS_NAME
:
446 AcpiDmDecodeNode (ObjDesc
->Reference
.Node
);
449 case ACPI_REFCLASS_DEBUG
:
450 case ACPI_REFCLASS_TABLE
:
455 default: /* Unknown reference class */
457 AcpiOsPrintf ("%2.2X\n", ObjDesc
->Reference
.Class
);
464 AcpiOsPrintf ("<Obj> ");
465 AcpiDmDecodeInternalObject (ObjDesc
);
472 AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]",
473 AcpiUtGetDescriptorName (ObjDesc
));
481 /*******************************************************************************
483 * FUNCTION: AcpiDmDisplayLocals
485 * PARAMETERS: WalkState - State for current method
489 * DESCRIPTION: Display all locals for the currently running control method
491 ******************************************************************************/
494 AcpiDmDisplayLocals (
495 ACPI_WALK_STATE
*WalkState
)
498 ACPI_OPERAND_OBJECT
*ObjDesc
;
499 ACPI_NAMESPACE_NODE
*Node
;
502 ObjDesc
= WalkState
->MethodDesc
;
503 Node
= WalkState
->MethodNode
;
507 "No method node (Executing subtree for buffer or opregion)\n");
511 if (Node
->Type
!= ACPI_TYPE_METHOD
)
513 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
517 AcpiOsPrintf ("Local Variables for method [%4.4s]:\n",
518 AcpiUtGetNodeName (Node
));
520 for (i
= 0; i
< ACPI_METHOD_NUM_LOCALS
; i
++)
522 ObjDesc
= WalkState
->LocalVariables
[i
].Object
;
523 AcpiOsPrintf (" Local%X: ", i
);
524 AcpiDmDisplayInternalObject (ObjDesc
, WalkState
);
529 /*******************************************************************************
531 * FUNCTION: AcpiDmDisplayArguments
533 * PARAMETERS: WalkState - State for current method
537 * DESCRIPTION: Display all arguments for the currently running control method
539 ******************************************************************************/
542 AcpiDmDisplayArguments (
543 ACPI_WALK_STATE
*WalkState
)
546 ACPI_OPERAND_OBJECT
*ObjDesc
;
547 ACPI_NAMESPACE_NODE
*Node
;
550 ObjDesc
= WalkState
->MethodDesc
;
551 Node
= WalkState
->MethodNode
;
555 "No method node (Executing subtree for buffer or opregion)\n");
559 if (Node
->Type
!= ACPI_TYPE_METHOD
)
561 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
566 "Arguments for Method [%4.4s]: (%X arguments defined, max concurrency = %X)\n",
567 AcpiUtGetNodeName (Node
), ObjDesc
->Method
.ParamCount
, ObjDesc
->Method
.SyncLevel
);
569 for (i
= 0; i
< ACPI_METHOD_NUM_ARGS
; i
++)
571 ObjDesc
= WalkState
->Arguments
[i
].Object
;
572 AcpiOsPrintf (" Arg%u: ", i
);
573 AcpiDmDisplayInternalObject (ObjDesc
, WalkState
);