utdebug.c 18.9 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")
L
Linus Torvalds 已提交
50
#ifdef ACPI_DEBUG_OUTPUT
51
static acpi_thread_id acpi_gbl_prev_thread_id;
L
Len Brown 已提交
52 53
static char *acpi_gbl_fn_entry_str = "----Entry";
static char *acpi_gbl_fn_exit_str = "----Exit-";
L
Linus Torvalds 已提交
54

55 56
/* Local prototypes */

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

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

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

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

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

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

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

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

103 104 105 106 107 108 109 110 111
/*******************************************************************************
 *
 * 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.
112
 *              This allows compiler macros such as __func__ to be used
113 114 115 116
 *              with no change to the debug output.
 *
 ******************************************************************************/

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

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

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

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

		return (function_name + 4);
	}

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

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

		return (function_name + 5);
	}

	return (function_name);
}

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

L
Len Brown 已提交
158
void ACPI_INTERNAL_VAR_XFACE
159 160 161 162 163
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 已提交
164
{
B
Bob Moore 已提交
165
	acpi_thread_id thread_id;
L
Len Brown 已提交
166
	va_list args;
L
Linus Torvalds 已提交
167 168 169 170 171

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

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

		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 已提交
194
	acpi_os_printf("%8s-%04ld ", module_name, line_number);
L
Linus Torvalds 已提交
195 196

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

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

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

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

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

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

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

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

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

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

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

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

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

305 306 307
	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 已提交
308 309
}

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

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

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
334
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
335

336 337 338
	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 已提交
339 340
}

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

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

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
365
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
366

367 368 369
	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 已提交
370 371
}

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

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

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

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
401
ACPI_EXPORT_SYMBOL(acpi_ut_exit)
L
Linus Torvalds 已提交
402

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

L
Len Brown 已提交
426
	if (ACPI_SUCCESS(status)) {
427 428 429 430
		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 已提交
431
	} else {
432 433 434 435 436
		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 已提交
437 438 439 440 441
	}

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
442
ACPI_EXPORT_SYMBOL(acpi_ut_status_exit)
L
Linus Torvalds 已提交
443

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

466 467 468 469
	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 已提交
470 471 472 473

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
474
ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
L
Linus Torvalds 已提交
475

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

498 499 500
	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 已提交
501 502 503 504 505 506

	acpi_gbl_nesting_level--;
}

#endif

R
Robert Moore 已提交
507
/*******************************************************************************
L
Linus Torvalds 已提交
508 509 510
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
511 512 513 514
 * PARAMETERS:  buffer              - Buffer to dump
 *              count               - Amount to dump, in bytes
 *              display             - BYTE, WORD, DWORD, or QWORD display
 *              component_ID        - Caller's component ID
L
Linus Torvalds 已提交
515 516 517 518 519
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
R
Robert Moore 已提交
520
 ******************************************************************************/
L
Linus Torvalds 已提交
521

B
Bob Moore 已提交
522
void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)
L
Linus Torvalds 已提交
523
{
524 525
	u32 i = 0;
	u32 j;
L
Len Brown 已提交
526 527
	u32 temp32;
	u8 buf_char;
L
Linus Torvalds 已提交
528

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

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

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

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

L
Linus Torvalds 已提交
542 543
		/* Print current offset */

544
		acpi_os_printf("%6.4X: ", i);
L
Linus Torvalds 已提交
545 546 547 548 549

		/* Print 16 hex chars */

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

R
Robert Moore 已提交
551
				/* Dump fill spaces */
L
Linus Torvalds 已提交
552

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

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

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

			case DB_WORD_DISPLAY:

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

			case DB_DWORD_DISPLAY:

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

			case DB_QWORD_DISPLAY:

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

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

593
			j += display;
L
Linus Torvalds 已提交
594 595 596
		}

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

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

		/* Done with that line. */

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

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

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
628 629 630 631
 * 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 已提交
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
 ******************************************************************************/

void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id)
{

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

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

	acpi_ut_dump_buffer2(buffer, count, display);
}