linux/drivers/acpi/acpica/utbuffer.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: utbuffer - Buffer dump routines
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2013, 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
  47#define _COMPONENT          ACPI_UTILITIES
  48ACPI_MODULE_NAME("utbuffer")
  49
  50/*******************************************************************************
  51 *
  52 * FUNCTION:    acpi_ut_dump_buffer
  53 *
  54 * PARAMETERS:  buffer              - Buffer to dump
  55 *              count               - Amount to dump, in bytes
  56 *              display             - BYTE, WORD, DWORD, or QWORD display:
  57 *                                      DB_BYTE_DISPLAY
  58 *                                      DB_WORD_DISPLAY
  59 *                                      DB_DWORD_DISPLAY
  60 *                                      DB_QWORD_DISPLAY
  61 *              base_offset         - Beginning buffer offset (display only)
  62 *
  63 * RETURN:      None
  64 *
  65 * DESCRIPTION: Generic dump buffer in both hex and ascii.
  66 *
  67 ******************************************************************************/
  68void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
  69{
  70        u32 i = 0;
  71        u32 j;
  72        u32 temp32;
  73        u8 buf_char;
  74
  75        if (!buffer) {
  76                acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
  77                return;
  78        }
  79
  80        if ((count < 4) || (count & 0x01)) {
  81                display = DB_BYTE_DISPLAY;
  82        }
  83
  84        /* Nasty little dump buffer routine! */
  85
  86        while (i < count) {
  87
  88                /* Print current offset */
  89
  90                acpi_os_printf("%6.4X: ", (base_offset + i));
  91
  92                /* Print 16 hex chars */
  93
  94                for (j = 0; j < 16;) {
  95                        if (i + j >= count) {
  96
  97                                /* Dump fill spaces */
  98
  99                                acpi_os_printf("%*s", ((display * 2) + 1), " ");
 100                                j += display;
 101                                continue;
 102                        }
 103
 104                        switch (display) {
 105                        case DB_BYTE_DISPLAY:
 106                        default:        /* Default is BYTE display */
 107
 108                                acpi_os_printf("%02X ",
 109                                               buffer[(acpi_size) i + j]);
 110                                break;
 111
 112                        case DB_WORD_DISPLAY:
 113
 114                                ACPI_MOVE_16_TO_32(&temp32,
 115                                                   &buffer[(acpi_size) i + j]);
 116                                acpi_os_printf("%04X ", temp32);
 117                                break;
 118
 119                        case DB_DWORD_DISPLAY:
 120
 121                                ACPI_MOVE_32_TO_32(&temp32,
 122                                                   &buffer[(acpi_size) i + j]);
 123                                acpi_os_printf("%08X ", temp32);
 124                                break;
 125
 126                        case DB_QWORD_DISPLAY:
 127
 128                                ACPI_MOVE_32_TO_32(&temp32,
 129                                                   &buffer[(acpi_size) i + j]);
 130                                acpi_os_printf("%08X", temp32);
 131
 132                                ACPI_MOVE_32_TO_32(&temp32,
 133                                                   &buffer[(acpi_size) i + j +
 134                                                           4]);
 135                                acpi_os_printf("%08X ", temp32);
 136                                break;
 137                        }
 138
 139                        j += display;
 140                }
 141
 142                /*
 143                 * Print the ASCII equivalent characters but watch out for the bad
 144                 * unprintable ones (printable chars are 0x20 through 0x7E)
 145                 */
 146                acpi_os_printf(" ");
 147                for (j = 0; j < 16; j++) {
 148                        if (i + j >= count) {
 149                                acpi_os_printf("\n");
 150                                return;
 151                        }
 152
 153                        buf_char = buffer[(acpi_size) i + j];
 154                        if (isprint(buf_char)) {
 155                                acpi_os_printf("%c", buf_char);
 156                        } else {
 157                                acpi_os_printf(".");
 158                        }
 159                }
 160
 161                /* Done with that line. */
 162
 163                acpi_os_printf("\n");
 164                i += 16;
 165        }
 166
 167        return;
 168}
 169
 170/*******************************************************************************
 171 *
 172 * FUNCTION:    acpi_ut_debug_dump_buffer
 173 *
 174 * PARAMETERS:  buffer              - Buffer to dump
 175 *              count               - Amount to dump, in bytes
 176 *              display             - BYTE, WORD, DWORD, or QWORD display:
 177 *                                      DB_BYTE_DISPLAY
 178 *                                      DB_WORD_DISPLAY
 179 *                                      DB_DWORD_DISPLAY
 180 *                                      DB_QWORD_DISPLAY
 181 *              component_ID        - Caller's component ID
 182 *
 183 * RETURN:      None
 184 *
 185 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 186 *
 187 ******************************************************************************/
 188
 189void
 190acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
 191{
 192
 193        /* Only dump the buffer if tracing is enabled */
 194
 195        if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
 196              (component_id & acpi_dbg_layer))) {
 197                return;
 198        }
 199
 200        acpi_ut_dump_buffer(buffer, count, display, 0);
 201}
 202
 203#ifdef ACPI_APPLICATION
 204/*******************************************************************************
 205 *
 206 * FUNCTION:    acpi_ut_dump_buffer_to_file
 207 *
 208 * PARAMETERS:  file                - File descriptor
 209 *              buffer              - Buffer to dump
 210 *              count               - Amount to dump, in bytes
 211 *              display             - BYTE, WORD, DWORD, or QWORD display:
 212 *                                      DB_BYTE_DISPLAY
 213 *                                      DB_WORD_DISPLAY
 214 *                                      DB_DWORD_DISPLAY
 215 *                                      DB_QWORD_DISPLAY
 216 *              base_offset         - Beginning buffer offset (display only)
 217 *
 218 * RETURN:      None
 219 *
 220 * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.
 221 *
 222 ******************************************************************************/
 223
 224void
 225acpi_ut_dump_buffer_to_file(ACPI_FILE file,
 226                            u8 *buffer, u32 count, u32 display, u32 base_offset)
 227{
 228        u32 i = 0;
 229        u32 j;
 230        u32 temp32;
 231        u8 buf_char;
 232
 233        if (!buffer) {
 234                fprintf(file, "Null Buffer Pointer in DumpBuffer!\n");
 235                return;
 236        }
 237
 238        if ((count < 4) || (count & 0x01)) {
 239                display = DB_BYTE_DISPLAY;
 240        }
 241
 242        /* Nasty little dump buffer routine! */
 243
 244        while (i < count) {
 245
 246                /* Print current offset */
 247
 248                fprintf(file, "%6.4X: ", (base_offset + i));
 249
 250                /* Print 16 hex chars */
 251
 252                for (j = 0; j < 16;) {
 253                        if (i + j >= count) {
 254
 255                                /* Dump fill spaces */
 256
 257                                fprintf(file, "%*s", ((display * 2) + 1), " ");
 258                                j += display;
 259                                continue;
 260                        }
 261
 262                        switch (display) {
 263                        case DB_BYTE_DISPLAY:
 264                        default:        /* Default is BYTE display */
 265
 266                                fprintf(file, "%02X ",
 267                                        buffer[(acpi_size) i + j]);
 268                                break;
 269
 270                        case DB_WORD_DISPLAY:
 271
 272                                ACPI_MOVE_16_TO_32(&temp32,
 273                                                   &buffer[(acpi_size) i + j]);
 274                                fprintf(file, "%04X ", temp32);
 275                                break;
 276
 277                        case DB_DWORD_DISPLAY:
 278
 279                                ACPI_MOVE_32_TO_32(&temp32,
 280                                                   &buffer[(acpi_size) i + j]);
 281                                fprintf(file, "%08X ", temp32);
 282                                break;
 283
 284                        case DB_QWORD_DISPLAY:
 285
 286                                ACPI_MOVE_32_TO_32(&temp32,
 287                                                   &buffer[(acpi_size) i + j]);
 288                                fprintf(file, "%08X", temp32);
 289
 290                                ACPI_MOVE_32_TO_32(&temp32,
 291                                                   &buffer[(acpi_size) i + j +
 292                                                           4]);
 293                                fprintf(file, "%08X ", temp32);
 294                                break;
 295                        }
 296
 297                        j += display;
 298                }
 299
 300                /*
 301                 * Print the ASCII equivalent characters but watch out for the bad
 302                 * unprintable ones (printable chars are 0x20 through 0x7E)
 303                 */
 304                fprintf(file, " ");
 305                for (j = 0; j < 16; j++) {
 306                        if (i + j >= count) {
 307                                fprintf(file, "\n");
 308                                return;
 309                        }
 310
 311                        buf_char = buffer[(acpi_size) i + j];
 312                        if (isprint(buf_char)) {
 313                                fprintf(file, "%c", buf_char);
 314                        } else {
 315                                fprintf(file, ".");
 316                        }
 317                }
 318
 319                /* Done with that line. */
 320
 321                fprintf(file, "\n");
 322                i += 16;
 323        }
 324
 325        return;
 326}
 327#endif
 328