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