brintos

brintos / linux-shallow public Read only

0
0
Text · 7.1 KiB · b054bb5 Raw
308 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: utbuffer - Buffer dump routines5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#include <acpi/acpi.h>11#include "accommon.h"12 13#define _COMPONENT          ACPI_UTILITIES14ACPI_MODULE_NAME("utbuffer")15 16/*******************************************************************************17 *18 * FUNCTION:    acpi_ut_dump_buffer19 *20 * PARAMETERS:  buffer              - Buffer to dump21 *              count               - Amount to dump, in bytes22 *              display             - BYTE, WORD, DWORD, or QWORD display:23 *                                      DB_BYTE_DISPLAY24 *                                      DB_WORD_DISPLAY25 *                                      DB_DWORD_DISPLAY26 *                                      DB_QWORD_DISPLAY27 *              base_offset         - Beginning buffer offset (display only)28 *29 * RETURN:      None30 *31 * DESCRIPTION: Generic dump buffer in both hex and ascii.32 *33 ******************************************************************************/34void 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	u32 display_data_only = display & DB_DISPLAY_DATA_ONLY;41 42	display &= ~DB_DISPLAY_DATA_ONLY;43	if (!buffer) {44		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");45		return;46	}47 48	if ((count < 4) || (count & 0x01)) {49		display = DB_BYTE_DISPLAY;50	}51 52	/* Nasty little dump buffer routine! */53 54	while (i < count) {55 56		/* Print current offset */57 58		if (!display_data_only) {59			acpi_os_printf("%8.4X: ", (base_offset + i));60		}61 62		/* Print 16 hex chars */63 64		for (j = 0; j < 16;) {65			if (i + j >= count) {66 67				/* Dump fill spaces */68 69				acpi_os_printf("%*s", ((display * 2) + 1), " ");70				j += display;71				continue;72			}73 74			switch (display) {75			case DB_BYTE_DISPLAY:76			default:	/* Default is BYTE display */77 78				acpi_os_printf("%02X ",79					       buffer[(acpi_size)i + j]);80				break;81 82			case DB_WORD_DISPLAY:83 84				ACPI_MOVE_16_TO_32(&temp32,85						   &buffer[(acpi_size)i + j]);86				acpi_os_printf("%04X ", temp32);87				break;88 89			case DB_DWORD_DISPLAY:90 91				ACPI_MOVE_32_TO_32(&temp32,92						   &buffer[(acpi_size)i + j]);93				acpi_os_printf("%08X ", temp32);94				break;95 96			case DB_QWORD_DISPLAY:97 98				ACPI_MOVE_32_TO_32(&temp32,99						   &buffer[(acpi_size)i + j]);100				acpi_os_printf("%08X", temp32);101 102				ACPI_MOVE_32_TO_32(&temp32,103						   &buffer[(acpi_size)i + j +104							   4]);105				acpi_os_printf("%08X ", temp32);106				break;107			}108 109			j += display;110		}111 112		/*113		 * Print the ASCII equivalent characters but watch out for the bad114		 * unprintable ones (printable chars are 0x20 through 0x7E)115		 */116		if (!display_data_only) {117			acpi_os_printf(" ");118			for (j = 0; j < 16; j++) {119				if (i + j >= count) {120					acpi_os_printf("\n");121					return;122				}123 124				/*125				 * Add comment characters so rest of line is ignored when126				 * compiled127				 */128				if (j == 0) {129					acpi_os_printf("// ");130				}131 132				buf_char = buffer[(acpi_size)i + j];133				if (isprint(buf_char)) {134					acpi_os_printf("%c", buf_char);135				} else {136					acpi_os_printf(".");137				}138			}139 140			/* Done with that line. */141 142			acpi_os_printf("\n");143		}144		i += 16;145	}146 147	return;148}149 150/*******************************************************************************151 *152 * FUNCTION:    acpi_ut_debug_dump_buffer153 *154 * PARAMETERS:  buffer              - Buffer to dump155 *              count               - Amount to dump, in bytes156 *              display             - BYTE, WORD, DWORD, or QWORD display:157 *                                      DB_BYTE_DISPLAY158 *                                      DB_WORD_DISPLAY159 *                                      DB_DWORD_DISPLAY160 *                                      DB_QWORD_DISPLAY161 *              component_ID        - Caller's component ID162 *163 * RETURN:      None164 *165 * DESCRIPTION: Generic dump buffer in both hex and ascii.166 *167 ******************************************************************************/168 169void170acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)171{172 173	/* Only dump the buffer if tracing is enabled */174 175	if (!((ACPI_LV_TABLES & acpi_dbg_level) &&176	      (component_id & acpi_dbg_layer))) {177		return;178	}179 180	acpi_ut_dump_buffer(buffer, count, display, 0);181}182 183#ifdef ACPI_APPLICATION184/*******************************************************************************185 *186 * FUNCTION:    acpi_ut_dump_buffer_to_file187 *188 * PARAMETERS:  file                - File descriptor189 *              buffer              - Buffer to dump190 *              count               - Amount to dump, in bytes191 *              display             - BYTE, WORD, DWORD, or QWORD display:192 *                                      DB_BYTE_DISPLAY193 *                                      DB_WORD_DISPLAY194 *                                      DB_DWORD_DISPLAY195 *                                      DB_QWORD_DISPLAY196 *              base_offset         - Beginning buffer offset (display only)197 *198 * RETURN:      None199 *200 * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.201 *202 ******************************************************************************/203 204void205acpi_ut_dump_buffer_to_file(ACPI_FILE file,206			    u8 *buffer, u32 count, u32 display, u32 base_offset)207{208	u32 i = 0;209	u32 j;210	u32 temp32;211	u8 buf_char;212 213	if (!buffer) {214		fprintf(file, "Null Buffer Pointer in DumpBuffer!\n");215		return;216	}217 218	if ((count < 4) || (count & 0x01)) {219		display = DB_BYTE_DISPLAY;220	}221 222	/* Nasty little dump buffer routine! */223 224	while (i < count) {225 226		/* Print current offset */227 228		fprintf(file, "%8.4X: ", (base_offset + i));229 230		/* Print 16 hex chars */231 232		for (j = 0; j < 16;) {233			if (i + j >= count) {234 235				/* Dump fill spaces */236 237				fprintf(file, "%*s", ((display * 2) + 1), " ");238				j += display;239				continue;240			}241 242			switch (display) {243			case DB_BYTE_DISPLAY:244			default:	/* Default is BYTE display */245 246				fprintf(file, "%02X ",247					buffer[(acpi_size)i + j]);248				break;249 250			case DB_WORD_DISPLAY:251 252				ACPI_MOVE_16_TO_32(&temp32,253						   &buffer[(acpi_size)i + j]);254				fprintf(file, "%04X ", temp32);255				break;256 257			case DB_DWORD_DISPLAY:258 259				ACPI_MOVE_32_TO_32(&temp32,260						   &buffer[(acpi_size)i + j]);261				fprintf(file, "%08X ", temp32);262				break;263 264			case DB_QWORD_DISPLAY:265 266				ACPI_MOVE_32_TO_32(&temp32,267						   &buffer[(acpi_size)i + j]);268				fprintf(file, "%08X", temp32);269 270				ACPI_MOVE_32_TO_32(&temp32,271						   &buffer[(acpi_size)i + j +272							   4]);273				fprintf(file, "%08X ", temp32);274				break;275			}276 277			j += display;278		}279 280		/*281		 * Print the ASCII equivalent characters but watch out for the bad282		 * unprintable ones (printable chars are 0x20 through 0x7E)283		 */284		fprintf(file, " ");285		for (j = 0; j < 16; j++) {286			if (i + j >= count) {287				fprintf(file, "\n");288				return;289			}290 291			buf_char = buffer[(acpi_size)i + j];292			if (isprint(buf_char)) {293				fprintf(file, "%c", buf_char);294			} else {295				fprintf(file, ".");296			}297		}298 299		/* Done with that line. */300 301		fprintf(file, "\n");302		i += 16;303	}304 305	return;306}307#endif308