root/drivers/acpi/acpica/utbuffer.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ACPI_MODULE_NAME
  2. acpi_ut_debug_dump_buffer
  3. acpi_ut_dump_buffer_to_file

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

/* [<][>][^][v][top][bottom][index][help] */