linux/drivers/acpi/acpica/exdebug.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: exdebug - Support for stores to the AML Debug Object
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2012, 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#include <acpi/acpi.h>
  45#include "accommon.h"
  46#include "acinterp.h"
  47
  48#define _COMPONENT          ACPI_EXECUTER
  49ACPI_MODULE_NAME("exdebug")
  50
  51#ifndef ACPI_NO_ERROR_MESSAGES
  52/*******************************************************************************
  53 *
  54 * FUNCTION:    acpi_ex_do_debug_object
  55 *
  56 * PARAMETERS:  source_desc         - Object to be output to "Debug Object"
  57 *              level               - Indentation level (used for packages)
  58 *              index               - Current package element, zero if not pkg
  59 *
  60 * RETURN:      None
  61 *
  62 * DESCRIPTION: Handles stores to the AML Debug Object. For example:
  63 *              Store(INT1, Debug)
  64 *
  65 * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.
  66 *
  67 * This function is only enabled if acpi_gbl_enable_aml_debug_object is set, or
  68 * if ACPI_LV_DEBUG_OBJECT is set in the acpi_dbg_level. Thus, in the normal
  69 * operational case, stores to the debug object are ignored but can be easily
  70 * enabled if necessary.
  71 *
  72 ******************************************************************************/
  73void
  74acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
  75                        u32 level, u32 index)
  76{
  77        u32 i;
  78
  79        ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc);
  80
  81        /* Output must be enabled via the debug_object global or the dbg_level */
  82
  83        if (!acpi_gbl_enable_aml_debug_object &&
  84            !(acpi_dbg_level & ACPI_LV_DEBUG_OBJECT)) {
  85                return_VOID;
  86        }
  87
  88        /*
  89         * Print line header as long as we are not in the middle of an
  90         * object display
  91         */
  92        if (!((level > 0) && index == 0)) {
  93                acpi_os_printf("[ACPI Debug] %*s", level, " ");
  94        }
  95
  96        /* Display the index for package output only */
  97
  98        if (index > 0) {
  99                acpi_os_printf("(%.2u) ", index - 1);
 100        }
 101
 102        if (!source_desc) {
 103                acpi_os_printf("[Null Object]\n");
 104                return_VOID;
 105        }
 106
 107        if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) {
 108                acpi_os_printf("%s ",
 109                               acpi_ut_get_object_type_name(source_desc));
 110
 111                if (!acpi_ut_valid_internal_object(source_desc)) {
 112                        acpi_os_printf("%p, Invalid Internal Object!\n",
 113                                       source_desc);
 114                        return_VOID;
 115                }
 116        } else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) ==
 117                   ACPI_DESC_TYPE_NAMED) {
 118                acpi_os_printf("%s: %p\n",
 119                               acpi_ut_get_type_name(((struct
 120                                                       acpi_namespace_node *)
 121                                                      source_desc)->type),
 122                               source_desc);
 123                return_VOID;
 124        } else {
 125                return_VOID;
 126        }
 127
 128        /* source_desc is of type ACPI_DESC_TYPE_OPERAND */
 129
 130        switch (source_desc->common.type) {
 131        case ACPI_TYPE_INTEGER:
 132
 133                /* Output correct integer width */
 134
 135                if (acpi_gbl_integer_byte_width == 4) {
 136                        acpi_os_printf("0x%8.8X\n",
 137                                       (u32)source_desc->integer.value);
 138                } else {
 139                        acpi_os_printf("0x%8.8X%8.8X\n",
 140                                       ACPI_FORMAT_UINT64(source_desc->integer.
 141                                                          value));
 142                }
 143                break;
 144
 145        case ACPI_TYPE_BUFFER:
 146
 147                acpi_os_printf("[0x%.2X]\n", (u32)source_desc->buffer.length);
 148                acpi_ut_dump_buffer(source_desc->buffer.pointer,
 149                                    (source_desc->buffer.length < 256) ?
 150                                    source_desc->buffer.length : 256,
 151                                    DB_BYTE_DISPLAY, 0);
 152                break;
 153
 154        case ACPI_TYPE_STRING:
 155
 156                acpi_os_printf("[0x%.2X] \"%s\"\n",
 157                               source_desc->string.length,
 158                               source_desc->string.pointer);
 159                break;
 160
 161        case ACPI_TYPE_PACKAGE:
 162
 163                acpi_os_printf("[Contains 0x%.2X Elements]\n",
 164                               source_desc->package.count);
 165
 166                /* Output the entire contents of the package */
 167
 168                for (i = 0; i < source_desc->package.count; i++) {
 169                        acpi_ex_do_debug_object(source_desc->package.
 170                                                elements[i], level + 4, i + 1);
 171                }
 172                break;
 173
 174        case ACPI_TYPE_LOCAL_REFERENCE:
 175
 176                acpi_os_printf("[%s] ",
 177                               acpi_ut_get_reference_name(source_desc));
 178
 179                /* Decode the reference */
 180
 181                switch (source_desc->reference.class) {
 182                case ACPI_REFCLASS_INDEX:
 183
 184                        acpi_os_printf("0x%X\n", source_desc->reference.value);
 185                        break;
 186
 187                case ACPI_REFCLASS_TABLE:
 188
 189                        /* Case for ddb_handle */
 190
 191                        acpi_os_printf("Table Index 0x%X\n",
 192                                       source_desc->reference.value);
 193                        return_VOID;
 194
 195                default:
 196                        break;
 197                }
 198
 199                acpi_os_printf(" ");
 200
 201                /* Check for valid node first, then valid object */
 202
 203                if (source_desc->reference.node) {
 204                        if (ACPI_GET_DESCRIPTOR_TYPE
 205                            (source_desc->reference.node) !=
 206                            ACPI_DESC_TYPE_NAMED) {
 207                                acpi_os_printf
 208                                    (" %p - Not a valid namespace node\n",
 209                                     source_desc->reference.node);
 210                        } else {
 211                                acpi_os_printf("Node %p [%4.4s] ",
 212                                               source_desc->reference.node,
 213                                               (source_desc->reference.node)->
 214                                               name.ascii);
 215
 216                                switch ((source_desc->reference.node)->type) {
 217
 218                                        /* These types have no attached object */
 219
 220                                case ACPI_TYPE_DEVICE:
 221                                        acpi_os_printf("Device\n");
 222                                        break;
 223
 224                                case ACPI_TYPE_THERMAL:
 225                                        acpi_os_printf("Thermal Zone\n");
 226                                        break;
 227
 228                                default:
 229                                        acpi_ex_do_debug_object((source_desc->
 230                                                                 reference.
 231                                                                 node)->object,
 232                                                                level + 4, 0);
 233                                        break;
 234                                }
 235                        }
 236                } else if (source_desc->reference.object) {
 237                        if (ACPI_GET_DESCRIPTOR_TYPE
 238                            (source_desc->reference.object) ==
 239                            ACPI_DESC_TYPE_NAMED) {
 240                                acpi_ex_do_debug_object(((struct
 241                                                          acpi_namespace_node *)
 242                                                         source_desc->reference.
 243                                                         object)->object,
 244                                                        level + 4, 0);
 245                        } else {
 246                                acpi_ex_do_debug_object(source_desc->reference.
 247                                                        object, level + 4, 0);
 248                        }
 249                }
 250                break;
 251
 252        default:
 253
 254                acpi_os_printf("%p\n", source_desc);
 255                break;
 256        }
 257
 258        ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "\n"));
 259        return_VOID;
 260}
 261#endif
 262