brintos

brintos / linux-shallow public Read only

0
0
Text · 18.1 KiB · 3d71bd9 Raw
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 = &current_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 (&current_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 = &current_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