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
L
Linus Torvalds 已提交
148 149 150 151 152 153 154 155
 *              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 已提交
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
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);
}