Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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
 14ACPI_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 ******************************************************************************/
 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
 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
163void
164acpi_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
198void
199acpi_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