| 1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 | 
|---|
| 2 | /****************************************************************************** | 
|---|
| 3 | * | 
|---|
| 4 | * Module Name: utdebug - Debug print/trace routines | 
|---|
| 5 | * | 
|---|
| 6 | * Copyright (C) 2000 - 2025, Intel Corp. | 
|---|
| 7 | * | 
|---|
| 8 | *****************************************************************************/ | 
|---|
| 9 |  | 
|---|
| 10 | #define EXPORT_ACPI_INTERFACES | 
|---|
| 11 |  | 
|---|
| 12 | #include <acpi/acpi.h> | 
|---|
| 13 | #include "accommon.h" | 
|---|
| 14 | #include "acinterp.h" | 
|---|
| 15 |  | 
|---|
| 16 | #define _COMPONENT          ACPI_UTILITIES | 
|---|
| 17 | ACPI_MODULE_NAME( "utdebug") | 
|---|
| 18 |  | 
|---|
| 19 | #ifdef ACPI_DEBUG_OUTPUT | 
|---|
| 20 | static acpi_thread_id acpi_gbl_previous_thread_id = (acpi_thread_id) 0xFFFFFFFF; | 
|---|
| 21 | static const char *acpi_gbl_function_entry_prefix = "----Entry"; | 
|---|
| 22 | static const char *acpi_gbl_function_exit_prefix = "----Exit-"; | 
|---|
| 23 |  | 
|---|
| 24 | /******************************************************************************* | 
|---|
| 25 | * | 
|---|
| 26 | * FUNCTION:    acpi_ut_init_stack_ptr_trace | 
|---|
| 27 | * | 
|---|
| 28 | * PARAMETERS:  None | 
|---|
| 29 | * | 
|---|
| 30 | * RETURN:      None | 
|---|
| 31 | * | 
|---|
| 32 | * DESCRIPTION: Save the current CPU stack pointer at subsystem startup | 
|---|
| 33 | * | 
|---|
| 34 | ******************************************************************************/ | 
|---|
| 35 |  | 
|---|
| 36 | void acpi_ut_init_stack_ptr_trace(void) | 
|---|
| 37 | { | 
|---|
| 38 | acpi_size current_sp; | 
|---|
| 39 |  | 
|---|
| 40 | #pragma GCC diagnostic push | 
|---|
| 41 | #if defined(__GNUC__) && __GNUC__ >= 12 | 
|---|
| 42 | #pragma GCC diagnostic ignored "-Wdangling-pointer=" | 
|---|
| 43 | #endif | 
|---|
| 44 | acpi_gbl_entry_stack_pointer = ¤t_sp; | 
|---|
| 45 | #pragma GCC diagnostic pop | 
|---|
| 46 | } | 
|---|
| 47 |  | 
|---|
| 48 | /******************************************************************************* | 
|---|
| 49 | * | 
|---|
| 50 | * FUNCTION:    acpi_ut_track_stack_ptr | 
|---|
| 51 | * | 
|---|
| 52 | * PARAMETERS:  None | 
|---|
| 53 | * | 
|---|
| 54 | * RETURN:      None | 
|---|
| 55 | * | 
|---|
| 56 | * DESCRIPTION: Save the current CPU stack pointer | 
|---|
| 57 | * | 
|---|
| 58 | ******************************************************************************/ | 
|---|
| 59 |  | 
|---|
| 60 | void 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 push | 
|---|
| 66 | #if defined(__GNUC__) && __GNUC__ >= 12 | 
|---|
| 67 | #pragma GCC diagnostic ignored "-Wdangling-pointer=" | 
|---|
| 68 | #endif | 
|---|
| 69 | acpi_gbl_lowest_stack_pointer = ¤t_sp; | 
|---|
| 70 | #pragma GCC diagnostic pop | 
|---|
| 71 | } | 
|---|
| 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_name | 
|---|
| 81 | * | 
|---|
| 82 | * PARAMETERS:  function_name       - Ascii string containing a procedure name | 
|---|
| 83 | * | 
|---|
| 84 | * RETURN:      Updated pointer to the function name | 
|---|
| 85 | * | 
|---|
| 86 | * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. | 
|---|
| 87 | *              This allows compiler macros such as __func__ to be used | 
|---|
| 88 | *              with no change to the debug output. | 
|---|
| 89 | * | 
|---|
| 90 | ******************************************************************************/ | 
|---|
| 91 |  | 
|---|
| 92 | static 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_print | 
|---|
| 117 | * | 
|---|
| 118 | * PARAMETERS:  requested_debug_level - Requested debug print level | 
|---|
| 119 | *              line_number         - Caller's line number (for error output) | 
|---|
| 120 | *              function_name       - Caller's procedure name | 
|---|
| 121 | *              module_name         - Caller's module name | 
|---|
| 122 | *              component_id        - Caller's component ID | 
|---|
| 123 | *              format              - Printf format field | 
|---|
| 124 | *              ...                 - Optional printf arguments | 
|---|
| 125 | * | 
|---|
| 126 | * RETURN:      None | 
|---|
| 127 | * | 
|---|
| 128 | * DESCRIPTION: Print error message with prefix consisting of the module name, | 
|---|
| 129 | *              line number, and component ID. | 
|---|
| 130 | * | 
|---|
| 131 | ******************************************************************************/ | 
|---|
| 132 |  | 
|---|
| 133 | void ACPI_INTERNAL_VAR_XFACE | 
|---|
| 134 | acpi_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_APPLICATION | 
|---|
| 143 | int fill_count; | 
|---|
| 144 | #endif | 
|---|
| 145 |  | 
|---|
| 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 notification | 
|---|
| 154 | */ | 
|---|
| 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_printf | 
|---|
| 159 | (format: "\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 name | 
|---|
| 170 | */ | 
|---|
| 171 | acpi_os_printf(format: "%9s-%04d ", module_name, line_number); | 
|---|
| 172 |  | 
|---|
| 173 | #ifdef ACPI_APPLICATION | 
|---|
| 174 | /* | 
|---|
| 175 | * For acpi_exec/iASL only, emit the thread ID and nesting level. | 
|---|
| 176 | * Note: nesting level is really only useful during a single-thread | 
|---|
| 177 | * execution. Otherwise, multiple threads will keep resetting the | 
|---|
| 178 | * 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 | #else | 
|---|
| 197 | acpi_os_printf(format: "%-22.22s: ", acpi_ut_trim_function_name(function_name)); | 
|---|
| 198 | #endif | 
|---|
| 199 |  | 
|---|
| 200 | va_start(args, format); | 
|---|
| 201 | acpi_os_vprintf(format, args); | 
|---|
| 202 | va_end(args); | 
|---|
| 203 | } | 
|---|
| 204 |  | 
|---|
| 205 | ACPI_EXPORT_SYMBOL(acpi_debug_print) | 
|---|
| 206 |  | 
|---|
| 207 | /******************************************************************************* | 
|---|
| 208 | * | 
|---|
| 209 | * FUNCTION:    acpi_debug_print_raw | 
|---|
| 210 | * | 
|---|
| 211 | * PARAMETERS:  requested_debug_level - Requested debug print level | 
|---|
| 212 | *              line_number         - Caller's line number | 
|---|
| 213 | *              function_name       - Caller's procedure name | 
|---|
| 214 | *              module_name         - Caller's module name | 
|---|
| 215 | *              component_id        - Caller's component ID | 
|---|
| 216 | *              format              - Printf format field | 
|---|
| 217 | *              ...                 - Optional printf arguments | 
|---|
| 218 | * | 
|---|
| 219 | * RETURN:      None | 
|---|
| 220 | * | 
|---|
| 221 | * DESCRIPTION: Print message with no headers. Has same interface as | 
|---|
| 222 | *              debug_print so that the same macros can be used. | 
|---|
| 223 | * | 
|---|
| 224 | ******************************************************************************/ | 
|---|
| 225 | void ACPI_INTERNAL_VAR_XFACE | 
|---|
| 226 | acpi_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 |  | 
|---|
| 245 | ACPI_EXPORT_SYMBOL(acpi_debug_print_raw) | 
|---|
| 246 |  | 
|---|
| 247 | /******************************************************************************* | 
|---|
| 248 | * | 
|---|
| 249 | * FUNCTION:    acpi_ut_trace | 
|---|
| 250 | * | 
|---|
| 251 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 252 | *              function_name       - Caller's procedure name | 
|---|
| 253 | *              module_name         - Caller's module name | 
|---|
| 254 | *              component_id        - Caller's component ID | 
|---|
| 255 | * | 
|---|
| 256 | * RETURN:      None | 
|---|
| 257 | * | 
|---|
| 258 | * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 259 | *              set in debug_level | 
|---|
| 260 | * | 
|---|
| 261 | ******************************************************************************/ | 
|---|
| 262 | void | 
|---|
| 263 | acpi_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 |  | 
|---|
| 281 | ACPI_EXPORT_SYMBOL(acpi_ut_trace) | 
|---|
| 282 |  | 
|---|
| 283 | /******************************************************************************* | 
|---|
| 284 | * | 
|---|
| 285 | * FUNCTION:    acpi_ut_trace_ptr | 
|---|
| 286 | * | 
|---|
| 287 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 288 | *              function_name       - Caller's procedure name | 
|---|
| 289 | *              module_name         - Caller's module name | 
|---|
| 290 | *              component_id        - Caller's component ID | 
|---|
| 291 | *              pointer             - Pointer to display | 
|---|
| 292 | * | 
|---|
| 293 | * RETURN:      None | 
|---|
| 294 | * | 
|---|
| 295 | * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 296 | *              set in debug_level | 
|---|
| 297 | * | 
|---|
| 298 | ******************************************************************************/ | 
|---|
| 299 | void | 
|---|
| 300 | acpi_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_str | 
|---|
| 322 | * | 
|---|
| 323 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 324 | *              function_name       - Caller's procedure name | 
|---|
| 325 | *              module_name         - Caller's module name | 
|---|
| 326 | *              component_id        - Caller's component ID | 
|---|
| 327 | *              string              - Additional string to display | 
|---|
| 328 | * | 
|---|
| 329 | * RETURN:      None | 
|---|
| 330 | * | 
|---|
| 331 | * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 332 | *              set in debug_level | 
|---|
| 333 | * | 
|---|
| 334 | ******************************************************************************/ | 
|---|
| 335 |  | 
|---|
| 336 | void | 
|---|
| 337 | acpi_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_u32 | 
|---|
| 358 | * | 
|---|
| 359 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 360 | *              function_name       - Caller's procedure name | 
|---|
| 361 | *              module_name         - Caller's module name | 
|---|
| 362 | *              component_id        - Caller's component ID | 
|---|
| 363 | *              integer             - Integer to display | 
|---|
| 364 | * | 
|---|
| 365 | * RETURN:      None | 
|---|
| 366 | * | 
|---|
| 367 | * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 368 | *              set in debug_level | 
|---|
| 369 | * | 
|---|
| 370 | ******************************************************************************/ | 
|---|
| 371 |  | 
|---|
| 372 | void | 
|---|
| 373 | acpi_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_exit | 
|---|
| 394 | * | 
|---|
| 395 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 396 | *              function_name       - Caller's procedure name | 
|---|
| 397 | *              module_name         - Caller's module name | 
|---|
| 398 | *              component_id        - Caller's component ID | 
|---|
| 399 | * | 
|---|
| 400 | * RETURN:      None | 
|---|
| 401 | * | 
|---|
| 402 | * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 403 | *              set in debug_level | 
|---|
| 404 | * | 
|---|
| 405 | ******************************************************************************/ | 
|---|
| 406 |  | 
|---|
| 407 | void | 
|---|
| 408 | acpi_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 |  | 
|---|
| 427 | ACPI_EXPORT_SYMBOL(acpi_ut_exit) | 
|---|
| 428 |  | 
|---|
| 429 | /******************************************************************************* | 
|---|
| 430 | * | 
|---|
| 431 | * FUNCTION:    acpi_ut_status_exit | 
|---|
| 432 | * | 
|---|
| 433 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 434 | *              function_name       - Caller's procedure name | 
|---|
| 435 | *              module_name         - Caller's module name | 
|---|
| 436 | *              component_id        - Caller's component ID | 
|---|
| 437 | *              status              - Exit status code | 
|---|
| 438 | * | 
|---|
| 439 | * RETURN:      None | 
|---|
| 440 | * | 
|---|
| 441 | * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 442 | *              set in debug_level. Prints exit status also. | 
|---|
| 443 | * | 
|---|
| 444 | ******************************************************************************/ | 
|---|
| 445 | void | 
|---|
| 446 | acpi_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(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(exception: status)); | 
|---|
| 468 | } | 
|---|
| 469 | } | 
|---|
| 470 |  | 
|---|
| 471 | if (acpi_gbl_nesting_level) { | 
|---|
| 472 | acpi_gbl_nesting_level--; | 
|---|
| 473 | } | 
|---|
| 474 | } | 
|---|
| 475 |  | 
|---|
| 476 | ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) | 
|---|
| 477 |  | 
|---|
| 478 | /******************************************************************************* | 
|---|
| 479 | * | 
|---|
| 480 | * FUNCTION:    acpi_ut_value_exit | 
|---|
| 481 | * | 
|---|
| 482 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 483 | *              function_name       - Caller's procedure name | 
|---|
| 484 | *              module_name         - Caller's module name | 
|---|
| 485 | *              component_id        - Caller's component ID | 
|---|
| 486 | *              value               - Value to be printed with exit msg | 
|---|
| 487 | * | 
|---|
| 488 | * RETURN:      None | 
|---|
| 489 | * | 
|---|
| 490 | * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 491 | *              set in debug_level. Prints exit value also. | 
|---|
| 492 | * | 
|---|
| 493 | ******************************************************************************/ | 
|---|
| 494 | void | 
|---|
| 495 | acpi_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 |  | 
|---|
| 515 | ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) | 
|---|
| 516 |  | 
|---|
| 517 | /******************************************************************************* | 
|---|
| 518 | * | 
|---|
| 519 | * FUNCTION:    acpi_ut_ptr_exit | 
|---|
| 520 | * | 
|---|
| 521 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 522 | *              function_name       - Caller's procedure name | 
|---|
| 523 | *              module_name         - Caller's module name | 
|---|
| 524 | *              component_id        - Caller's component ID | 
|---|
| 525 | *              ptr                 - Pointer to display | 
|---|
| 526 | * | 
|---|
| 527 | * RETURN:      None | 
|---|
| 528 | * | 
|---|
| 529 | * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 530 | *              set in debug_level. Prints exit value also. | 
|---|
| 531 | * | 
|---|
| 532 | ******************************************************************************/ | 
|---|
| 533 | void | 
|---|
| 534 | acpi_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_exit | 
|---|
| 556 | * | 
|---|
| 557 | * PARAMETERS:  line_number         - Caller's line number | 
|---|
| 558 | *              function_name       - Caller's procedure name | 
|---|
| 559 | *              module_name         - Caller's module name | 
|---|
| 560 | *              component_id        - Caller's component ID | 
|---|
| 561 | *              string              - String to display | 
|---|
| 562 | * | 
|---|
| 563 | * RETURN:      None | 
|---|
| 564 | * | 
|---|
| 565 | * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is | 
|---|
| 566 | *              set in debug_level. Prints exit value also. | 
|---|
| 567 | * | 
|---|
| 568 | ******************************************************************************/ | 
|---|
| 569 |  | 
|---|
| 570 | void | 
|---|
| 571 | acpi_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_point | 
|---|
| 593 | * | 
|---|
| 594 | * PARAMETERS:  type                - Trace event type | 
|---|
| 595 | *              begin               - TRUE if before execution | 
|---|
| 596 | *              aml                 - Executed AML address | 
|---|
| 597 | *              pathname            - Object path | 
|---|
| 598 | *              pointer             - Pointer to the related object | 
|---|
| 599 | * | 
|---|
| 600 | * RETURN:      None | 
|---|
| 601 | * | 
|---|
| 602 | * DESCRIPTION: Interpreter execution trace. | 
|---|
| 603 | * | 
|---|
| 604 | ******************************************************************************/ | 
|---|
| 605 |  | 
|---|
| 606 | void | 
|---|
| 607 | acpi_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_TRACER | 
|---|
| 615 | acpi_os_trace_point(type, begin, aml, pathname); | 
|---|
| 616 | #endif | 
|---|
| 617 | } | 
|---|
| 618 |  | 
|---|
| 619 | ACPI_EXPORT_SYMBOL(acpi_trace_point) | 
|---|
| 620 |  | 
|---|
| 621 | #endif | 
|---|
| 622 |  | 
|---|