utdebug.c 19.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/******************************************************************************
 *
 * Module Name: utdebug - Debug print routines
 *
 *****************************************************************************/

/*
8
 * Copyright (C) 2000 - 2012, Intel Corp.
L
Linus Torvalds 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

44
#include <linux/export.h>
L
Linus Torvalds 已提交
45
#include <acpi/acpi.h>
L
Len Brown 已提交
46
#include "accommon.h"
L
Linus Torvalds 已提交
47 48

#define _COMPONENT          ACPI_UTILITIES
L
Len Brown 已提交
49
ACPI_MODULE_NAME("utdebug")
50

L
Linus Torvalds 已提交
51
#ifdef ACPI_DEBUG_OUTPUT
52
static acpi_thread_id acpi_gbl_prev_thread_id = (acpi_thread_id) 0xFFFFFFFF;
L
Len Brown 已提交
53 54
static char *acpi_gbl_fn_entry_str = "----Entry";
static char *acpi_gbl_fn_exit_str = "----Exit-";
L
Linus Torvalds 已提交
55

56 57
/* Local prototypes */

L
Len Brown 已提交
58
static const char *acpi_ut_trim_function_name(const char *function_name);
L
Linus Torvalds 已提交
59

R
Robert Moore 已提交
60
/*******************************************************************************
L
Linus Torvalds 已提交
61 62 63 64 65 66 67
 *
 * FUNCTION:    acpi_ut_init_stack_ptr_trace
 *
 * PARAMETERS:  None
 *
 * RETURN:      None
 *
R
Robert Moore 已提交
68
 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
L
Linus Torvalds 已提交
69
 *
R
Robert Moore 已提交
70
 ******************************************************************************/
L
Linus Torvalds 已提交
71

L
Len Brown 已提交
72
void acpi_ut_init_stack_ptr_trace(void)
L
Linus Torvalds 已提交
73
{
74
	acpi_size current_sp;
L
Linus Torvalds 已提交
75

76
	acpi_gbl_entry_stack_pointer = &current_sp;
L
Linus Torvalds 已提交
77 78
}

R
Robert Moore 已提交
79
/*******************************************************************************
L
Linus Torvalds 已提交
80 81 82 83 84 85 86
 *
 * FUNCTION:    acpi_ut_track_stack_ptr
 *
 * PARAMETERS:  None
 *
 * RETURN:      None
 *
R
Robert Moore 已提交
87
 * DESCRIPTION: Save the current CPU stack pointer
L
Linus Torvalds 已提交
88
 *
R
Robert Moore 已提交
89
 ******************************************************************************/
L
Linus Torvalds 已提交
90

L
Len Brown 已提交
91
void acpi_ut_track_stack_ptr(void)
L
Linus Torvalds 已提交
92
{
L
Len Brown 已提交
93
	acpi_size current_sp;
L
Linus Torvalds 已提交
94

95 96
	if (&current_sp < acpi_gbl_lowest_stack_pointer) {
		acpi_gbl_lowest_stack_pointer = &current_sp;
L
Linus Torvalds 已提交
97 98 99 100 101 102 103
	}

	if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {
		acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;
	}
}

104 105 106 107 108 109 110 111 112
/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_trim_function_name
 *
 * PARAMETERS:  function_name       - Ascii string containing a procedure name
 *
 * RETURN:      Updated pointer to the function name
 *
 * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
113
 *              This allows compiler macros such as __FUNCTION__ to be used
114 115 116 117
 *              with no change to the debug output.
 *
 ******************************************************************************/

L
Len Brown 已提交
118
static const char *acpi_ut_trim_function_name(const char *function_name)
119 120 121 122
{

	/* All Function names are longer than 4 chars, check is safe */

B
Bob Moore 已提交
123
	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
B
Bob Moore 已提交
124

125 126 127 128 129
		/* This is the case where the original source has not been modified */

		return (function_name + 4);
	}

B
Bob Moore 已提交
130
	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
B
Bob Moore 已提交
131

132 133 134 135 136 137 138 139
		/* This is the case where the source has been 'linuxized' */

		return (function_name + 5);
	}

	return (function_name);
}

R
Robert Moore 已提交
140
/*******************************************************************************
L
Linus Torvalds 已提交
141
 *
142
 * FUNCTION:    acpi_debug_print
L
Linus Torvalds 已提交
143
 *
R
Robert Moore 已提交
144
 * PARAMETERS:  requested_debug_level - Requested debug print level
L
Linus Torvalds 已提交
145
 *              line_number         - Caller's line number (for error output)
146 147 148
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
149
 *              format              - Printf format field
L
Linus Torvalds 已提交
150 151 152 153 154 155 156
 *              ...                 - Optional printf arguments
 *
 * RETURN:      None
 *
 * DESCRIPTION: Print error message with prefix consisting of the module name,
 *              line number, and component ID.
 *
R
Robert Moore 已提交
157
 ******************************************************************************/
L
Linus Torvalds 已提交
158

L
Len Brown 已提交
159
void ACPI_INTERNAL_VAR_XFACE
160 161 162 163 164
acpi_debug_print(u32 requested_debug_level,
		 u32 line_number,
		 const char *function_name,
		 const char *module_name,
		 u32 component_id, const char *format, ...)
L
Linus Torvalds 已提交
165
{
B
Bob Moore 已提交
166
	acpi_thread_id thread_id;
L
Len Brown 已提交
167
	va_list args;
L
Linus Torvalds 已提交
168 169 170 171 172

	/*
	 * Stay silent if the debug level or component ID is disabled
	 */
	if (!(requested_debug_level & acpi_dbg_level) ||
L
Len Brown 已提交
173
	    !(component_id & acpi_dbg_layer)) {
L
Linus Torvalds 已提交
174 175 176 177 178 179
		return;
	}

	/*
	 * Thread tracking and context switch notification
	 */
L
Len Brown 已提交
180
	thread_id = acpi_os_get_thread_id();
L
Linus Torvalds 已提交
181 182
	if (thread_id != acpi_gbl_prev_thread_id) {
		if (ACPI_LV_THREADS & acpi_dbg_level) {
L
Len Brown 已提交
183
			acpi_os_printf
184 185
			    ("\n**** Context Switch from TID %u to TID %u ****\n\n",
			     (u32)acpi_gbl_prev_thread_id, (u32)thread_id);
L
Linus Torvalds 已提交
186 187 188 189 190 191 192 193 194
		}

		acpi_gbl_prev_thread_id = thread_id;
	}

	/*
	 * Display the module name, current line number, thread ID (if requested),
	 * current procedure nesting level, and the current procedure name
	 */
L
Len Brown 已提交
195
	acpi_os_printf("%8s-%04ld ", module_name, line_number);
L
Linus Torvalds 已提交
196 197

	if (ACPI_LV_THREADS & acpi_dbg_level) {
198
		acpi_os_printf("[%u] ", (u32)thread_id);
L
Linus Torvalds 已提交
199 200
	}

L
Len Brown 已提交
201 202 203
	acpi_os_printf("[%02ld] %-22.22s: ",
		       acpi_gbl_nesting_level,
		       acpi_ut_trim_function_name(function_name));
L
Linus Torvalds 已提交
204

L
Len Brown 已提交
205 206
	va_start(args, format);
	acpi_os_vprintf(format, args);
207
	va_end(args);
L
Linus Torvalds 已提交
208 209
}

210
ACPI_EXPORT_SYMBOL(acpi_debug_print)
L
Linus Torvalds 已提交
211

R
Robert Moore 已提交
212
/*******************************************************************************
L
Linus Torvalds 已提交
213
 *
214
 * FUNCTION:    acpi_debug_print_raw
L
Linus Torvalds 已提交
215 216 217
 *
 * PARAMETERS:  requested_debug_level - Requested debug print level
 *              line_number         - Caller's line number
218 219 220
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
221
 *              format              - Printf format field
L
Linus Torvalds 已提交
222 223 224 225
 *              ...                 - Optional printf arguments
 *
 * RETURN:      None
 *
226
 * DESCRIPTION: Print message with no headers. Has same interface as
L
Linus Torvalds 已提交
227 228
 *              debug_print so that the same macros can be used.
 *
R
Robert Moore 已提交
229
 ******************************************************************************/
L
Len Brown 已提交
230
void ACPI_INTERNAL_VAR_XFACE
231 232 233 234 235
acpi_debug_print_raw(u32 requested_debug_level,
		     u32 line_number,
		     const char *function_name,
		     const char *module_name,
		     u32 component_id, const char *format, ...)
L
Linus Torvalds 已提交
236
{
L
Len Brown 已提交
237
	va_list args;
L
Linus Torvalds 已提交
238 239

	if (!(requested_debug_level & acpi_dbg_level) ||
L
Len Brown 已提交
240
	    !(component_id & acpi_dbg_layer)) {
L
Linus Torvalds 已提交
241 242 243
		return;
	}

L
Len Brown 已提交
244 245
	va_start(args, format);
	acpi_os_vprintf(format, args);
246
	va_end(args);
L
Linus Torvalds 已提交
247 248
}

249
ACPI_EXPORT_SYMBOL(acpi_debug_print_raw)
L
Linus Torvalds 已提交
250

R
Robert Moore 已提交
251
/*******************************************************************************
L
Linus Torvalds 已提交
252 253 254 255
 *
 * FUNCTION:    acpi_ut_trace
 *
 * PARAMETERS:  line_number         - Caller's line number
256 257 258
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
259 260 261
 *
 * RETURN:      None
 *
262
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
263 264
 *              set in debug_level
 *
R
Robert Moore 已提交
265
 ******************************************************************************/
L
Linus Torvalds 已提交
266
void
L
Len Brown 已提交
267
acpi_ut_trace(u32 line_number,
268 269
	      const char *function_name,
	      const char *module_name, u32 component_id)
L
Linus Torvalds 已提交
270 271 272
{

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
273
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
274

275 276 277
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s\n", acpi_gbl_fn_entry_str);
L
Linus Torvalds 已提交
278 279
}

B
Bob Moore 已提交
280
ACPI_EXPORT_SYMBOL(acpi_ut_trace)
L
Linus Torvalds 已提交
281

R
Robert Moore 已提交
282
/*******************************************************************************
L
Linus Torvalds 已提交
283 284 285 286
 *
 * FUNCTION:    acpi_ut_trace_ptr
 *
 * PARAMETERS:  line_number         - Caller's line number
287 288 289
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
290
 *              pointer             - Pointer to display
L
Linus Torvalds 已提交
291 292 293
 *
 * RETURN:      None
 *
294
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
295 296
 *              set in debug_level
 *
R
Robert Moore 已提交
297
 ******************************************************************************/
L
Linus Torvalds 已提交
298
void
L
Len Brown 已提交
299 300
acpi_ut_trace_ptr(u32 line_number,
		  const char *function_name,
301
		  const char *module_name, u32 component_id, void *pointer)
L
Linus Torvalds 已提交
302
{
303

L
Linus Torvalds 已提交
304
	acpi_gbl_nesting_level++;
L
Len Brown 已提交
305
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
306

307 308 309
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s %p\n", acpi_gbl_fn_entry_str, pointer);
L
Linus Torvalds 已提交
310 311
}

R
Robert Moore 已提交
312
/*******************************************************************************
L
Linus Torvalds 已提交
313 314 315 316
 *
 * FUNCTION:    acpi_ut_trace_str
 *
 * PARAMETERS:  line_number         - Caller's line number
317 318 319
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
320
 *              string              - Additional string to display
L
Linus Torvalds 已提交
321 322 323
 *
 * RETURN:      None
 *
324
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
325 326
 *              set in debug_level
 *
R
Robert Moore 已提交
327
 ******************************************************************************/
L
Linus Torvalds 已提交
328 329

void
L
Len Brown 已提交
330 331
acpi_ut_trace_str(u32 line_number,
		  const char *function_name,
332
		  const char *module_name, u32 component_id, char *string)
L
Linus Torvalds 已提交
333 334 335
{

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
336
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
337

338 339 340
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s %s\n", acpi_gbl_fn_entry_str, string);
L
Linus Torvalds 已提交
341 342
}

R
Robert Moore 已提交
343
/*******************************************************************************
L
Linus Torvalds 已提交
344 345 346 347
 *
 * FUNCTION:    acpi_ut_trace_u32
 *
 * PARAMETERS:  line_number         - Caller's line number
348 349 350
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
351
 *              integer             - Integer to display
L
Linus Torvalds 已提交
352 353 354
 *
 * RETURN:      None
 *
355
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
356 357
 *              set in debug_level
 *
R
Robert Moore 已提交
358
 ******************************************************************************/
L
Linus Torvalds 已提交
359 360

void
L
Len Brown 已提交
361 362
acpi_ut_trace_u32(u32 line_number,
		  const char *function_name,
363
		  const char *module_name, u32 component_id, u32 integer)
L
Linus Torvalds 已提交
364 365 366
{

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
367
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
368

369 370 371
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s %08X\n", acpi_gbl_fn_entry_str, integer);
L
Linus Torvalds 已提交
372 373
}

R
Robert Moore 已提交
374
/*******************************************************************************
L
Linus Torvalds 已提交
375 376 377 378
 *
 * FUNCTION:    acpi_ut_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
379 380 381
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
382 383 384
 *
 * RETURN:      None
 *
385
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
386 387
 *              set in debug_level
 *
R
Robert Moore 已提交
388
 ******************************************************************************/
L
Linus Torvalds 已提交
389 390

void
L
Len Brown 已提交
391
acpi_ut_exit(u32 line_number,
392 393
	     const char *function_name,
	     const char *module_name, u32 component_id)
L
Linus Torvalds 已提交
394 395
{

396 397 398
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s\n", acpi_gbl_fn_exit_str);
L
Linus Torvalds 已提交
399 400 401 402

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
403
ACPI_EXPORT_SYMBOL(acpi_ut_exit)
L
Linus Torvalds 已提交
404

R
Robert Moore 已提交
405
/*******************************************************************************
L
Linus Torvalds 已提交
406 407 408 409
 *
 * FUNCTION:    acpi_ut_status_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
410 411 412
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
413
 *              status              - Exit status code
L
Linus Torvalds 已提交
414 415 416
 *
 * RETURN:      None
 *
417
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
418 419
 *              set in debug_level. Prints exit status also.
 *
R
Robert Moore 已提交
420
 ******************************************************************************/
L
Linus Torvalds 已提交
421
void
L
Len Brown 已提交
422 423
acpi_ut_status_exit(u32 line_number,
		    const char *function_name,
424 425
		    const char *module_name,
		    u32 component_id, acpi_status status)
L
Linus Torvalds 已提交
426 427
{

L
Len Brown 已提交
428
	if (ACPI_SUCCESS(status)) {
429 430 431 432
		acpi_debug_print(ACPI_LV_FUNCTIONS,
				 line_number, function_name, module_name,
				 component_id, "%s %s\n", acpi_gbl_fn_exit_str,
				 acpi_format_exception(status));
L
Len Brown 已提交
433
	} else {
434 435 436 437 438
		acpi_debug_print(ACPI_LV_FUNCTIONS,
				 line_number, function_name, module_name,
				 component_id, "%s ****Exception****: %s\n",
				 acpi_gbl_fn_exit_str,
				 acpi_format_exception(status));
L
Linus Torvalds 已提交
439 440 441 442 443
	}

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
444
ACPI_EXPORT_SYMBOL(acpi_ut_status_exit)
L
Linus Torvalds 已提交
445

R
Robert Moore 已提交
446
/*******************************************************************************
L
Linus Torvalds 已提交
447 448 449 450
 *
 * FUNCTION:    acpi_ut_value_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
451 452 453
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
454
 *              value               - Value to be printed with exit msg
L
Linus Torvalds 已提交
455 456 457
 *
 * RETURN:      None
 *
458
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
459 460
 *              set in debug_level. Prints exit value also.
 *
R
Robert Moore 已提交
461
 ******************************************************************************/
L
Linus Torvalds 已提交
462
void
L
Len Brown 已提交
463 464
acpi_ut_value_exit(u32 line_number,
		   const char *function_name,
465
		   const char *module_name, u32 component_id, u64 value)
L
Linus Torvalds 已提交
466 467
{

468 469 470 471
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
			 ACPI_FORMAT_UINT64(value));
L
Linus Torvalds 已提交
472 473 474 475

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
476
ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
L
Linus Torvalds 已提交
477

R
Robert Moore 已提交
478
/*******************************************************************************
L
Linus Torvalds 已提交
479 480 481 482
 *
 * FUNCTION:    acpi_ut_ptr_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
483 484 485
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
486
 *              ptr                 - Pointer to display
L
Linus Torvalds 已提交
487 488 489
 *
 * RETURN:      None
 *
490
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
491 492
 *              set in debug_level. Prints exit value also.
 *
R
Robert Moore 已提交
493
 ******************************************************************************/
L
Linus Torvalds 已提交
494
void
L
Len Brown 已提交
495 496
acpi_ut_ptr_exit(u32 line_number,
		 const char *function_name,
497
		 const char *module_name, u32 component_id, u8 *ptr)
L
Linus Torvalds 已提交
498 499
{

500 501 502
	acpi_debug_print(ACPI_LV_FUNCTIONS,
			 line_number, function_name, module_name, component_id,
			 "%s %p\n", acpi_gbl_fn_exit_str, ptr);
L
Linus Torvalds 已提交
503 504 505 506 507 508

	acpi_gbl_nesting_level--;
}

#endif

R
Robert Moore 已提交
509
/*******************************************************************************
L
Linus Torvalds 已提交
510 511 512
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
513 514 515
 * PARAMETERS:  buffer              - Buffer to dump
 *              count               - Amount to dump, in bytes
 *              display             - BYTE, WORD, DWORD, or QWORD display
516
 *              offset              - Beginning buffer offset (display only)
L
Linus Torvalds 已提交
517 518 519 520 521
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
R
Robert Moore 已提交
522
 ******************************************************************************/
L
Linus Torvalds 已提交
523

524
void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
L
Linus Torvalds 已提交
525
{
526 527
	u32 i = 0;
	u32 j;
L
Len Brown 已提交
528 529
	u32 temp32;
	u8 buf_char;
L
Linus Torvalds 已提交
530

531 532 533 534 535
	if (!buffer) {
		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
		return;
	}

L
Linus Torvalds 已提交
536 537 538 539
	if ((count < 4) || (count & 0x01)) {
		display = DB_BYTE_DISPLAY;
	}

R
Robert Moore 已提交
540
	/* Nasty little dump buffer routine! */
L
Linus Torvalds 已提交
541 542

	while (i < count) {
B
Bob Moore 已提交
543

L
Linus Torvalds 已提交
544 545
		/* Print current offset */

546
		acpi_os_printf("%6.4X: ", (base_offset + i));
L
Linus Torvalds 已提交
547 548 549 550 551

		/* Print 16 hex chars */

		for (j = 0; j < 16;) {
			if (i + j >= count) {
B
Bob Moore 已提交
552

R
Robert Moore 已提交
553
				/* Dump fill spaces */
L
Linus Torvalds 已提交
554

L
Len Brown 已提交
555
				acpi_os_printf("%*s", ((display * 2) + 1), " ");
556
				j += display;
R
Robert Moore 已提交
557 558
				continue;
			}
L
Linus Torvalds 已提交
559 560

			switch (display) {
B
Bob Moore 已提交
561
			case DB_BYTE_DISPLAY:
L
Len Brown 已提交
562
			default:	/* Default is BYTE display */
L
Linus Torvalds 已提交
563

564 565
				acpi_os_printf("%02X ",
					       buffer[(acpi_size) i + j]);
L
Linus Torvalds 已提交
566 567 568 569
				break;

			case DB_WORD_DISPLAY:

570 571
				ACPI_MOVE_16_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
572
				acpi_os_printf("%04X ", temp32);
L
Linus Torvalds 已提交
573 574 575 576
				break;

			case DB_DWORD_DISPLAY:

577 578
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
579
				acpi_os_printf("%08X ", temp32);
L
Linus Torvalds 已提交
580 581 582 583
				break;

			case DB_QWORD_DISPLAY:

584 585
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
586
				acpi_os_printf("%08X", temp32);
L
Linus Torvalds 已提交
587

588 589 590
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j +
							   4]);
L
Len Brown 已提交
591
				acpi_os_printf("%08X ", temp32);
L
Linus Torvalds 已提交
592 593
				break;
			}
R
Robert Moore 已提交
594

595
			j += display;
L
Linus Torvalds 已提交
596 597 598
		}

		/*
599 600
		 * Print the ASCII equivalent characters but watch out for the bad
		 * unprintable ones (printable chars are 0x20 through 0x7E)
L
Linus Torvalds 已提交
601
		 */
L
Len Brown 已提交
602
		acpi_os_printf(" ");
L
Linus Torvalds 已提交
603 604
		for (j = 0; j < 16; j++) {
			if (i + j >= count) {
L
Len Brown 已提交
605
				acpi_os_printf("\n");
L
Linus Torvalds 已提交
606 607 608
				return;
			}

609
			buf_char = buffer[(acpi_size) i + j];
L
Len Brown 已提交
610 611 612 613
			if (ACPI_IS_PRINT(buf_char)) {
				acpi_os_printf("%c", buf_char);
			} else {
				acpi_os_printf(".");
L
Linus Torvalds 已提交
614 615 616 617 618
			}
		}

		/* Done with that line. */

L
Len Brown 已提交
619
		acpi_os_printf("\n");
L
Linus Torvalds 已提交
620 621 622 623 624
		i += 16;
	}

	return;
}
B
Bob Moore 已提交
625 626 627

/*******************************************************************************
 *
628
 * FUNCTION:    acpi_ut_debug_dump_buffer
B
Bob Moore 已提交
629
 *
630 631 632 633
 * PARAMETERS:  buffer              - Buffer to dump
 *              count               - Amount to dump, in bytes
 *              display             - BYTE, WORD, DWORD, or QWORD display
 *              component_ID        - Caller's component ID
B
Bob Moore 已提交
634 635 636 637 638 639 640
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
 ******************************************************************************/

641 642
void
acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
B
Bob Moore 已提交
643 644 645 646 647 648 649 650 651
{

	/* Only dump the buffer if tracing is enabled */

	if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
	      (component_id & acpi_dbg_layer))) {
		return;
	}

652
	acpi_ut_dump_buffer(buffer, count, display, 0);
B
Bob Moore 已提交
653
}