1f8146b88SJung-uk Kim /******************************************************************************
2f8146b88SJung-uk Kim  *
3f8146b88SJung-uk Kim  * Module Name: asldebug -- Debug output support
4f8146b88SJung-uk Kim  *
5f8146b88SJung-uk Kim  *****************************************************************************/
6f8146b88SJung-uk Kim 
7f8146b88SJung-uk Kim /*
8f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
9f8146b88SJung-uk Kim  * All rights reserved.
10f8146b88SJung-uk Kim  *
11f8146b88SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12f8146b88SJung-uk Kim  * modification, are permitted provided that the following conditions
13f8146b88SJung-uk Kim  * are met:
14f8146b88SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15f8146b88SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16f8146b88SJung-uk Kim  *    without modification.
17f8146b88SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18f8146b88SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19f8146b88SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20f8146b88SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21f8146b88SJung-uk Kim  *    binary redistribution.
22f8146b88SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23f8146b88SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24f8146b88SJung-uk Kim  *    from this software without specific prior written permission.
25f8146b88SJung-uk Kim  *
26f8146b88SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27f8146b88SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28f8146b88SJung-uk Kim  * Software Foundation.
29f8146b88SJung-uk Kim  *
30f8146b88SJung-uk Kim  * NO WARRANTY
31f8146b88SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32f8146b88SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33f8146b88SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34f8146b88SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35f8146b88SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36f8146b88SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37f8146b88SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38f8146b88SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39f8146b88SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40f8146b88SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41f8146b88SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42f8146b88SJung-uk Kim  */
43f8146b88SJung-uk Kim 
44f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
45f8146b88SJung-uk Kim #include "aslcompiler.y.h"
46f8146b88SJung-uk Kim 
47f8146b88SJung-uk Kim 
48f8146b88SJung-uk Kim #define _COMPONENT          ACPI_COMPILER
49f8146b88SJung-uk Kim         ACPI_MODULE_NAME    ("asldebug")
50f8146b88SJung-uk Kim 
51f8146b88SJung-uk Kim 
52f8146b88SJung-uk Kim /* Local prototypes */
53f8146b88SJung-uk Kim 
54f8146b88SJung-uk Kim static void
55f8146b88SJung-uk Kim UtDumpParseOpName (
56f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
57f8146b88SJung-uk Kim     UINT32                  Level,
58f8146b88SJung-uk Kim     UINT32                  DataLength);
59f8146b88SJung-uk Kim 
60f8146b88SJung-uk Kim 
61f8146b88SJung-uk Kim /*******************************************************************************
62f8146b88SJung-uk Kim  *
63f8146b88SJung-uk Kim  * FUNCTION:    UtDumpIntegerOp
64f8146b88SJung-uk Kim  *
65f8146b88SJung-uk Kim  * PARAMETERS:  Op                  - Current parse op
66f8146b88SJung-uk Kim  *              Level               - Current output indentation level
67f8146b88SJung-uk Kim  *              IntegerLength       - Output length of the integer (2/4/8/16)
68f8146b88SJung-uk Kim  *
69f8146b88SJung-uk Kim  * RETURN:      None
70f8146b88SJung-uk Kim  *
71f8146b88SJung-uk Kim  * DESCRIPTION: Emit formatted debug output for "integer" ops.
72f8146b88SJung-uk Kim  *              Note: IntegerLength must be one of 2,4,8,16.
73f8146b88SJung-uk Kim  *
74f8146b88SJung-uk Kim  ******************************************************************************/
75f8146b88SJung-uk Kim 
76f8146b88SJung-uk Kim void
77f8146b88SJung-uk Kim UtDumpIntegerOp (
78f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
79f8146b88SJung-uk Kim     UINT32                  Level,
80f8146b88SJung-uk Kim     UINT32                  IntegerLength)
81f8146b88SJung-uk Kim {
82f8146b88SJung-uk Kim 
83f8146b88SJung-uk Kim     /* Emit the ParseOp name, leaving room for the integer */
84f8146b88SJung-uk Kim 
85f8146b88SJung-uk Kim     UtDumpParseOpName (Op, Level, IntegerLength);
86f8146b88SJung-uk Kim 
87f8146b88SJung-uk Kim     /* Emit the integer based upon length */
88f8146b88SJung-uk Kim 
89f8146b88SJung-uk Kim     switch (IntegerLength)
90f8146b88SJung-uk Kim     {
91f8146b88SJung-uk Kim     case 2: /* Byte */
92f8146b88SJung-uk Kim     case 4: /* Word */
93f8146b88SJung-uk Kim     case 8: /* Dword */
94f8146b88SJung-uk Kim 
95f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT,
96f8146b88SJung-uk Kim             "%*.*X", IntegerLength, IntegerLength, Op->Asl.Value.Integer);
97f8146b88SJung-uk Kim         break;
98f8146b88SJung-uk Kim 
99f8146b88SJung-uk Kim     case 16: /* Qword and Integer */
100f8146b88SJung-uk Kim 
101f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT,
102f8146b88SJung-uk Kim             "%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
103f8146b88SJung-uk Kim         break;
104f8146b88SJung-uk Kim 
105f8146b88SJung-uk Kim     default:
106f8146b88SJung-uk Kim         break;
107f8146b88SJung-uk Kim     }
108f8146b88SJung-uk Kim }
109f8146b88SJung-uk Kim 
110f8146b88SJung-uk Kim 
111f8146b88SJung-uk Kim /*******************************************************************************
112f8146b88SJung-uk Kim  *
113f8146b88SJung-uk Kim  * FUNCTION:    UtDumpStringOp
114f8146b88SJung-uk Kim  *
115f8146b88SJung-uk Kim  * PARAMETERS:  Op                  - Current parse op
116f8146b88SJung-uk Kim  *              Level               - Current output indentation level
117f8146b88SJung-uk Kim  *
118f8146b88SJung-uk Kim  * RETURN:      None
119f8146b88SJung-uk Kim  *
120f8146b88SJung-uk Kim  * DESCRIPTION: Emit formatted debug output for String/Pathname ops.
121f8146b88SJung-uk Kim  *
122f8146b88SJung-uk Kim  ******************************************************************************/
123f8146b88SJung-uk Kim 
124f8146b88SJung-uk Kim void
125f8146b88SJung-uk Kim UtDumpStringOp (
126f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
127f8146b88SJung-uk Kim     UINT32                  Level)
128f8146b88SJung-uk Kim {
129f8146b88SJung-uk Kim     char                    *String;
130f8146b88SJung-uk Kim 
131f8146b88SJung-uk Kim 
132f8146b88SJung-uk Kim     String = Op->Asl.Value.String;
133f8146b88SJung-uk Kim 
134f8146b88SJung-uk Kim     if (Op->Asl.ParseOpcode != PARSEOP_STRING_LITERAL)
135f8146b88SJung-uk Kim     {
136f8146b88SJung-uk Kim         /*
137f8146b88SJung-uk Kim          * For the "path" ops NAMEPATH, NAMESEG, METHODCALL -- if the
138f8146b88SJung-uk Kim          * ExternalName is valid, it takes precedence. In these cases the
139f8146b88SJung-uk Kim          * Value.String is the raw "internal" name from the AML code, which
140f8146b88SJung-uk Kim          * we don't want to use, because it contains non-ascii characters.
141f8146b88SJung-uk Kim          */
142f8146b88SJung-uk Kim         if (Op->Asl.ExternalName)
143f8146b88SJung-uk Kim         {
144f8146b88SJung-uk Kim             String = Op->Asl.ExternalName;
145f8146b88SJung-uk Kim         }
146f8146b88SJung-uk Kim     }
147f8146b88SJung-uk Kim 
148f8146b88SJung-uk Kim     if (!String)
149f8146b88SJung-uk Kim     {
150f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT,
151f8146b88SJung-uk Kim             " ERROR: Could not find a valid String/Path pointer\n");
152f8146b88SJung-uk Kim         return;
153f8146b88SJung-uk Kim     }
154f8146b88SJung-uk Kim 
155f8146b88SJung-uk Kim     /* Emit the ParseOp name, leaving room for the string */
156f8146b88SJung-uk Kim 
157f8146b88SJung-uk Kim     UtDumpParseOpName (Op, Level, strlen (String));
158f8146b88SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT, "%s", String);
159f8146b88SJung-uk Kim }
160f8146b88SJung-uk Kim 
161f8146b88SJung-uk Kim 
162f8146b88SJung-uk Kim /*******************************************************************************
163f8146b88SJung-uk Kim  *
164f8146b88SJung-uk Kim  * FUNCTION:    UtDumpBasicOp
165f8146b88SJung-uk Kim  *
166f8146b88SJung-uk Kim  * PARAMETERS:  Op                  - Current parse op
167f8146b88SJung-uk Kim  *              Level               - Current output indentation level
168f8146b88SJung-uk Kim  *
169f8146b88SJung-uk Kim  * RETURN:      None
170f8146b88SJung-uk Kim  *
171f8146b88SJung-uk Kim  * DESCRIPTION: Generic formatted debug output for "basic" ops that have no
172f8146b88SJung-uk Kim  *              associated strings or integer values.
173f8146b88SJung-uk Kim  *
174f8146b88SJung-uk Kim  ******************************************************************************/
175f8146b88SJung-uk Kim 
176f8146b88SJung-uk Kim void
177f8146b88SJung-uk Kim UtDumpBasicOp (
178f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
179f8146b88SJung-uk Kim     UINT32                  Level)
180f8146b88SJung-uk Kim {
181f8146b88SJung-uk Kim 
182f8146b88SJung-uk Kim     /* Just print out the ParseOp name, there is no extra data */
183f8146b88SJung-uk Kim 
184f8146b88SJung-uk Kim     UtDumpParseOpName (Op, Level, 0);
185f8146b88SJung-uk Kim }
186f8146b88SJung-uk Kim 
187f8146b88SJung-uk Kim 
188f8146b88SJung-uk Kim /*******************************************************************************
189f8146b88SJung-uk Kim  *
190f8146b88SJung-uk Kim  * FUNCTION:    UtDumpParseOpName
191f8146b88SJung-uk Kim  *
192f8146b88SJung-uk Kim  * PARAMETERS:  Op                  - Current parse op
193f8146b88SJung-uk Kim  *              Level               - Current output indentation level
194f8146b88SJung-uk Kim  *              DataLength          - Length of data to appear after the name
195f8146b88SJung-uk Kim  *
196f8146b88SJung-uk Kim  * RETURN:      None
197f8146b88SJung-uk Kim  *
198f8146b88SJung-uk Kim  * DESCRIPTION: Indent and emit the ascii ParseOp name for the op
199f8146b88SJung-uk Kim  *
200f8146b88SJung-uk Kim  ******************************************************************************/
201f8146b88SJung-uk Kim 
202f8146b88SJung-uk Kim static void
203f8146b88SJung-uk Kim UtDumpParseOpName (
204f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
205f8146b88SJung-uk Kim     UINT32                  Level,
206f8146b88SJung-uk Kim     UINT32                  DataLength)
207f8146b88SJung-uk Kim {
208f8146b88SJung-uk Kim     char                    *ParseOpName;
209f8146b88SJung-uk Kim     UINT32                  IndentLength;
210f8146b88SJung-uk Kim     UINT32                  NameLength;
211f8146b88SJung-uk Kim     UINT32                  LineLength;
212f8146b88SJung-uk Kim     UINT32                  PaddingLength;
213f8146b88SJung-uk Kim 
214f8146b88SJung-uk Kim 
215f8146b88SJung-uk Kim     /* Emit the LineNumber/IndentLevel prefix on each output line */
216f8146b88SJung-uk Kim 
217f8146b88SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
218f8146b88SJung-uk Kim         "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
219f8146b88SJung-uk Kim 
220f8146b88SJung-uk Kim     ParseOpName = UtGetOpName (Op->Asl.ParseOpcode);
221f8146b88SJung-uk Kim 
222f8146b88SJung-uk Kim     /* Calculate various lengths for output alignment */
223f8146b88SJung-uk Kim 
224f8146b88SJung-uk Kim     IndentLength = Level * DEBUG_SPACES_PER_INDENT;
225f8146b88SJung-uk Kim     NameLength = strlen (ParseOpName);
226f8146b88SJung-uk Kim     LineLength = IndentLength + 1 + NameLength + 1 + DataLength;
227f8146b88SJung-uk Kim     PaddingLength = (DEBUG_MAX_LINE_LENGTH + 1) - LineLength;
228f8146b88SJung-uk Kim 
229f8146b88SJung-uk Kim     /* Parse tree indentation is based upon the nesting/indent level */
230f8146b88SJung-uk Kim 
231f8146b88SJung-uk Kim     if (Level)
232f8146b88SJung-uk Kim     {
233f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT, "%*s", IndentLength, " ");
234f8146b88SJung-uk Kim     }
235f8146b88SJung-uk Kim 
236f8146b88SJung-uk Kim     /* Emit the actual name here */
237f8146b88SJung-uk Kim 
238f8146b88SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT, " %s", ParseOpName);
239f8146b88SJung-uk Kim 
240f8146b88SJung-uk Kim     /* Emit extra padding blanks for alignment of later data items */
241f8146b88SJung-uk Kim 
242f8146b88SJung-uk Kim     if (LineLength > DEBUG_MAX_LINE_LENGTH)
243f8146b88SJung-uk Kim     {
244f8146b88SJung-uk Kim         /* Split a long line immediately after the ParseOpName string */
245f8146b88SJung-uk Kim 
246f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT, "\n%*s",
247f8146b88SJung-uk Kim             (DEBUG_FULL_LINE_LENGTH - DataLength), " ");
248f8146b88SJung-uk Kim     }
249f8146b88SJung-uk Kim     else
250f8146b88SJung-uk Kim     {
251f8146b88SJung-uk Kim         DbgPrint (ASL_TREE_OUTPUT, "%*s", PaddingLength, " ");
252f8146b88SJung-uk Kim     }
253f8146b88SJung-uk Kim }
254