1/****************************************************************************** 2 * 3 * Module Name: utdebug - Debug print/trace routines 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2015, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44#define EXPORT_ACPI_INTERFACES 45 46#include <acpi/acpi.h> 47#include "accommon.h" 48#include "acinterp.h" 49 50#define _COMPONENT ACPI_UTILITIES 51ACPI_MODULE_NAME("utdebug") 52 53#ifdef ACPI_DEBUG_OUTPUT 54static acpi_thread_id acpi_gbl_prev_thread_id = (acpi_thread_id) 0xFFFFFFFF; 55static char *acpi_gbl_fn_entry_str = "----Entry"; 56static char *acpi_gbl_fn_exit_str = "----Exit-"; 57 58/* Local prototypes */ 59 60static const char *acpi_ut_trim_function_name(const char *function_name); 61 62/******************************************************************************* 63 * 64 * FUNCTION: acpi_ut_init_stack_ptr_trace 65 * 66 * PARAMETERS: None 67 * 68 * RETURN: None 69 * 70 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup 71 * 72 ******************************************************************************/ 73 74void acpi_ut_init_stack_ptr_trace(void) 75{ 76 acpi_size current_sp; 77 78 acpi_gbl_entry_stack_pointer = ¤t_sp; 79} 80 81/******************************************************************************* 82 * 83 * FUNCTION: acpi_ut_track_stack_ptr 84 * 85 * PARAMETERS: None 86 * 87 * RETURN: None 88 * 89 * DESCRIPTION: Save the current CPU stack pointer 90 * 91 ******************************************************************************/ 92 93void acpi_ut_track_stack_ptr(void) 94{ 95 acpi_size current_sp; 96 97 if (¤t_sp < acpi_gbl_lowest_stack_pointer) { 98 acpi_gbl_lowest_stack_pointer = ¤t_sp; 99 } 100 101 if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) { 102 acpi_gbl_deepest_nesting = acpi_gbl_nesting_level; 103 } 104} 105 106/******************************************************************************* 107 * 108 * FUNCTION: acpi_ut_trim_function_name 109 * 110 * PARAMETERS: function_name - Ascii string containing a procedure name 111 * 112 * RETURN: Updated pointer to the function name 113 * 114 * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. 115 * This allows compiler macros such as __func__ to be used 116 * with no change to the debug output. 117 * 118 ******************************************************************************/ 119 120static const char *acpi_ut_trim_function_name(const char *function_name) 121{ 122 123 /* All Function names are longer than 4 chars, check is safe */ 124 125 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) { 126 127 /* This is the case where the original source has not been modified */ 128 129 return (function_name + 4); 130 } 131 132 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) { 133 134 /* This is the case where the source has been 'linuxized' */ 135 136 return (function_name + 5); 137 } 138 139 return (function_name); 140} 141 142/******************************************************************************* 143 * 144 * FUNCTION: acpi_debug_print 145 * 146 * PARAMETERS: requested_debug_level - Requested debug print level 147 * line_number - Caller's line number (for error output) 148 * function_name - Caller's procedure name 149 * module_name - Caller's module name 150 * component_id - Caller's component ID 151 * format - Printf format field 152 * ... - Optional printf arguments 153 * 154 * RETURN: None 155 * 156 * DESCRIPTION: Print error message with prefix consisting of the module name, 157 * line number, and component ID. 158 * 159 ******************************************************************************/ 160 161void ACPI_INTERNAL_VAR_XFACE 162acpi_debug_print(u32 requested_debug_level, 163 u32 line_number, 164 const char *function_name, 165 const char *module_name, 166 u32 component_id, const char *format, ...) 167{ 168 acpi_thread_id thread_id; 169 va_list args; 170 171 /* Check if debug output enabled */ 172 173 if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) { 174 return; 175 } 176 177 /* 178 * Thread tracking and context switch notification 179 */ 180 thread_id = acpi_os_get_thread_id(); 181 if (thread_id != acpi_gbl_prev_thread_id) { 182 if (ACPI_LV_THREADS & acpi_dbg_level) { 183 acpi_os_printf 184 ("\n**** Context Switch from TID %u to TID %u ****\n\n", 185 (u32)acpi_gbl_prev_thread_id, (u32)thread_id); 186 } 187 188 acpi_gbl_prev_thread_id = thread_id; 189 acpi_gbl_nesting_level = 0; 190 } 191 192 /* 193 * Display the module name, current line number, thread ID (if requested), 194 * current procedure nesting level, and the current procedure name 195 */ 196 acpi_os_printf("%9s-%04ld ", module_name, line_number); 197 198#ifdef ACPI_APPLICATION 199 /* 200 * For acpi_exec/iASL only, emit the thread ID and nesting level. 201 * Note: nesting level is really only useful during a single-thread 202 * execution. Otherwise, multiple threads will keep resetting the 203 * level. 204 */ 205 if (ACPI_LV_THREADS & acpi_dbg_level) { 206 acpi_os_printf("[%u] ", (u32)thread_id); 207 } 208 209 acpi_os_printf("[%02ld] ", acpi_gbl_nesting_level); 210#endif 211 212 acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name)); 213 214 va_start(args, format); 215 acpi_os_vprintf(format, args); 216 va_end(args); 217} 218 219ACPI_EXPORT_SYMBOL(acpi_debug_print) 220 221/******************************************************************************* 222 * 223 * FUNCTION: acpi_debug_print_raw 224 * 225 * PARAMETERS: requested_debug_level - Requested debug print level 226 * line_number - Caller's line number 227 * function_name - Caller's procedure name 228 * module_name - Caller's module name 229 * component_id - Caller's component ID 230 * format - Printf format field 231 * ... - Optional printf arguments 232 * 233 * RETURN: None 234 * 235 * DESCRIPTION: Print message with no headers. Has same interface as 236 * debug_print so that the same macros can be used. 237 * 238 ******************************************************************************/ 239void ACPI_INTERNAL_VAR_XFACE 240acpi_debug_print_raw(u32 requested_debug_level, 241 u32 line_number, 242 const char *function_name, 243 const char *module_name, 244 u32 component_id, const char *format, ...) 245{ 246 va_list args; 247 248 /* Check if debug output enabled */ 249 250 if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) { 251 return; 252 } 253 254 va_start(args, format); 255 acpi_os_vprintf(format, args); 256 va_end(args); 257} 258 259ACPI_EXPORT_SYMBOL(acpi_debug_print_raw) 260 261/******************************************************************************* 262 * 263 * FUNCTION: acpi_ut_trace 264 * 265 * PARAMETERS: line_number - Caller's line number 266 * function_name - Caller's procedure name 267 * module_name - Caller's module name 268 * component_id - Caller's component ID 269 * 270 * RETURN: None 271 * 272 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 273 * set in debug_level 274 * 275 ******************************************************************************/ 276void 277acpi_ut_trace(u32 line_number, 278 const char *function_name, 279 const char *module_name, u32 component_id) 280{ 281 282 acpi_gbl_nesting_level++; 283 acpi_ut_track_stack_ptr(); 284 285 /* Check if enabled up-front for performance */ 286 287 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 288 acpi_debug_print(ACPI_LV_FUNCTIONS, 289 line_number, function_name, module_name, 290 component_id, "%s\n", acpi_gbl_fn_entry_str); 291 } 292} 293 294ACPI_EXPORT_SYMBOL(acpi_ut_trace) 295 296/******************************************************************************* 297 * 298 * FUNCTION: acpi_ut_trace_ptr 299 * 300 * PARAMETERS: line_number - Caller's line number 301 * function_name - Caller's procedure name 302 * module_name - Caller's module name 303 * component_id - Caller's component ID 304 * pointer - Pointer to display 305 * 306 * RETURN: None 307 * 308 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 309 * set in debug_level 310 * 311 ******************************************************************************/ 312void 313acpi_ut_trace_ptr(u32 line_number, 314 const char *function_name, 315 const char *module_name, u32 component_id, void *pointer) 316{ 317 318 acpi_gbl_nesting_level++; 319 acpi_ut_track_stack_ptr(); 320 321 /* Check if enabled up-front for performance */ 322 323 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 324 acpi_debug_print(ACPI_LV_FUNCTIONS, 325 line_number, function_name, module_name, 326 component_id, "%s %p\n", acpi_gbl_fn_entry_str, 327 pointer); 328 } 329} 330 331/******************************************************************************* 332 * 333 * FUNCTION: acpi_ut_trace_str 334 * 335 * PARAMETERS: line_number - Caller's line number 336 * function_name - Caller's procedure name 337 * module_name - Caller's module name 338 * component_id - Caller's component ID 339 * string - Additional string to display 340 * 341 * RETURN: None 342 * 343 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 344 * set in debug_level 345 * 346 ******************************************************************************/ 347 348void 349acpi_ut_trace_str(u32 line_number, 350 const char *function_name, 351 const char *module_name, u32 component_id, char *string) 352{ 353 354 acpi_gbl_nesting_level++; 355 acpi_ut_track_stack_ptr(); 356 357 /* Check if enabled up-front for performance */ 358 359 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 360 acpi_debug_print(ACPI_LV_FUNCTIONS, 361 line_number, function_name, module_name, 362 component_id, "%s %s\n", acpi_gbl_fn_entry_str, 363 string); 364 } 365} 366 367/******************************************************************************* 368 * 369 * FUNCTION: acpi_ut_trace_u32 370 * 371 * PARAMETERS: line_number - Caller's line number 372 * function_name - Caller's procedure name 373 * module_name - Caller's module name 374 * component_id - Caller's component ID 375 * integer - Integer to display 376 * 377 * RETURN: None 378 * 379 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 380 * set in debug_level 381 * 382 ******************************************************************************/ 383 384void 385acpi_ut_trace_u32(u32 line_number, 386 const char *function_name, 387 const char *module_name, u32 component_id, u32 integer) 388{ 389 390 acpi_gbl_nesting_level++; 391 acpi_ut_track_stack_ptr(); 392 393 /* Check if enabled up-front for performance */ 394 395 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 396 acpi_debug_print(ACPI_LV_FUNCTIONS, 397 line_number, function_name, module_name, 398 component_id, "%s %08X\n", 399 acpi_gbl_fn_entry_str, integer); 400 } 401} 402 403/******************************************************************************* 404 * 405 * FUNCTION: acpi_ut_exit 406 * 407 * PARAMETERS: line_number - Caller's line number 408 * function_name - Caller's procedure name 409 * module_name - Caller's module name 410 * component_id - Caller's component ID 411 * 412 * RETURN: None 413 * 414 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 415 * set in debug_level 416 * 417 ******************************************************************************/ 418 419void 420acpi_ut_exit(u32 line_number, 421 const char *function_name, 422 const char *module_name, u32 component_id) 423{ 424 425 /* Check if enabled up-front for performance */ 426 427 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 428 acpi_debug_print(ACPI_LV_FUNCTIONS, 429 line_number, function_name, module_name, 430 component_id, "%s\n", acpi_gbl_fn_exit_str); 431 } 432 433 if (acpi_gbl_nesting_level) { 434 acpi_gbl_nesting_level--; 435 } 436} 437 438ACPI_EXPORT_SYMBOL(acpi_ut_exit) 439 440/******************************************************************************* 441 * 442 * FUNCTION: acpi_ut_status_exit 443 * 444 * PARAMETERS: line_number - Caller's line number 445 * function_name - Caller's procedure name 446 * module_name - Caller's module name 447 * component_id - Caller's component ID 448 * status - Exit status code 449 * 450 * RETURN: None 451 * 452 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 453 * set in debug_level. Prints exit status also. 454 * 455 ******************************************************************************/ 456void 457acpi_ut_status_exit(u32 line_number, 458 const char *function_name, 459 const char *module_name, 460 u32 component_id, acpi_status status) 461{ 462 463 /* Check if enabled up-front for performance */ 464 465 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 466 if (ACPI_SUCCESS(status)) { 467 acpi_debug_print(ACPI_LV_FUNCTIONS, 468 line_number, function_name, 469 module_name, component_id, "%s %s\n", 470 acpi_gbl_fn_exit_str, 471 acpi_format_exception(status)); 472 } else { 473 acpi_debug_print(ACPI_LV_FUNCTIONS, 474 line_number, function_name, 475 module_name, component_id, 476 "%s ****Exception****: %s\n", 477 acpi_gbl_fn_exit_str, 478 acpi_format_exception(status)); 479 } 480 } 481 482 if (acpi_gbl_nesting_level) { 483 acpi_gbl_nesting_level--; 484 } 485} 486 487ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) 488 489/******************************************************************************* 490 * 491 * FUNCTION: acpi_ut_value_exit 492 * 493 * PARAMETERS: line_number - Caller's line number 494 * function_name - Caller's procedure name 495 * module_name - Caller's module name 496 * component_id - Caller's component ID 497 * value - Value to be printed with exit msg 498 * 499 * RETURN: None 500 * 501 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 502 * set in debug_level. Prints exit value also. 503 * 504 ******************************************************************************/ 505void 506acpi_ut_value_exit(u32 line_number, 507 const char *function_name, 508 const char *module_name, u32 component_id, u64 value) 509{ 510 511 /* Check if enabled up-front for performance */ 512 513 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 514 acpi_debug_print(ACPI_LV_FUNCTIONS, 515 line_number, function_name, module_name, 516 component_id, "%s %8.8X%8.8X\n", 517 acpi_gbl_fn_exit_str, 518 ACPI_FORMAT_UINT64(value)); 519 } 520 521 if (acpi_gbl_nesting_level) { 522 acpi_gbl_nesting_level--; 523 } 524} 525 526ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) 527 528/******************************************************************************* 529 * 530 * FUNCTION: acpi_ut_ptr_exit 531 * 532 * PARAMETERS: line_number - Caller's line number 533 * function_name - Caller's procedure name 534 * module_name - Caller's module name 535 * component_id - Caller's component ID 536 * ptr - Pointer to display 537 * 538 * RETURN: None 539 * 540 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 541 * set in debug_level. Prints exit value also. 542 * 543 ******************************************************************************/ 544void 545acpi_ut_ptr_exit(u32 line_number, 546 const char *function_name, 547 const char *module_name, u32 component_id, u8 *ptr) 548{ 549 550 /* Check if enabled up-front for performance */ 551 552 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) { 553 acpi_debug_print(ACPI_LV_FUNCTIONS, 554 line_number, function_name, module_name, 555 component_id, "%s %p\n", acpi_gbl_fn_exit_str, 556 ptr); 557 } 558 559 if (acpi_gbl_nesting_level) { 560 acpi_gbl_nesting_level--; 561 } 562} 563 564/******************************************************************************* 565 * 566 * FUNCTION: acpi_trace_point 567 * 568 * PARAMETERS: type - Trace event type 569 * begin - TRUE if before execution 570 * aml - Executed AML address 571 * pathname - Object path 572 * pointer - Pointer to the related object 573 * 574 * RETURN: None 575 * 576 * DESCRIPTION: Interpreter execution trace. 577 * 578 ******************************************************************************/ 579 580void 581acpi_trace_point(acpi_trace_event_type type, u8 begin, u8 *aml, char *pathname) 582{ 583 584 ACPI_FUNCTION_ENTRY(); 585 586 acpi_ex_trace_point(type, begin, aml, pathname); 587 588#ifdef ACPI_USE_SYSTEM_TRACER 589 acpi_os_trace_point(type, begin, aml, pathname); 590#endif 591} 592 593ACPI_EXPORT_SYMBOL(acpi_trace_point) 594#endif 595#ifdef ACPI_APPLICATION 596/******************************************************************************* 597 * 598 * FUNCTION: acpi_log_error 599 * 600 * PARAMETERS: format - Printf format field 601 * ... - Optional printf arguments 602 * 603 * RETURN: None 604 * 605 * DESCRIPTION: Print error message to the console, used by applications. 606 * 607 ******************************************************************************/ 608void ACPI_INTERNAL_VAR_XFACE acpi_log_error(const char *format, ...) 609{ 610 va_list args; 611 612 va_start(args, format); 613 (void)acpi_ut_file_vprintf(ACPI_FILE_ERR, format, args); 614 va_end(args); 615} 616 617ACPI_EXPORT_SYMBOL(acpi_log_error) 618#endif 619