1/******************************************************************************
2 *
3 * Module Name: exdebug - Support for stores to the AML Debug Object
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2013, 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#define __EXDEBUG_C__
45
46#include <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/include/acinterp.h>
49
50
51#define _COMPONENT          ACPI_EXECUTER
52        ACPI_MODULE_NAME    ("exdebug")
53
54
55#ifndef ACPI_NO_ERROR_MESSAGES
56/*******************************************************************************
57 *
58 * FUNCTION:    AcpiExDoDebugObject
59 *
60 * PARAMETERS:  SourceDesc          - Object to be output to "Debug Object"
61 *              Level               - Indentation level (used for packages)
62 *              Index               - Current package element, zero if not pkg
63 *
64 * RETURN:      None
65 *
66 * DESCRIPTION: Handles stores to the AML Debug Object. For example:
67 *              Store(INT1, Debug)
68 *
69 * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.
70 *
71 * This function is only enabled if AcpiGbl_EnableAmlDebugObject is set, or
72 * if ACPI_LV_DEBUG_OBJECT is set in the AcpiDbgLevel. Thus, in the normal
73 * operational case, stores to the debug object are ignored but can be easily
74 * enabled if necessary.
75 *
76 ******************************************************************************/
77
78void
79AcpiExDoDebugObject (
80    ACPI_OPERAND_OBJECT     *SourceDesc,
81    UINT32                  Level,
82    UINT32                  Index)
83{
84    UINT32                  i;
85
86
87    ACPI_FUNCTION_TRACE_PTR (ExDoDebugObject, SourceDesc);
88
89
90    /* Output must be enabled via the DebugObject global or the DbgLevel */
91
92    if (!AcpiGbl_EnableAmlDebugObject &&
93        !(AcpiDbgLevel & ACPI_LV_DEBUG_OBJECT))
94    {
95        return_VOID;
96    }
97
98    /*
99     * Print line header as long as we are not in the middle of an
100     * object display
101     */
102    if (!((Level > 0) && Index == 0))
103    {
104        AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
105    }
106
107    /* Display the index for package output only */
108
109    if (Index > 0)
110    {
111       AcpiOsPrintf ("(%.2u) ", Index-1);
112    }
113
114    if (!SourceDesc)
115    {
116        AcpiOsPrintf ("[Null Object]\n");
117        return_VOID;
118    }
119
120    if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
121    {
122        AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc));
123
124        if (!AcpiUtValidInternalObject (SourceDesc))
125        {
126           AcpiOsPrintf ("%p, Invalid Internal Object!\n", SourceDesc);
127           return_VOID;
128        }
129    }
130    else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
131    {
132        AcpiOsPrintf ("%s: %p\n",
133            AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
134            SourceDesc);
135        return_VOID;
136    }
137    else
138    {
139        return_VOID;
140    }
141
142    /* SourceDesc is of type ACPI_DESC_TYPE_OPERAND */
143
144    switch (SourceDesc->Common.Type)
145    {
146    case ACPI_TYPE_INTEGER:
147
148        /* Output correct integer width */
149
150        if (AcpiGbl_IntegerByteWidth == 4)
151        {
152            AcpiOsPrintf ("0x%8.8X\n",
153                (UINT32) SourceDesc->Integer.Value);
154        }
155        else
156        {
157            AcpiOsPrintf ("0x%8.8X%8.8X\n",
158                ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value));
159        }
160        break;
161
162    case ACPI_TYPE_BUFFER:
163
164        AcpiOsPrintf ("[0x%.2X]\n", (UINT32) SourceDesc->Buffer.Length);
165        AcpiUtDumpBuffer (SourceDesc->Buffer.Pointer,
166            (SourceDesc->Buffer.Length < 256) ?
167                SourceDesc->Buffer.Length : 256, DB_BYTE_DISPLAY, 0);
168        break;
169
170    case ACPI_TYPE_STRING:
171
172        AcpiOsPrintf ("[0x%.2X] \"%s\"\n",
173            SourceDesc->String.Length, SourceDesc->String.Pointer);
174        break;
175
176    case ACPI_TYPE_PACKAGE:
177
178        AcpiOsPrintf ("[Contains 0x%.2X Elements]\n",
179            SourceDesc->Package.Count);
180
181        /* Output the entire contents of the package */
182
183        for (i = 0; i < SourceDesc->Package.Count; i++)
184        {
185            AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
186                Level+4, i+1);
187        }
188        break;
189
190    case ACPI_TYPE_LOCAL_REFERENCE:
191
192        AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (SourceDesc));
193
194        /* Decode the reference */
195
196        switch (SourceDesc->Reference.Class)
197        {
198        case ACPI_REFCLASS_INDEX:
199
200            AcpiOsPrintf ("0x%X\n", SourceDesc->Reference.Value);
201            break;
202
203        case ACPI_REFCLASS_TABLE:
204
205            /* Case for DdbHandle */
206
207            AcpiOsPrintf ("Table Index 0x%X\n", SourceDesc->Reference.Value);
208            return_VOID;
209
210        default:
211
212            break;
213        }
214
215        AcpiOsPrintf ("  ");
216
217        /* Check for valid node first, then valid object */
218
219        if (SourceDesc->Reference.Node)
220        {
221            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Node) !=
222                    ACPI_DESC_TYPE_NAMED)
223            {
224                AcpiOsPrintf (" %p - Not a valid namespace node\n",
225                    SourceDesc->Reference.Node);
226            }
227            else
228            {
229                AcpiOsPrintf ("Node %p [%4.4s] ", SourceDesc->Reference.Node,
230                    (SourceDesc->Reference.Node)->Name.Ascii);
231
232                switch ((SourceDesc->Reference.Node)->Type)
233                {
234                /* These types have no attached object */
235
236                case ACPI_TYPE_DEVICE:
237                    AcpiOsPrintf ("Device\n");
238                    break;
239
240                case ACPI_TYPE_THERMAL:
241                    AcpiOsPrintf ("Thermal Zone\n");
242                    break;
243
244                default:
245
246                    AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
247                        Level+4, 0);
248                    break;
249                }
250            }
251        }
252        else if (SourceDesc->Reference.Object)
253        {
254            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
255                    ACPI_DESC_TYPE_NAMED)
256            {
257                AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *)
258                    SourceDesc->Reference.Object)->Object,
259                    Level+4, 0);
260            }
261            else
262            {
263                AcpiExDoDebugObject (SourceDesc->Reference.Object,
264                    Level+4, 0);
265            }
266        }
267        break;
268
269    default:
270
271        AcpiOsPrintf ("%p\n", SourceDesc);
272        break;
273    }
274
275    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n"));
276    return_VOID;
277}
278#endif
279