1204766Sjkim/******************************************************************************
2204766Sjkim *
3204766Sjkim * Module Name: exdebug - Support for stores to the AML Debug Object
4204766Sjkim *
5204766Sjkim *****************************************************************************/
6204766Sjkim
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9204766Sjkim * All rights reserved.
10204766Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25204766Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29204766Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43204766Sjkim
44204766Sjkim#define __EXDEBUG_C__
45204766Sjkim
46204773Sjkim#include <contrib/dev/acpica/include/acpi.h>
47204773Sjkim#include <contrib/dev/acpica/include/accommon.h>
48204773Sjkim#include <contrib/dev/acpica/include/acinterp.h>
49204766Sjkim
50204766Sjkim
51204766Sjkim#define _COMPONENT          ACPI_EXECUTER
52204766Sjkim        ACPI_MODULE_NAME    ("exdebug")
53204766Sjkim
54204766Sjkim
55204766Sjkim#ifndef ACPI_NO_ERROR_MESSAGES
56204766Sjkim/*******************************************************************************
57204766Sjkim *
58204766Sjkim * FUNCTION:    AcpiExDoDebugObject
59204766Sjkim *
60204766Sjkim * PARAMETERS:  SourceDesc          - Object to be output to "Debug Object"
61204766Sjkim *              Level               - Indentation level (used for packages)
62204766Sjkim *              Index               - Current package element, zero if not pkg
63204766Sjkim *
64204766Sjkim * RETURN:      None
65204766Sjkim *
66204766Sjkim * DESCRIPTION: Handles stores to the AML Debug Object. For example:
67204766Sjkim *              Store(INT1, Debug)
68204766Sjkim *
69204766Sjkim * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.
70204766Sjkim *
71204766Sjkim * This function is only enabled if AcpiGbl_EnableAmlDebugObject is set, or
72204766Sjkim * if ACPI_LV_DEBUG_OBJECT is set in the AcpiDbgLevel. Thus, in the normal
73204766Sjkim * operational case, stores to the debug object are ignored but can be easily
74204766Sjkim * enabled if necessary.
75204766Sjkim *
76204766Sjkim ******************************************************************************/
77204766Sjkim
78204766Sjkimvoid
79204766SjkimAcpiExDoDebugObject (
80204766Sjkim    ACPI_OPERAND_OBJECT     *SourceDesc,
81204766Sjkim    UINT32                  Level,
82204766Sjkim    UINT32                  Index)
83204766Sjkim{
84204766Sjkim    UINT32                  i;
85204766Sjkim
86204766Sjkim
87204766Sjkim    ACPI_FUNCTION_TRACE_PTR (ExDoDebugObject, SourceDesc);
88204766Sjkim
89204766Sjkim
90204766Sjkim    /* Output must be enabled via the DebugObject global or the DbgLevel */
91204766Sjkim
92204766Sjkim    if (!AcpiGbl_EnableAmlDebugObject &&
93204766Sjkim        !(AcpiDbgLevel & ACPI_LV_DEBUG_OBJECT))
94204766Sjkim    {
95204766Sjkim        return_VOID;
96204766Sjkim    }
97204766Sjkim
98204766Sjkim    /*
99204766Sjkim     * Print line header as long as we are not in the middle of an
100204766Sjkim     * object display
101204766Sjkim     */
102204766Sjkim    if (!((Level > 0) && Index == 0))
103204766Sjkim    {
104204766Sjkim        AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
105204766Sjkim    }
106204766Sjkim
107204766Sjkim    /* Display the index for package output only */
108204766Sjkim
109204766Sjkim    if (Index > 0)
110204766Sjkim    {
111204766Sjkim       AcpiOsPrintf ("(%.2u) ", Index-1);
112204766Sjkim    }
113204766Sjkim
114204766Sjkim    if (!SourceDesc)
115204766Sjkim    {
116204766Sjkim        AcpiOsPrintf ("[Null Object]\n");
117204766Sjkim        return_VOID;
118204766Sjkim    }
119204766Sjkim
120204766Sjkim    if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
121204766Sjkim    {
122204766Sjkim        AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc));
123204766Sjkim
124204766Sjkim        if (!AcpiUtValidInternalObject (SourceDesc))
125204766Sjkim        {
126204766Sjkim           AcpiOsPrintf ("%p, Invalid Internal Object!\n", SourceDesc);
127204766Sjkim           return_VOID;
128204766Sjkim        }
129204766Sjkim    }
130204766Sjkim    else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
131204766Sjkim    {
132204766Sjkim        AcpiOsPrintf ("%s: %p\n",
133204766Sjkim            AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
134204766Sjkim            SourceDesc);
135204766Sjkim        return_VOID;
136204766Sjkim    }
137204766Sjkim    else
138204766Sjkim    {
139204766Sjkim        return_VOID;
140204766Sjkim    }
141204766Sjkim
142204766Sjkim    /* SourceDesc is of type ACPI_DESC_TYPE_OPERAND */
143204766Sjkim
144204766Sjkim    switch (SourceDesc->Common.Type)
145204766Sjkim    {
146204766Sjkim    case ACPI_TYPE_INTEGER:
147204766Sjkim
148204766Sjkim        /* Output correct integer width */
149204766Sjkim
150204766Sjkim        if (AcpiGbl_IntegerByteWidth == 4)
151204766Sjkim        {
152204766Sjkim            AcpiOsPrintf ("0x%8.8X\n",
153204766Sjkim                (UINT32) SourceDesc->Integer.Value);
154204766Sjkim        }
155204766Sjkim        else
156204766Sjkim        {
157204766Sjkim            AcpiOsPrintf ("0x%8.8X%8.8X\n",
158204766Sjkim                ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value));
159204766Sjkim        }
160204766Sjkim        break;
161204766Sjkim
162204766Sjkim    case ACPI_TYPE_BUFFER:
163204766Sjkim
164204766Sjkim        AcpiOsPrintf ("[0x%.2X]\n", (UINT32) SourceDesc->Buffer.Length);
165241973Sjkim        AcpiUtDumpBuffer (SourceDesc->Buffer.Pointer,
166206117Sjkim            (SourceDesc->Buffer.Length < 256) ?
167241973Sjkim                SourceDesc->Buffer.Length : 256, DB_BYTE_DISPLAY, 0);
168204766Sjkim        break;
169204766Sjkim
170204766Sjkim    case ACPI_TYPE_STRING:
171204766Sjkim
172204766Sjkim        AcpiOsPrintf ("[0x%.2X] \"%s\"\n",
173204766Sjkim            SourceDesc->String.Length, SourceDesc->String.Pointer);
174204766Sjkim        break;
175204766Sjkim
176204766Sjkim    case ACPI_TYPE_PACKAGE:
177204766Sjkim
178204766Sjkim        AcpiOsPrintf ("[Contains 0x%.2X Elements]\n",
179204766Sjkim            SourceDesc->Package.Count);
180204766Sjkim
181204766Sjkim        /* Output the entire contents of the package */
182204766Sjkim
183204766Sjkim        for (i = 0; i < SourceDesc->Package.Count; i++)
184204766Sjkim        {
185204766Sjkim            AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
186204766Sjkim                Level+4, i+1);
187204766Sjkim        }
188204766Sjkim        break;
189204766Sjkim
190204766Sjkim    case ACPI_TYPE_LOCAL_REFERENCE:
191204766Sjkim
192204766Sjkim        AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (SourceDesc));
193204766Sjkim
194204766Sjkim        /* Decode the reference */
195204766Sjkim
196204766Sjkim        switch (SourceDesc->Reference.Class)
197204766Sjkim        {
198204766Sjkim        case ACPI_REFCLASS_INDEX:
199204766Sjkim
200204766Sjkim            AcpiOsPrintf ("0x%X\n", SourceDesc->Reference.Value);
201204766Sjkim            break;
202204766Sjkim
203204766Sjkim        case ACPI_REFCLASS_TABLE:
204204766Sjkim
205204766Sjkim            /* Case for DdbHandle */
206204766Sjkim
207204766Sjkim            AcpiOsPrintf ("Table Index 0x%X\n", SourceDesc->Reference.Value);
208241973Sjkim            return_VOID;
209204766Sjkim
210204766Sjkim        default:
211250838Sjkim
212204766Sjkim            break;
213204766Sjkim        }
214204766Sjkim
215204766Sjkim        AcpiOsPrintf ("  ");
216204766Sjkim
217204766Sjkim        /* Check for valid node first, then valid object */
218204766Sjkim
219204766Sjkim        if (SourceDesc->Reference.Node)
220204766Sjkim        {
221204766Sjkim            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Node) !=
222204766Sjkim                    ACPI_DESC_TYPE_NAMED)
223204766Sjkim            {
224204766Sjkim                AcpiOsPrintf (" %p - Not a valid namespace node\n",
225204766Sjkim                    SourceDesc->Reference.Node);
226204766Sjkim            }
227204766Sjkim            else
228204766Sjkim            {
229204766Sjkim                AcpiOsPrintf ("Node %p [%4.4s] ", SourceDesc->Reference.Node,
230204766Sjkim                    (SourceDesc->Reference.Node)->Name.Ascii);
231204766Sjkim
232204766Sjkim                switch ((SourceDesc->Reference.Node)->Type)
233204766Sjkim                {
234204766Sjkim                /* These types have no attached object */
235204766Sjkim
236204766Sjkim                case ACPI_TYPE_DEVICE:
237204766Sjkim                    AcpiOsPrintf ("Device\n");
238204766Sjkim                    break;
239204766Sjkim
240204766Sjkim                case ACPI_TYPE_THERMAL:
241204766Sjkim                    AcpiOsPrintf ("Thermal Zone\n");
242204766Sjkim                    break;
243204766Sjkim
244204766Sjkim                default:
245250838Sjkim
246204766Sjkim                    AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
247204766Sjkim                        Level+4, 0);
248204766Sjkim                    break;
249204766Sjkim                }
250204766Sjkim            }
251204766Sjkim        }
252204766Sjkim        else if (SourceDesc->Reference.Object)
253204766Sjkim        {
254204766Sjkim            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
255204766Sjkim                    ACPI_DESC_TYPE_NAMED)
256204766Sjkim            {
257204766Sjkim                AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *)
258204766Sjkim                    SourceDesc->Reference.Object)->Object,
259204766Sjkim                    Level+4, 0);
260204766Sjkim            }
261204766Sjkim            else
262204766Sjkim            {
263204766Sjkim                AcpiExDoDebugObject (SourceDesc->Reference.Object,
264204766Sjkim                    Level+4, 0);
265204766Sjkim            }
266204766Sjkim        }
267204766Sjkim        break;
268204766Sjkim
269204766Sjkim    default:
270204766Sjkim
271204766Sjkim        AcpiOsPrintf ("%p\n", SourceDesc);
272204766Sjkim        break;
273204766Sjkim    }
274204766Sjkim
275204766Sjkim    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n"));
276204766Sjkim    return_VOID;
277204766Sjkim}
278204766Sjkim#endif
279