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

/*
8
 * Copyright (C) 2000 - 2013, 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")
50

L
Linus Torvalds 已提交
51
#ifdef ACPI_DEBUG_OUTPUT
52
static acpi_thread_id acpi_gbl_prev_thread_id = (acpi_thread_id) 0xFFFFFFFF;
L
Len Brown 已提交
53 54
static char *acpi_gbl_fn_entry_str = "----Entry";
static char *acpi_gbl_fn_exit_str = "----Exit-";
L
Linus Torvalds 已提交
55

56 57
/* Local prototypes */

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

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

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

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

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

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

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

	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
/*******************************************************************************
 *
 * 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.
113
 *              This allows compiler macros such as __FUNCTION__ to be used
114 115 116 117
 *              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
 * FUNCTION:    acpi_debug_print
L
Linus Torvalds 已提交
143
 *
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
149
 *              format              - Printf format field
L
Linus Torvalds 已提交
150 151 152 153 154 155 156
 *              ...                 - 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
void ACPI_INTERNAL_VAR_XFACE
160 161 162 163 164
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 已提交
165
{
B
Bob Moore 已提交
166
	acpi_thread_id thread_id;
L
Len Brown 已提交
167
	va_list args;
L
Linus Torvalds 已提交
168

169 170 171
	/* Check if debug output enabled */

	if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
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
219
 *              format              - Printf format field
L
Linus Torvalds 已提交
220 221 222 223
 *              ...                 - Optional printf arguments
 *
 * RETURN:      None
 *
224
 * DESCRIPTION: Print message with no headers. Has same interface as
L
Linus Torvalds 已提交
225 226
 *              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 238 239
	/* Check if debug output enabled */

	if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
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
 *
 * RETURN:      None
 *
261
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
262 263
 *              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 277 278 279 280
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		acpi_debug_print(ACPI_LV_FUNCTIONS,
				 line_number, function_name, module_name,
				 component_id, "%s\n", acpi_gbl_fn_entry_str);
	}
L
Linus Torvalds 已提交
281 282
}

B
Bob Moore 已提交
283
ACPI_EXPORT_SYMBOL(acpi_ut_trace)
L
Linus Torvalds 已提交
284

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

L
Linus Torvalds 已提交
307
	acpi_gbl_nesting_level++;
L
Len Brown 已提交
308
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
309

310 311 312 313 314 315 316 317
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		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 已提交
318 319
}

R
Robert Moore 已提交
320
/*******************************************************************************
L
Linus Torvalds 已提交
321 322 323 324
 *
 * FUNCTION:    acpi_ut_trace_str
 *
 * PARAMETERS:  line_number         - Caller's line number
325 326 327
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
328
 *              string              - Additional string to display
L
Linus Torvalds 已提交
329 330 331
 *
 * RETURN:      None
 *
332
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
333 334
 *              set in debug_level
 *
R
Robert Moore 已提交
335
 ******************************************************************************/
L
Linus Torvalds 已提交
336 337

void
L
Len Brown 已提交
338 339
acpi_ut_trace_str(u32 line_number,
		  const char *function_name,
340
		  const char *module_name, u32 component_id, char *string)
L
Linus Torvalds 已提交
341 342 343
{

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
344
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
345

346 347 348 349 350 351 352 353
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		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 已提交
354 355
}

R
Robert Moore 已提交
356
/*******************************************************************************
L
Linus Torvalds 已提交
357 358 359 360
 *
 * FUNCTION:    acpi_ut_trace_u32
 *
 * PARAMETERS:  line_number         - Caller's line number
361 362 363
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
364
 *              integer             - Integer to display
L
Linus Torvalds 已提交
365 366 367
 *
 * RETURN:      None
 *
368
 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
369 370
 *              set in debug_level
 *
R
Robert Moore 已提交
371
 ******************************************************************************/
L
Linus Torvalds 已提交
372 373

void
L
Len Brown 已提交
374 375
acpi_ut_trace_u32(u32 line_number,
		  const char *function_name,
376
		  const char *module_name, u32 component_id, u32 integer)
L
Linus Torvalds 已提交
377 378 379
{

	acpi_gbl_nesting_level++;
L
Len Brown 已提交
380
	acpi_ut_track_stack_ptr();
L
Linus Torvalds 已提交
381

382 383 384 385 386 387 388 389
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		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 已提交
390 391
}

R
Robert Moore 已提交
392
/*******************************************************************************
L
Linus Torvalds 已提交
393 394 395 396
 *
 * FUNCTION:    acpi_ut_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
397 398 399
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
L
Linus Torvalds 已提交
400 401 402
 *
 * RETURN:      None
 *
403
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
404 405
 *              set in debug_level
 *
R
Robert Moore 已提交
406
 ******************************************************************************/
L
Linus Torvalds 已提交
407 408

void
L
Len Brown 已提交
409
acpi_ut_exit(u32 line_number,
410 411
	     const char *function_name,
	     const char *module_name, u32 component_id)
L
Linus Torvalds 已提交
412 413
{

414 415 416 417 418 419 420
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		acpi_debug_print(ACPI_LV_FUNCTIONS,
				 line_number, function_name, module_name,
				 component_id, "%s\n", acpi_gbl_fn_exit_str);
	}
L
Linus Torvalds 已提交
421 422 423 424

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
425
ACPI_EXPORT_SYMBOL(acpi_ut_exit)
L
Linus Torvalds 已提交
426

R
Robert Moore 已提交
427
/*******************************************************************************
L
Linus Torvalds 已提交
428 429 430 431
 *
 * FUNCTION:    acpi_ut_status_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
432 433 434
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
435
 *              status              - Exit status code
L
Linus Torvalds 已提交
436 437 438
 *
 * RETURN:      None
 *
439
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
440 441
 *              set in debug_level. Prints exit status also.
 *
R
Robert Moore 已提交
442
 ******************************************************************************/
L
Linus Torvalds 已提交
443
void
L
Len Brown 已提交
444 445
acpi_ut_status_exit(u32 line_number,
		    const char *function_name,
446 447
		    const char *module_name,
		    u32 component_id, acpi_status status)
L
Linus Torvalds 已提交
448 449
{

450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		if (ACPI_SUCCESS(status)) {
			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));
		} else {
			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 已提交
467 468 469 470 471
	}

	acpi_gbl_nesting_level--;
}

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

R
Robert Moore 已提交
474
/*******************************************************************************
L
Linus Torvalds 已提交
475 476 477 478
 *
 * FUNCTION:    acpi_ut_value_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
482
 *              value               - Value to be printed with exit msg
L
Linus Torvalds 已提交
483 484 485
 *
 * RETURN:      None
 *
486
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
487 488
 *              set in debug_level. Prints exit value also.
 *
R
Robert Moore 已提交
489
 ******************************************************************************/
L
Linus Torvalds 已提交
490
void
L
Len Brown 已提交
491 492
acpi_ut_value_exit(u32 line_number,
		   const char *function_name,
493
		   const char *module_name, u32 component_id, u64 value)
L
Linus Torvalds 已提交
494 495
{

496 497 498 499 500 501 502 503 504
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		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 已提交
505 506 507 508

	acpi_gbl_nesting_level--;
}

B
Bob Moore 已提交
509
ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
L
Linus Torvalds 已提交
510

R
Robert Moore 已提交
511
/*******************************************************************************
L
Linus Torvalds 已提交
512 513 514 515
 *
 * FUNCTION:    acpi_ut_ptr_exit
 *
 * PARAMETERS:  line_number         - Caller's line number
516 517 518
 *              function_name       - Caller's procedure name
 *              module_name         - Caller's module name
 *              component_id        - Caller's component ID
519
 *              ptr                 - Pointer to display
L
Linus Torvalds 已提交
520 521 522
 *
 * RETURN:      None
 *
523
 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
L
Linus Torvalds 已提交
524 525
 *              set in debug_level. Prints exit value also.
 *
R
Robert Moore 已提交
526
 ******************************************************************************/
L
Linus Torvalds 已提交
527
void
L
Len Brown 已提交
528 529
acpi_ut_ptr_exit(u32 line_number,
		 const char *function_name,
530
		 const char *module_name, u32 component_id, u8 *ptr)
L
Linus Torvalds 已提交
531 532
{

533 534 535 536 537 538 539 540
	/* Check if enabled up-front for performance */

	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
		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 已提交
541 542 543 544 545 546

	acpi_gbl_nesting_level--;
}

#endif

R
Robert Moore 已提交
547
/*******************************************************************************
L
Linus Torvalds 已提交
548 549 550
 *
 * FUNCTION:    acpi_ut_dump_buffer
 *
551 552 553
 * PARAMETERS:  buffer              - Buffer to dump
 *              count               - Amount to dump, in bytes
 *              display             - BYTE, WORD, DWORD, or QWORD display
554
 *              offset              - Beginning buffer offset (display only)
L
Linus Torvalds 已提交
555 556 557 558 559
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
R
Robert Moore 已提交
560
 ******************************************************************************/
L
Linus Torvalds 已提交
561

562
void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
L
Linus Torvalds 已提交
563
{
564 565
	u32 i = 0;
	u32 j;
L
Len Brown 已提交
566 567
	u32 temp32;
	u8 buf_char;
L
Linus Torvalds 已提交
568

569 570 571 572 573
	if (!buffer) {
		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
		return;
	}

L
Linus Torvalds 已提交
574 575 576 577
	if ((count < 4) || (count & 0x01)) {
		display = DB_BYTE_DISPLAY;
	}

R
Robert Moore 已提交
578
	/* Nasty little dump buffer routine! */
L
Linus Torvalds 已提交
579 580

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

L
Linus Torvalds 已提交
582 583
		/* Print current offset */

584
		acpi_os_printf("%6.4X: ", (base_offset + i));
L
Linus Torvalds 已提交
585 586 587 588 589

		/* Print 16 hex chars */

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

R
Robert Moore 已提交
591
				/* Dump fill spaces */
L
Linus Torvalds 已提交
592

L
Len Brown 已提交
593
				acpi_os_printf("%*s", ((display * 2) + 1), " ");
594
				j += display;
R
Robert Moore 已提交
595 596
				continue;
			}
L
Linus Torvalds 已提交
597 598

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

602 603
				acpi_os_printf("%02X ",
					       buffer[(acpi_size) i + j]);
L
Linus Torvalds 已提交
604 605 606 607
				break;

			case DB_WORD_DISPLAY:

608 609
				ACPI_MOVE_16_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
610
				acpi_os_printf("%04X ", temp32);
L
Linus Torvalds 已提交
611 612 613 614
				break;

			case DB_DWORD_DISPLAY:

615 616
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
617
				acpi_os_printf("%08X ", temp32);
L
Linus Torvalds 已提交
618 619 620 621
				break;

			case DB_QWORD_DISPLAY:

622 623
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j]);
L
Len Brown 已提交
624
				acpi_os_printf("%08X", temp32);
L
Linus Torvalds 已提交
625

626 627 628
				ACPI_MOVE_32_TO_32(&temp32,
						   &buffer[(acpi_size) i + j +
							   4]);
L
Len Brown 已提交
629
				acpi_os_printf("%08X ", temp32);
L
Linus Torvalds 已提交
630 631
				break;
			}
R
Robert Moore 已提交
632

633
			j += display;
L
Linus Torvalds 已提交
634 635 636
		}

		/*
637 638
		 * Print the ASCII equivalent characters but watch out for the bad
		 * unprintable ones (printable chars are 0x20 through 0x7E)
L
Linus Torvalds 已提交
639
		 */
L
Len Brown 已提交
640
		acpi_os_printf(" ");
L
Linus Torvalds 已提交
641 642
		for (j = 0; j < 16; j++) {
			if (i + j >= count) {
L
Len Brown 已提交
643
				acpi_os_printf("\n");
L
Linus Torvalds 已提交
644 645 646
				return;
			}

647
			buf_char = buffer[(acpi_size) i + j];
L
Len Brown 已提交
648 649 650 651
			if (ACPI_IS_PRINT(buf_char)) {
				acpi_os_printf("%c", buf_char);
			} else {
				acpi_os_printf(".");
L
Linus Torvalds 已提交
652 653 654 655 656
			}
		}

		/* Done with that line. */

L
Len Brown 已提交
657
		acpi_os_printf("\n");
L
Linus Torvalds 已提交
658 659 660 661 662
		i += 16;
	}

	return;
}
B
Bob Moore 已提交
663 664 665

/*******************************************************************************
 *
666
 * FUNCTION:    acpi_ut_debug_dump_buffer
B
Bob Moore 已提交
667
 *
668 669 670 671
 * PARAMETERS:  buffer              - Buffer to dump
 *              count               - Amount to dump, in bytes
 *              display             - BYTE, WORD, DWORD, or QWORD display
 *              component_ID        - Caller's component ID
B
Bob Moore 已提交
672 673 674 675 676 677 678
 *
 * RETURN:      None
 *
 * DESCRIPTION: Generic dump buffer in both hex and ascii.
 *
 ******************************************************************************/

679 680
void
acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
B
Bob Moore 已提交
681 682 683 684 685 686 687 688 689
{

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

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

690
	acpi_ut_dump_buffer(buffer, count, display, 0);
B
Bob Moore 已提交
691
}