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 302