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

/*
B
Bob Moore 已提交
8
 * Copyright (C) 2000 - 2007, R. Byron Moore
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 45 46
 * 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>

#define _COMPONENT          ACPI_UTILITIES
L
Len Brown 已提交
47
ACPI_MODULE_NAME("utdebug")
L
Linus Torvalds 已提交
48 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
{
L
Len Brown 已提交
72
	u32 current_sp;
L
Linus Torvalds 已提交
73

L
Len Brown 已提交
74
	acpi_gbl_entry_stack_pointer = ACPI_PTR_DIFF(&current_sp, NULL);
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

L
Len Brown 已提交
93
	current_sp = ACPI_PTR_DIFF(&current_sp, NULL);
L
Linus Torvalds 已提交
94 95 96 97 98 99 100 101 102 103

	if (current_sp < acpi_gbl_lowest_stack_pointer) {
		acpi_gbl_lowest_stack_pointer = current_sp;
	}

	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 113 114 115 116 117
/*******************************************************************************
 *
 * 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.
 *              This allows compiler macros such as __FUNCTION__ to be used
 *              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 143
 *
 * FUNCTION:    acpi_ut_debug_print
 *
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
L
Linus Torvalds 已提交
149 150 151 152 153 154 155 156
 *              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 已提交
157
 ******************************************************************************/
L
Linus Torvalds 已提交
158

L
Len Brown 已提交
159 160 161 162 163
void ACPI_INTERNAL_VAR_XFACE
acpi_ut_debug_print(u32 requested_debug_level,
		    u32 line_number,
		    const char *function_name,
		    char *module_name, u32 component_id, 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 %X to TID %X ****\n\n",
			     (unsigned)acpi_gbl_prev_thread_id, (unsigned)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("[%04X] ", (unsigned)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);
L
Linus Torvalds 已提交
206 207
}

B
Bob Moore 已提交
208
ACPI_EXPORT_SYMBOL(acpi_ut_debug_print)
L
Linus Torvalds 已提交
209

R
Robert Moore 已提交
210
/*******************************************************************************
L
Linus Torvalds 已提交
211 212 213 214 215
 *
 * FUNCTION:    acpi_ut_debug_print_raw
 *
 * 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 229 230 231 232
void ACPI_INTERNAL_VAR_XFACE
acpi_ut_debug_print_raw(u32 requested_debug_level,
			u32 line_number,
			const char *function_name,
			char *module_name, u32 component_id, char *format, ...)
L
Linus Torvalds 已提交
233
{
L
Len Brown 已提交
234
	va_list args;
L
Linus Torvalds 已提交
235 236

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

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

B
Bob Moore 已提交
245
ACPI_EXPORT_SYMBOL(acpi_ut_debug_print_raw)
L
Linus Torvalds 已提交
246

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

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
268
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
269

L
Len Brown 已提交
270 271 272
	acpi_ut_debug_print(ACPI_LV_FUNCTIONS,
			    line_number, function_name, module_name,
			    component_id, "%s\n", acpi_gbl_fn_entry_str);
L
Linus Torvalds 已提交
273 274
}

B
Bob Moore 已提交
275
ACPI_EXPORT_SYMBOL(acpi_ut_trace)
L
Linus Torvalds 已提交
276

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

L
Len Brown 已提交
301 302 303 304
	acpi_ut_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 已提交
305 306
}

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

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

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
331
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
332

L
Len Brown 已提交
333 334 335 336
	acpi_ut_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 已提交
337 338
}

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

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

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

L
Len Brown 已提交
365 366 367 368
	acpi_ut_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 389
acpi_ut_exit(u32 line_number,
	     const char *function_name, char *module_name, u32 component_id)
L
Linus Torvalds 已提交
390 391
{

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

	acpi_gbl_nesting_level--;
}

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

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

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

	acpi_gbl_nesting_level--;
}

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

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

L
Len Brown 已提交
464 465 466 467
	acpi_ut_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 已提交
468 469 470 471

	acpi_gbl_nesting_level--;
}

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

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

L
Len Brown 已提交
496 497 498
	acpi_ut_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 已提交
499 500 501 502 503 504

	acpi_gbl_nesting_level--;
}

#endif

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

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

	if ((count < 4) || (count & 0x01)) {
		display = DB_BYTE_DISPLAY;
	}

R
Robert Moore 已提交
531
	/* Nasty little dump buffer routine! */
L
Linus Torvalds 已提交
532 533

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

L
Linus Torvalds 已提交
535 536
		/* Print current offset */

L
Len Brown 已提交
537
		acpi_os_printf("%6.4X: ", (u32) i);
L
Linus Torvalds 已提交
538 539 540 541 542

		/* Print 16 hex chars */

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

R
Robert Moore 已提交
544
				/* Dump fill spaces */
L
Linus Torvalds 已提交
545

L
Len Brown 已提交
546
				acpi_os_printf("%*s", ((display * 2) + 1), " ");
547
				j += (acpi_native_uint) display;
R
Robert Moore 已提交
548 549
				continue;
			}
L
Linus Torvalds 已提交
550 551

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

L
Len Brown 已提交
555
				acpi_os_printf("%02X ", buffer[i + j]);
L
Linus Torvalds 已提交
556 557 558 559
				break;

			case DB_WORD_DISPLAY:

L
Len Brown 已提交
560 561
				ACPI_MOVE_16_TO_32(&temp32, &buffer[i + j]);
				acpi_os_printf("%04X ", temp32);
L
Linus Torvalds 已提交
562 563 564 565
				break;

			case DB_DWORD_DISPLAY:

L
Len Brown 已提交
566 567
				ACPI_MOVE_32_TO_32(&temp32, &buffer[i + j]);
				acpi_os_printf("%08X ", temp32);
L
Linus Torvalds 已提交
568 569 570 571
				break;

			case DB_QWORD_DISPLAY:

L
Len Brown 已提交
572 573
				ACPI_MOVE_32_TO_32(&temp32, &buffer[i + j]);
				acpi_os_printf("%08X", temp32);
L
Linus Torvalds 已提交
574

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

580
			j += (acpi_native_uint) display;
L
Linus Torvalds 已提交
581 582 583
		}

		/*
584 585
		 * Print the ASCII equivalent characters but watch out for the bad
		 * unprintable ones (printable chars are 0x20 through 0x7E)
L
Linus Torvalds 已提交
586
		 */
L
Len Brown 已提交
587
		acpi_os_printf(" ");
L
Linus Torvalds 已提交
588 589
		for (j = 0; j < 16; j++) {
			if (i + j >= count) {
L
Len Brown 已提交
590
				acpi_os_printf("\n");
L
Linus Torvalds 已提交
591 592 593 594
				return;
			}

			buf_char = buffer[i + j];
L
Len Brown 已提交
595 596 597 598
			if (ACPI_IS_PRINT(buf_char)) {
				acpi_os_printf("%c", buf_char);
			} else {
				acpi_os_printf(".");
L
Linus Torvalds 已提交
599 600 601 602 603
			}
		}

		/* Done with that line. */

L
Len Brown 已提交
604
		acpi_os_printf("\n");
L
Linus Torvalds 已提交
605 606 607 608 609
		i += 16;
	}

	return;
}
B
Bob Moore 已提交
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637

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