622 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: utdebug - Debug print/trace routines5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#define EXPORT_ACPI_INTERFACES11 12#include <acpi/acpi.h>13#include "accommon.h"14#include "acinterp.h"15 16#define _COMPONENT ACPI_UTILITIES17ACPI_MODULE_NAME("utdebug")18 19#ifdef ACPI_DEBUG_OUTPUT20static acpi_thread_id acpi_gbl_previous_thread_id = (acpi_thread_id) 0xFFFFFFFF;21static const char *acpi_gbl_function_entry_prefix = "----Entry";22static const char *acpi_gbl_function_exit_prefix = "----Exit-";23 24/*******************************************************************************25 *26 * FUNCTION: acpi_ut_init_stack_ptr_trace27 *28 * PARAMETERS: None29 *30 * RETURN: None31 *32 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup33 *34 ******************************************************************************/35 36void acpi_ut_init_stack_ptr_trace(void)37{38 acpi_size current_sp;39 40#pragma GCC diagnostic push41#if defined(__GNUC__) && __GNUC__ >= 1242#pragma GCC diagnostic ignored "-Wdangling-pointer="43#endif44 acpi_gbl_entry_stack_pointer = ¤t_sp;45#pragma GCC diagnostic pop46}47 48/*******************************************************************************49 *50 * FUNCTION: acpi_ut_track_stack_ptr51 *52 * PARAMETERS: None53 *54 * RETURN: None55 *56 * DESCRIPTION: Save the current CPU stack pointer57 *58 ******************************************************************************/59 60void acpi_ut_track_stack_ptr(void)61{62 acpi_size current_sp;63 64 if (¤t_sp < acpi_gbl_lowest_stack_pointer) {65#pragma GCC diagnostic push66#if defined(__GNUC__) && __GNUC__ >= 1267#pragma GCC diagnostic ignored "-Wdangling-pointer="68#endif69 acpi_gbl_lowest_stack_pointer = ¤t_sp;70#pragma GCC diagnostic pop71 }72 73 if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {74 acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;75 }76}77 78/*******************************************************************************79 *80 * FUNCTION: acpi_ut_trim_function_name81 *82 * PARAMETERS: function_name - Ascii string containing a procedure name83 *84 * RETURN: Updated pointer to the function name85 *86 * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.87 * This allows compiler macros such as __func__ to be used88 * with no change to the debug output.89 *90 ******************************************************************************/91 92static const char *acpi_ut_trim_function_name(const char *function_name)93{94 95 /* All Function names are longer than 4 chars, check is safe */96 97 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {98 99 /* This is the case where the original source has not been modified */100 101 return (function_name + 4);102 }103 104 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {105 106 /* This is the case where the source has been 'linuxized' */107 108 return (function_name + 5);109 }110 111 return (function_name);112}113 114/*******************************************************************************115 *116 * FUNCTION: acpi_debug_print117 *118 * PARAMETERS: requested_debug_level - Requested debug print level119 * line_number - Caller's line number (for error output)120 * function_name - Caller's procedure name121 * module_name - Caller's module name122 * component_id - Caller's component ID123 * format - Printf format field124 * ... - Optional printf arguments125 *126 * RETURN: None127 *128 * DESCRIPTION: Print error message with prefix consisting of the module name,129 * line number, and component ID.130 *131 ******************************************************************************/132 133void ACPI_INTERNAL_VAR_XFACE134acpi_debug_print(u32 requested_debug_level,135 u32 line_number,136 const char *function_name,137 const char *module_name,138 u32 component_id, const char *format, ...)139{140 acpi_thread_id thread_id;141 va_list args;142#ifdef ACPI_APPLICATION143 int fill_count;144#endif145 146 /* Check if debug output enabled */147 148 if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {149 return;150 }151 152 /*153 * Thread tracking and context switch notification154 */155 thread_id = acpi_os_get_thread_id();156 if (thread_id != acpi_gbl_previous_thread_id) {157 if (ACPI_LV_THREADS & acpi_dbg_level) {158 acpi_os_printf159 ("\n**** Context Switch from TID %u to TID %u ****\n\n",160 (u32)acpi_gbl_previous_thread_id, (u32)thread_id);161 }162 163 acpi_gbl_previous_thread_id = thread_id;164 acpi_gbl_nesting_level = 0;165 }166 167 /*168 * Display the module name, current line number, thread ID (if requested),169 * current procedure nesting level, and the current procedure name170 */171 acpi_os_printf("%9s-%04d ", module_name, line_number);172 173#ifdef ACPI_APPLICATION174 /*175 * For acpi_exec/iASL only, emit the thread ID and nesting level.176 * Note: nesting level is really only useful during a single-thread177 * execution. Otherwise, multiple threads will keep resetting the178 * level.179 */180 if (ACPI_LV_THREADS & acpi_dbg_level) {181 acpi_os_printf("[%u] ", (u32)thread_id);182 }183 184 fill_count = 48 - acpi_gbl_nesting_level -185 strlen(acpi_ut_trim_function_name(function_name));186 if (fill_count < 0) {187 fill_count = 0;188 }189 190 acpi_os_printf("[%02d] %*s",191 acpi_gbl_nesting_level, acpi_gbl_nesting_level + 1, " ");192 acpi_os_printf("%s%*s: ",193 acpi_ut_trim_function_name(function_name), fill_count,194 " ");195 196#else197 acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name));198#endif199 200 va_start(args, format);201 acpi_os_vprintf(format, args);202 va_end(args);203}204 205ACPI_EXPORT_SYMBOL(acpi_debug_print)206 207/*******************************************************************************208 *209 * FUNCTION: acpi_debug_print_raw210 *211 * PARAMETERS: requested_debug_level - Requested debug print level212 * line_number - Caller's line number213 * function_name - Caller's procedure name214 * module_name - Caller's module name215 * component_id - Caller's component ID216 * format - Printf format field217 * ... - Optional printf arguments218 *219 * RETURN: None220 *221 * DESCRIPTION: Print message with no headers. Has same interface as222 * debug_print so that the same macros can be used.223 *224 ******************************************************************************/225void ACPI_INTERNAL_VAR_XFACE226acpi_debug_print_raw(u32 requested_debug_level,227 u32 line_number,228 const char *function_name,229 const char *module_name,230 u32 component_id, const char *format, ...)231{232 va_list args;233 234 /* Check if debug output enabled */235 236 if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {237 return;238 }239 240 va_start(args, format);241 acpi_os_vprintf(format, args);242 va_end(args);243}244 245ACPI_EXPORT_SYMBOL(acpi_debug_print_raw)246 247/*******************************************************************************248 *249 * FUNCTION: acpi_ut_trace250 *251 * PARAMETERS: line_number - Caller's line number252 * function_name - Caller's procedure name253 * module_name - Caller's module name254 * component_id - Caller's component ID255 *256 * RETURN: None257 *258 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is259 * set in debug_level260 *261 ******************************************************************************/262void263acpi_ut_trace(u32 line_number,264 const char *function_name,265 const char *module_name, u32 component_id)266{267 268 acpi_gbl_nesting_level++;269 acpi_ut_track_stack_ptr();270 271 /* Check if enabled up-front for performance */272 273 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {274 acpi_debug_print(ACPI_LV_FUNCTIONS,275 line_number, function_name, module_name,276 component_id, "%s\n",277 acpi_gbl_function_entry_prefix);278 }279}280 281ACPI_EXPORT_SYMBOL(acpi_ut_trace)282 283/*******************************************************************************284 *285 * FUNCTION: acpi_ut_trace_ptr286 *287 * PARAMETERS: line_number - Caller's line number288 * function_name - Caller's procedure name289 * module_name - Caller's module name290 * component_id - Caller's component ID291 * pointer - Pointer to display292 *293 * RETURN: None294 *295 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is296 * set in debug_level297 *298 ******************************************************************************/299void300acpi_ut_trace_ptr(u32 line_number,301 const char *function_name,302 const char *module_name,303 u32 component_id, const void *pointer)304{305 306 acpi_gbl_nesting_level++;307 acpi_ut_track_stack_ptr();308 309 /* Check if enabled up-front for performance */310 311 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {312 acpi_debug_print(ACPI_LV_FUNCTIONS,313 line_number, function_name, module_name,314 component_id, "%s %p\n",315 acpi_gbl_function_entry_prefix, pointer);316 }317}318 319/*******************************************************************************320 *321 * FUNCTION: acpi_ut_trace_str322 *323 * PARAMETERS: line_number - Caller's line number324 * function_name - Caller's procedure name325 * module_name - Caller's module name326 * component_id - Caller's component ID327 * string - Additional string to display328 *329 * RETURN: None330 *331 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is332 * set in debug_level333 *334 ******************************************************************************/335 336void337acpi_ut_trace_str(u32 line_number,338 const char *function_name,339 const char *module_name, u32 component_id, const char *string)340{341 342 acpi_gbl_nesting_level++;343 acpi_ut_track_stack_ptr();344 345 /* Check if enabled up-front for performance */346 347 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {348 acpi_debug_print(ACPI_LV_FUNCTIONS,349 line_number, function_name, module_name,350 component_id, "%s %s\n",351 acpi_gbl_function_entry_prefix, string);352 }353}354 355/*******************************************************************************356 *357 * FUNCTION: acpi_ut_trace_u32358 *359 * PARAMETERS: line_number - Caller's line number360 * function_name - Caller's procedure name361 * module_name - Caller's module name362 * component_id - Caller's component ID363 * integer - Integer to display364 *365 * RETURN: None366 *367 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is368 * set in debug_level369 *370 ******************************************************************************/371 372void373acpi_ut_trace_u32(u32 line_number,374 const char *function_name,375 const char *module_name, u32 component_id, u32 integer)376{377 378 acpi_gbl_nesting_level++;379 acpi_ut_track_stack_ptr();380 381 /* Check if enabled up-front for performance */382 383 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {384 acpi_debug_print(ACPI_LV_FUNCTIONS,385 line_number, function_name, module_name,386 component_id, "%s %08X\n",387 acpi_gbl_function_entry_prefix, integer);388 }389}390 391/*******************************************************************************392 *393 * FUNCTION: acpi_ut_exit394 *395 * PARAMETERS: line_number - Caller's line number396 * function_name - Caller's procedure name397 * module_name - Caller's module name398 * component_id - Caller's component ID399 *400 * RETURN: None401 *402 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is403 * set in debug_level404 *405 ******************************************************************************/406 407void408acpi_ut_exit(u32 line_number,409 const char *function_name,410 const char *module_name, u32 component_id)411{412 413 /* Check if enabled up-front for performance */414 415 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {416 acpi_debug_print(ACPI_LV_FUNCTIONS,417 line_number, function_name, module_name,418 component_id, "%s\n",419 acpi_gbl_function_exit_prefix);420 }421 422 if (acpi_gbl_nesting_level) {423 acpi_gbl_nesting_level--;424 }425}426 427ACPI_EXPORT_SYMBOL(acpi_ut_exit)428 429/*******************************************************************************430 *431 * FUNCTION: acpi_ut_status_exit432 *433 * PARAMETERS: line_number - Caller's line number434 * function_name - Caller's procedure name435 * module_name - Caller's module name436 * component_id - Caller's component ID437 * status - Exit status code438 *439 * RETURN: None440 *441 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is442 * set in debug_level. Prints exit status also.443 *444 ******************************************************************************/445void446acpi_ut_status_exit(u32 line_number,447 const char *function_name,448 const char *module_name,449 u32 component_id, acpi_status status)450{451 452 /* Check if enabled up-front for performance */453 454 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {455 if (ACPI_SUCCESS(status)) {456 acpi_debug_print(ACPI_LV_FUNCTIONS,457 line_number, function_name,458 module_name, component_id, "%s %s\n",459 acpi_gbl_function_exit_prefix,460 acpi_format_exception(status));461 } else {462 acpi_debug_print(ACPI_LV_FUNCTIONS,463 line_number, function_name,464 module_name, component_id,465 "%s ****Exception****: %s\n",466 acpi_gbl_function_exit_prefix,467 acpi_format_exception(status));468 }469 }470 471 if (acpi_gbl_nesting_level) {472 acpi_gbl_nesting_level--;473 }474}475 476ACPI_EXPORT_SYMBOL(acpi_ut_status_exit)477 478/*******************************************************************************479 *480 * FUNCTION: acpi_ut_value_exit481 *482 * PARAMETERS: line_number - Caller's line number483 * function_name - Caller's procedure name484 * module_name - Caller's module name485 * component_id - Caller's component ID486 * value - Value to be printed with exit msg487 *488 * RETURN: None489 *490 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is491 * set in debug_level. Prints exit value also.492 *493 ******************************************************************************/494void495acpi_ut_value_exit(u32 line_number,496 const char *function_name,497 const char *module_name, u32 component_id, u64 value)498{499 500 /* Check if enabled up-front for performance */501 502 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {503 acpi_debug_print(ACPI_LV_FUNCTIONS,504 line_number, function_name, module_name,505 component_id, "%s %8.8X%8.8X\n",506 acpi_gbl_function_exit_prefix,507 ACPI_FORMAT_UINT64(value));508 }509 510 if (acpi_gbl_nesting_level) {511 acpi_gbl_nesting_level--;512 }513}514 515ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)516 517/*******************************************************************************518 *519 * FUNCTION: acpi_ut_ptr_exit520 *521 * PARAMETERS: line_number - Caller's line number522 * function_name - Caller's procedure name523 * module_name - Caller's module name524 * component_id - Caller's component ID525 * ptr - Pointer to display526 *527 * RETURN: None528 *529 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is530 * set in debug_level. Prints exit value also.531 *532 ******************************************************************************/533void534acpi_ut_ptr_exit(u32 line_number,535 const char *function_name,536 const char *module_name, u32 component_id, u8 *ptr)537{538 539 /* Check if enabled up-front for performance */540 541 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {542 acpi_debug_print(ACPI_LV_FUNCTIONS,543 line_number, function_name, module_name,544 component_id, "%s %p\n",545 acpi_gbl_function_exit_prefix, ptr);546 }547 548 if (acpi_gbl_nesting_level) {549 acpi_gbl_nesting_level--;550 }551}552 553/*******************************************************************************554 *555 * FUNCTION: acpi_ut_str_exit556 *557 * PARAMETERS: line_number - Caller's line number558 * function_name - Caller's procedure name559 * module_name - Caller's module name560 * component_id - Caller's component ID561 * string - String to display562 *563 * RETURN: None564 *565 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is566 * set in debug_level. Prints exit value also.567 *568 ******************************************************************************/569 570void571acpi_ut_str_exit(u32 line_number,572 const char *function_name,573 const char *module_name, u32 component_id, const char *string)574{575 576 /* Check if enabled up-front for performance */577 578 if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {579 acpi_debug_print(ACPI_LV_FUNCTIONS,580 line_number, function_name, module_name,581 component_id, "%s %s\n",582 acpi_gbl_function_exit_prefix, string);583 }584 585 if (acpi_gbl_nesting_level) {586 acpi_gbl_nesting_level--;587 }588}589 590/*******************************************************************************591 *592 * FUNCTION: acpi_trace_point593 *594 * PARAMETERS: type - Trace event type595 * begin - TRUE if before execution596 * aml - Executed AML address597 * pathname - Object path598 * pointer - Pointer to the related object599 *600 * RETURN: None601 *602 * DESCRIPTION: Interpreter execution trace.603 *604 ******************************************************************************/605 606void607acpi_trace_point(acpi_trace_event_type type, u8 begin, u8 *aml, char *pathname)608{609 610 ACPI_FUNCTION_ENTRY();611 612 acpi_ex_trace_point(type, begin, aml, pathname);613 614#ifdef ACPI_USE_SYSTEM_TRACER615 acpi_os_trace_point(type, begin, aml, pathname);616#endif617}618 619ACPI_EXPORT_SYMBOL(acpi_trace_point)620 621#endif622