1 /****************************************************************************** 2 * 3 * Module Name: exdebug - Support for stores to the AML Debug Object 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, 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 "acpi.h" 47 #include "accommon.h" 48 #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 78 void 79 AcpiExDoDebugObject ( 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