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 - 2011, 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
			    ("\n**** Context Switch from TID %u to TID %u ****\n\n",
			     (u32)acpi_gbl_prev_thread_id, (u32)thread_id);
L
Linus Torvalds 已提交
184 185 186 187 188 189 190 191 192
		}

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

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

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

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

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

R
Robert Moore 已提交
210
/*******************************************************************************
L
Linus Torvalds 已提交
211
 *
212
 * FUNCTION:    acpi_debug_print_raw
L
Linus Torvalds 已提交
213 214 215
 *
 * PARAMETERS:  requested_debug_level - Requested debug print level
 *              line_number         - Caller's line number
216 217 218
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
219 220 221 222 223 224 225 226
 *              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 已提交
227
 ******************************************************************************/
L
Len Brown 已提交
228
void ACPI_INTERNAL_VAR_XFACE
229 230 231 232 233
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 已提交
234
{
L
Len Brown 已提交
235
	va_list args;
L
Linus Torvalds 已提交
236 237

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

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

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

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

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

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

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

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

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

R
Robert Moore 已提交
309
/*******************************************************************************
L
Linus Torvalds 已提交
310 311 312 313
 *
 * FUNCTION:    acpi_ut_trace_str
 *
 * PARAMETERS:  line_number         - Caller's line number
314 315 316
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
317 318 319 320 321 322 323
 *              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 已提交
324
 ******************************************************************************/
L
Linus Torvalds 已提交
325 326

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

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

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

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

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

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

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

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

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

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

	acpi_gbl_nesting_level--;
}

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

R
Robert Moore 已提交
402
/*******************************************************************************
L
Linus Torvalds 已提交
403 404 405 406
 *
 * FUNCTION:    acpi_ut_status_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
407 408 409
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
410 411 412 413 414 415 416
 *              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 已提交
417
 ******************************************************************************/
L
Linus Torvalds 已提交
418
void
L
Len Brown 已提交
419 420
acpi_ut_status_exit(u32 line_number,
		    const char *function_name,
421 422
		    const char *module_name,
		    u32 component_id, acpi_status status)
L
Linus Torvalds 已提交
423 424
{

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

	acpi_gbl_nesting_level--;
}

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

R
Robert Moore 已提交
443
/*******************************************************************************
L
Linus Torvalds 已提交
444 445 446 447
 *
 * FUNCTION:    acpi_ut_value_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
448 449 450
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
451 452 453 454 455 456 457
 *              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 已提交
458
 ******************************************************************************/
L
Linus Torvalds 已提交
459
void
L
Len Brown 已提交
460 461
acpi_ut_value_exit(u32 line_number,
		   const char *function_name,
462
		   const char *module_name, u32 component_id, u64 value)
L
Linus Torvalds 已提交
463 464
{

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

	acpi_gbl_nesting_level--;
}

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

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

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

	acpi_gbl_nesting_level--;
}

#endif

R
Robert Moore 已提交
506
/*******************************************************************************
L
Linus Torvalds 已提交
507 508 509 510 511 512 513 514 515 516 517 518
 *
 * 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 已提交
519
 ******************************************************************************/
L
Linus Torvalds 已提交
520

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

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

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

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

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

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

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

		/* Print 16 hex chars */

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

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

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

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

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

			case DB_WORD_DISPLAY:

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

			case DB_DWORD_DISPLAY:

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

			case DB_QWORD_DISPLAY:

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

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

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

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

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

		/* Done with that line. */

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

	return;
}
B
Bob Moore 已提交
622 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

/*******************************************************************************
 *
 * 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);
}