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 - 2010, 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 44
 * 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.
 */

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

#define _COMPONENT          ACPI_UTILITIES
L
Len Brown 已提交
48
ACPI_MODULE_NAME("utdebug")
L
Linus Torvalds 已提交
49
#ifdef ACPI_DEBUG_OUTPUT
50
static acpi_thread_id acpi_gbl_prev_thread_id;
L
Len Brown 已提交
51 52
static char *acpi_gbl_fn_entry_str = "----Entry";
static char *acpi_gbl_fn_exit_str = "----Exit-";
L
Linus Torvalds 已提交
53

54 55
/* Local prototypes */

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

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

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

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

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

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

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

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

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

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

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

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

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

		return (function_name + 4);
	}

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

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

		return (function_name + 5);
	}

	return (function_name);
}

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

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

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

	/*
	 * Thread tracking and context switch notification
	 */
L
Len Brown 已提交
178
	thread_id = acpi_os_get_thread_id();
L
Linus Torvalds 已提交
179 180
	if (thread_id != acpi_gbl_prev_thread_id) {
		if (ACPI_LV_THREADS & acpi_dbg_level) {
L
Len Brown 已提交
181
			acpi_os_printf
182 183 184
			    ("\n**** Context Switch from TID %p to TID %p ****\n\n",
			     ACPI_CAST_PTR(void, acpi_gbl_prev_thread_id),
			     ACPI_CAST_PTR(void, 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("[%p] ", ACPI_CAST_PTR(void, 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
L
Linus Torvalds 已提交
220 221 222 223 224 225 226 227
 *              Format              - Printf format field
 *              ...                 - 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
L
Linus Torvalds 已提交
289 290 291 292 293 294 295
 *              Pointer             - Pointer to display
 *
 * 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
L
Linus Torvalds 已提交
318 319 320 321 322 323 324
 *              String              - Additional string to display
 *
 * 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
L
Linus Torvalds 已提交
349 350 351 352 353 354 355
 *              Integer             - Integer to display
 *
 * 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
L
Linus Torvalds 已提交
411 412 413 414 415 416 417
 *              Status              - Exit status code
 *
 * 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
L
Linus Torvalds 已提交
452 453 454 455 456 457 458
 *              Value               - Value to be printed with exit msg
 *
 * 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
R
Robert Moore 已提交
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 511 512 513 514 515 516 517 518 519
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
 * PARAMETERS:  Buffer              - Buffer to dump
 *              Count               - Amount to dump, in bytes
 *              Display             - BYTE, WORD, DWORD, or QWORD display
 *              component_iD        - Caller's component ID
 *
 * 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 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
 * PARAMETERS:  Buffer              - Buffer to dump
 *              Count               - Amount to dump, in bytes
 *              Display             - BYTE, WORD, DWORD, or QWORD display
 *              component_iD        - Caller's component ID
 *
 * 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);
}