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