162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: utdebug - Debug print/trace routines
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci *****************************************************************************/
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define EXPORT_ACPI_INTERFACES
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <acpi/acpi.h>
1362306a36Sopenharmony_ci#include "accommon.h"
1462306a36Sopenharmony_ci#include "acinterp.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define _COMPONENT          ACPI_UTILITIES
1762306a36Sopenharmony_ciACPI_MODULE_NAME("utdebug")
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifdef ACPI_DEBUG_OUTPUT
2062306a36Sopenharmony_cistatic acpi_thread_id acpi_gbl_previous_thread_id = (acpi_thread_id) 0xFFFFFFFF;
2162306a36Sopenharmony_cistatic const char *acpi_gbl_function_entry_prefix = "----Entry";
2262306a36Sopenharmony_cistatic const char *acpi_gbl_function_exit_prefix = "----Exit-";
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/*******************************************************************************
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * FUNCTION:    acpi_ut_init_stack_ptr_trace
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * PARAMETERS:  None
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * RETURN:      None
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci ******************************************************************************/
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_civoid acpi_ut_init_stack_ptr_trace(void)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	acpi_size current_sp;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#pragma GCC diagnostic push
4162306a36Sopenharmony_ci#if defined(__GNUC__) && __GNUC__ >= 12
4262306a36Sopenharmony_ci#pragma GCC diagnostic ignored "-Wdangling-pointer="
4362306a36Sopenharmony_ci#endif
4462306a36Sopenharmony_ci	acpi_gbl_entry_stack_pointer = &current_sp;
4562306a36Sopenharmony_ci#pragma GCC diagnostic pop
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*******************************************************************************
4962306a36Sopenharmony_ci *
5062306a36Sopenharmony_ci * FUNCTION:    acpi_ut_track_stack_ptr
5162306a36Sopenharmony_ci *
5262306a36Sopenharmony_ci * PARAMETERS:  None
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci * RETURN:      None
5562306a36Sopenharmony_ci *
5662306a36Sopenharmony_ci * DESCRIPTION: Save the current CPU stack pointer
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci ******************************************************************************/
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_civoid acpi_ut_track_stack_ptr(void)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	acpi_size current_sp;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	if (&current_sp < acpi_gbl_lowest_stack_pointer) {
6562306a36Sopenharmony_ci		acpi_gbl_lowest_stack_pointer = &current_sp;
6662306a36Sopenharmony_ci	}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {
6962306a36Sopenharmony_ci		acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;
7062306a36Sopenharmony_ci	}
7162306a36Sopenharmony_ci}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*******************************************************************************
7462306a36Sopenharmony_ci *
7562306a36Sopenharmony_ci * FUNCTION:    acpi_ut_trim_function_name
7662306a36Sopenharmony_ci *
7762306a36Sopenharmony_ci * PARAMETERS:  function_name       - Ascii string containing a procedure name
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci * RETURN:      Updated pointer to the function name
8062306a36Sopenharmony_ci *
8162306a36Sopenharmony_ci * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
8262306a36Sopenharmony_ci *              This allows compiler macros such as __func__ to be used
8362306a36Sopenharmony_ci *              with no change to the debug output.
8462306a36Sopenharmony_ci *
8562306a36Sopenharmony_ci ******************************************************************************/
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic const char *acpi_ut_trim_function_name(const char *function_name)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/* All Function names are longer than 4 chars, check is safe */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci		/* This is the case where the original source has not been modified */
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci		return (function_name + 4);
9762306a36Sopenharmony_ci	}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci		/* This is the case where the source has been 'linuxized' */
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci		return (function_name + 5);
10462306a36Sopenharmony_ci	}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	return (function_name);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/*******************************************************************************
11062306a36Sopenharmony_ci *
11162306a36Sopenharmony_ci * FUNCTION:    acpi_debug_print
11262306a36Sopenharmony_ci *
11362306a36Sopenharmony_ci * PARAMETERS:  requested_debug_level - Requested debug print level
11462306a36Sopenharmony_ci *              line_number         - Caller's line number (for error output)
11562306a36Sopenharmony_ci *              function_name       - Caller's procedure name
11662306a36Sopenharmony_ci *              module_name         - Caller's module name
11762306a36Sopenharmony_ci *              component_id        - Caller's component ID
11862306a36Sopenharmony_ci *              format              - Printf format field
11962306a36Sopenharmony_ci *              ...                 - Optional printf arguments
12062306a36Sopenharmony_ci *
12162306a36Sopenharmony_ci * RETURN:      None
12262306a36Sopenharmony_ci *
12362306a36Sopenharmony_ci * DESCRIPTION: Print error message with prefix consisting of the module name,
12462306a36Sopenharmony_ci *              line number, and component ID.
12562306a36Sopenharmony_ci *
12662306a36Sopenharmony_ci ******************************************************************************/
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE
12962306a36Sopenharmony_ciacpi_debug_print(u32 requested_debug_level,
13062306a36Sopenharmony_ci		 u32 line_number,
13162306a36Sopenharmony_ci		 const char *function_name,
13262306a36Sopenharmony_ci		 const char *module_name,
13362306a36Sopenharmony_ci		 u32 component_id, const char *format, ...)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	acpi_thread_id thread_id;
13662306a36Sopenharmony_ci	va_list args;
13762306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
13862306a36Sopenharmony_ci	int fill_count;
13962306a36Sopenharmony_ci#endif
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	/* Check if debug output enabled */
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
14462306a36Sopenharmony_ci		return;
14562306a36Sopenharmony_ci	}
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	/*
14862306a36Sopenharmony_ci	 * Thread tracking and context switch notification
14962306a36Sopenharmony_ci	 */
15062306a36Sopenharmony_ci	thread_id = acpi_os_get_thread_id();
15162306a36Sopenharmony_ci	if (thread_id != acpi_gbl_previous_thread_id) {
15262306a36Sopenharmony_ci		if (ACPI_LV_THREADS & acpi_dbg_level) {
15362306a36Sopenharmony_ci			acpi_os_printf
15462306a36Sopenharmony_ci			    ("\n**** Context Switch from TID %u to TID %u ****\n\n",
15562306a36Sopenharmony_ci			     (u32)acpi_gbl_previous_thread_id, (u32)thread_id);
15662306a36Sopenharmony_ci		}
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci		acpi_gbl_previous_thread_id = thread_id;
15962306a36Sopenharmony_ci		acpi_gbl_nesting_level = 0;
16062306a36Sopenharmony_ci	}
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/*
16362306a36Sopenharmony_ci	 * Display the module name, current line number, thread ID (if requested),
16462306a36Sopenharmony_ci	 * current procedure nesting level, and the current procedure name
16562306a36Sopenharmony_ci	 */
16662306a36Sopenharmony_ci	acpi_os_printf("%9s-%04d ", module_name, line_number);
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
16962306a36Sopenharmony_ci	/*
17062306a36Sopenharmony_ci	 * For acpi_exec/iASL only, emit the thread ID and nesting level.
17162306a36Sopenharmony_ci	 * Note: nesting level is really only useful during a single-thread
17262306a36Sopenharmony_ci	 * execution. Otherwise, multiple threads will keep resetting the
17362306a36Sopenharmony_ci	 * level.
17462306a36Sopenharmony_ci	 */
17562306a36Sopenharmony_ci	if (ACPI_LV_THREADS & acpi_dbg_level) {
17662306a36Sopenharmony_ci		acpi_os_printf("[%u] ", (u32)thread_id);
17762306a36Sopenharmony_ci	}
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	fill_count = 48 - acpi_gbl_nesting_level -
18062306a36Sopenharmony_ci	    strlen(acpi_ut_trim_function_name(function_name));
18162306a36Sopenharmony_ci	if (fill_count < 0) {
18262306a36Sopenharmony_ci		fill_count = 0;
18362306a36Sopenharmony_ci	}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	acpi_os_printf("[%02d] %*s",
18662306a36Sopenharmony_ci		       acpi_gbl_nesting_level, acpi_gbl_nesting_level + 1, " ");
18762306a36Sopenharmony_ci	acpi_os_printf("%s%*s: ",
18862306a36Sopenharmony_ci		       acpi_ut_trim_function_name(function_name), fill_count,
18962306a36Sopenharmony_ci		       " ");
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci#else
19262306a36Sopenharmony_ci	acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name));
19362306a36Sopenharmony_ci#endif
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	va_start(args, format);
19662306a36Sopenharmony_ci	acpi_os_vprintf(format, args);
19762306a36Sopenharmony_ci	va_end(args);
19862306a36Sopenharmony_ci}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_debug_print)
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/*******************************************************************************
20362306a36Sopenharmony_ci *
20462306a36Sopenharmony_ci * FUNCTION:    acpi_debug_print_raw
20562306a36Sopenharmony_ci *
20662306a36Sopenharmony_ci * PARAMETERS:  requested_debug_level - Requested debug print level
20762306a36Sopenharmony_ci *              line_number         - Caller's line number
20862306a36Sopenharmony_ci *              function_name       - Caller's procedure name
20962306a36Sopenharmony_ci *              module_name         - Caller's module name
21062306a36Sopenharmony_ci *              component_id        - Caller's component ID
21162306a36Sopenharmony_ci *              format              - Printf format field
21262306a36Sopenharmony_ci *              ...                 - Optional printf arguments
21362306a36Sopenharmony_ci *
21462306a36Sopenharmony_ci * RETURN:      None
21562306a36Sopenharmony_ci *
21662306a36Sopenharmony_ci * DESCRIPTION: Print message with no headers. Has same interface as
21762306a36Sopenharmony_ci *              debug_print so that the same macros can be used.
21862306a36Sopenharmony_ci *
21962306a36Sopenharmony_ci ******************************************************************************/
22062306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE
22162306a36Sopenharmony_ciacpi_debug_print_raw(u32 requested_debug_level,
22262306a36Sopenharmony_ci		     u32 line_number,
22362306a36Sopenharmony_ci		     const char *function_name,
22462306a36Sopenharmony_ci		     const char *module_name,
22562306a36Sopenharmony_ci		     u32 component_id, const char *format, ...)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	va_list args;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	/* Check if debug output enabled */
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
23262306a36Sopenharmony_ci		return;
23362306a36Sopenharmony_ci	}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	va_start(args, format);
23662306a36Sopenharmony_ci	acpi_os_vprintf(format, args);
23762306a36Sopenharmony_ci	va_end(args);
23862306a36Sopenharmony_ci}
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_debug_print_raw)
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci/*******************************************************************************
24362306a36Sopenharmony_ci *
24462306a36Sopenharmony_ci * FUNCTION:    acpi_ut_trace
24562306a36Sopenharmony_ci *
24662306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
24762306a36Sopenharmony_ci *              function_name       - Caller's procedure name
24862306a36Sopenharmony_ci *              module_name         - Caller's module name
24962306a36Sopenharmony_ci *              component_id        - Caller's component ID
25062306a36Sopenharmony_ci *
25162306a36Sopenharmony_ci * RETURN:      None
25262306a36Sopenharmony_ci *
25362306a36Sopenharmony_ci * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
25462306a36Sopenharmony_ci *              set in debug_level
25562306a36Sopenharmony_ci *
25662306a36Sopenharmony_ci ******************************************************************************/
25762306a36Sopenharmony_civoid
25862306a36Sopenharmony_ciacpi_ut_trace(u32 line_number,
25962306a36Sopenharmony_ci	      const char *function_name,
26062306a36Sopenharmony_ci	      const char *module_name, u32 component_id)
26162306a36Sopenharmony_ci{
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	acpi_gbl_nesting_level++;
26462306a36Sopenharmony_ci	acpi_ut_track_stack_ptr();
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
26962306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
27062306a36Sopenharmony_ci				 line_number, function_name, module_name,
27162306a36Sopenharmony_ci				 component_id, "%s\n",
27262306a36Sopenharmony_ci				 acpi_gbl_function_entry_prefix);
27362306a36Sopenharmony_ci	}
27462306a36Sopenharmony_ci}
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_ut_trace)
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci/*******************************************************************************
27962306a36Sopenharmony_ci *
28062306a36Sopenharmony_ci * FUNCTION:    acpi_ut_trace_ptr
28162306a36Sopenharmony_ci *
28262306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
28362306a36Sopenharmony_ci *              function_name       - Caller's procedure name
28462306a36Sopenharmony_ci *              module_name         - Caller's module name
28562306a36Sopenharmony_ci *              component_id        - Caller's component ID
28662306a36Sopenharmony_ci *              pointer             - Pointer to display
28762306a36Sopenharmony_ci *
28862306a36Sopenharmony_ci * RETURN:      None
28962306a36Sopenharmony_ci *
29062306a36Sopenharmony_ci * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
29162306a36Sopenharmony_ci *              set in debug_level
29262306a36Sopenharmony_ci *
29362306a36Sopenharmony_ci ******************************************************************************/
29462306a36Sopenharmony_civoid
29562306a36Sopenharmony_ciacpi_ut_trace_ptr(u32 line_number,
29662306a36Sopenharmony_ci		  const char *function_name,
29762306a36Sopenharmony_ci		  const char *module_name,
29862306a36Sopenharmony_ci		  u32 component_id, const void *pointer)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	acpi_gbl_nesting_level++;
30262306a36Sopenharmony_ci	acpi_ut_track_stack_ptr();
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
30762306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
30862306a36Sopenharmony_ci				 line_number, function_name, module_name,
30962306a36Sopenharmony_ci				 component_id, "%s %p\n",
31062306a36Sopenharmony_ci				 acpi_gbl_function_entry_prefix, pointer);
31162306a36Sopenharmony_ci	}
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/*******************************************************************************
31562306a36Sopenharmony_ci *
31662306a36Sopenharmony_ci * FUNCTION:    acpi_ut_trace_str
31762306a36Sopenharmony_ci *
31862306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
31962306a36Sopenharmony_ci *              function_name       - Caller's procedure name
32062306a36Sopenharmony_ci *              module_name         - Caller's module name
32162306a36Sopenharmony_ci *              component_id        - Caller's component ID
32262306a36Sopenharmony_ci *              string              - Additional string to display
32362306a36Sopenharmony_ci *
32462306a36Sopenharmony_ci * RETURN:      None
32562306a36Sopenharmony_ci *
32662306a36Sopenharmony_ci * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
32762306a36Sopenharmony_ci *              set in debug_level
32862306a36Sopenharmony_ci *
32962306a36Sopenharmony_ci ******************************************************************************/
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_civoid
33262306a36Sopenharmony_ciacpi_ut_trace_str(u32 line_number,
33362306a36Sopenharmony_ci		  const char *function_name,
33462306a36Sopenharmony_ci		  const char *module_name, u32 component_id, const char *string)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	acpi_gbl_nesting_level++;
33862306a36Sopenharmony_ci	acpi_ut_track_stack_ptr();
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
34362306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
34462306a36Sopenharmony_ci				 line_number, function_name, module_name,
34562306a36Sopenharmony_ci				 component_id, "%s %s\n",
34662306a36Sopenharmony_ci				 acpi_gbl_function_entry_prefix, string);
34762306a36Sopenharmony_ci	}
34862306a36Sopenharmony_ci}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci/*******************************************************************************
35162306a36Sopenharmony_ci *
35262306a36Sopenharmony_ci * FUNCTION:    acpi_ut_trace_u32
35362306a36Sopenharmony_ci *
35462306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
35562306a36Sopenharmony_ci *              function_name       - Caller's procedure name
35662306a36Sopenharmony_ci *              module_name         - Caller's module name
35762306a36Sopenharmony_ci *              component_id        - Caller's component ID
35862306a36Sopenharmony_ci *              integer             - Integer to display
35962306a36Sopenharmony_ci *
36062306a36Sopenharmony_ci * RETURN:      None
36162306a36Sopenharmony_ci *
36262306a36Sopenharmony_ci * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
36362306a36Sopenharmony_ci *              set in debug_level
36462306a36Sopenharmony_ci *
36562306a36Sopenharmony_ci ******************************************************************************/
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_civoid
36862306a36Sopenharmony_ciacpi_ut_trace_u32(u32 line_number,
36962306a36Sopenharmony_ci		  const char *function_name,
37062306a36Sopenharmony_ci		  const char *module_name, u32 component_id, u32 integer)
37162306a36Sopenharmony_ci{
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	acpi_gbl_nesting_level++;
37462306a36Sopenharmony_ci	acpi_ut_track_stack_ptr();
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
37962306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
38062306a36Sopenharmony_ci				 line_number, function_name, module_name,
38162306a36Sopenharmony_ci				 component_id, "%s %08X\n",
38262306a36Sopenharmony_ci				 acpi_gbl_function_entry_prefix, integer);
38362306a36Sopenharmony_ci	}
38462306a36Sopenharmony_ci}
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci/*******************************************************************************
38762306a36Sopenharmony_ci *
38862306a36Sopenharmony_ci * FUNCTION:    acpi_ut_exit
38962306a36Sopenharmony_ci *
39062306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
39162306a36Sopenharmony_ci *              function_name       - Caller's procedure name
39262306a36Sopenharmony_ci *              module_name         - Caller's module name
39362306a36Sopenharmony_ci *              component_id        - Caller's component ID
39462306a36Sopenharmony_ci *
39562306a36Sopenharmony_ci * RETURN:      None
39662306a36Sopenharmony_ci *
39762306a36Sopenharmony_ci * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
39862306a36Sopenharmony_ci *              set in debug_level
39962306a36Sopenharmony_ci *
40062306a36Sopenharmony_ci ******************************************************************************/
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_civoid
40362306a36Sopenharmony_ciacpi_ut_exit(u32 line_number,
40462306a36Sopenharmony_ci	     const char *function_name,
40562306a36Sopenharmony_ci	     const char *module_name, u32 component_id)
40662306a36Sopenharmony_ci{
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
41162306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
41262306a36Sopenharmony_ci				 line_number, function_name, module_name,
41362306a36Sopenharmony_ci				 component_id, "%s\n",
41462306a36Sopenharmony_ci				 acpi_gbl_function_exit_prefix);
41562306a36Sopenharmony_ci	}
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	if (acpi_gbl_nesting_level) {
41862306a36Sopenharmony_ci		acpi_gbl_nesting_level--;
41962306a36Sopenharmony_ci	}
42062306a36Sopenharmony_ci}
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_ut_exit)
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci/*******************************************************************************
42562306a36Sopenharmony_ci *
42662306a36Sopenharmony_ci * FUNCTION:    acpi_ut_status_exit
42762306a36Sopenharmony_ci *
42862306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
42962306a36Sopenharmony_ci *              function_name       - Caller's procedure name
43062306a36Sopenharmony_ci *              module_name         - Caller's module name
43162306a36Sopenharmony_ci *              component_id        - Caller's component ID
43262306a36Sopenharmony_ci *              status              - Exit status code
43362306a36Sopenharmony_ci *
43462306a36Sopenharmony_ci * RETURN:      None
43562306a36Sopenharmony_ci *
43662306a36Sopenharmony_ci * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
43762306a36Sopenharmony_ci *              set in debug_level. Prints exit status also.
43862306a36Sopenharmony_ci *
43962306a36Sopenharmony_ci ******************************************************************************/
44062306a36Sopenharmony_civoid
44162306a36Sopenharmony_ciacpi_ut_status_exit(u32 line_number,
44262306a36Sopenharmony_ci		    const char *function_name,
44362306a36Sopenharmony_ci		    const char *module_name,
44462306a36Sopenharmony_ci		    u32 component_id, acpi_status status)
44562306a36Sopenharmony_ci{
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
45062306a36Sopenharmony_ci		if (ACPI_SUCCESS(status)) {
45162306a36Sopenharmony_ci			acpi_debug_print(ACPI_LV_FUNCTIONS,
45262306a36Sopenharmony_ci					 line_number, function_name,
45362306a36Sopenharmony_ci					 module_name, component_id, "%s %s\n",
45462306a36Sopenharmony_ci					 acpi_gbl_function_exit_prefix,
45562306a36Sopenharmony_ci					 acpi_format_exception(status));
45662306a36Sopenharmony_ci		} else {
45762306a36Sopenharmony_ci			acpi_debug_print(ACPI_LV_FUNCTIONS,
45862306a36Sopenharmony_ci					 line_number, function_name,
45962306a36Sopenharmony_ci					 module_name, component_id,
46062306a36Sopenharmony_ci					 "%s ****Exception****: %s\n",
46162306a36Sopenharmony_ci					 acpi_gbl_function_exit_prefix,
46262306a36Sopenharmony_ci					 acpi_format_exception(status));
46362306a36Sopenharmony_ci		}
46462306a36Sopenharmony_ci	}
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	if (acpi_gbl_nesting_level) {
46762306a36Sopenharmony_ci		acpi_gbl_nesting_level--;
46862306a36Sopenharmony_ci	}
46962306a36Sopenharmony_ci}
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_ut_status_exit)
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci/*******************************************************************************
47462306a36Sopenharmony_ci *
47562306a36Sopenharmony_ci * FUNCTION:    acpi_ut_value_exit
47662306a36Sopenharmony_ci *
47762306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
47862306a36Sopenharmony_ci *              function_name       - Caller's procedure name
47962306a36Sopenharmony_ci *              module_name         - Caller's module name
48062306a36Sopenharmony_ci *              component_id        - Caller's component ID
48162306a36Sopenharmony_ci *              value               - Value to be printed with exit msg
48262306a36Sopenharmony_ci *
48362306a36Sopenharmony_ci * RETURN:      None
48462306a36Sopenharmony_ci *
48562306a36Sopenharmony_ci * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
48662306a36Sopenharmony_ci *              set in debug_level. Prints exit value also.
48762306a36Sopenharmony_ci *
48862306a36Sopenharmony_ci ******************************************************************************/
48962306a36Sopenharmony_civoid
49062306a36Sopenharmony_ciacpi_ut_value_exit(u32 line_number,
49162306a36Sopenharmony_ci		   const char *function_name,
49262306a36Sopenharmony_ci		   const char *module_name, u32 component_id, u64 value)
49362306a36Sopenharmony_ci{
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
49862306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
49962306a36Sopenharmony_ci				 line_number, function_name, module_name,
50062306a36Sopenharmony_ci				 component_id, "%s %8.8X%8.8X\n",
50162306a36Sopenharmony_ci				 acpi_gbl_function_exit_prefix,
50262306a36Sopenharmony_ci				 ACPI_FORMAT_UINT64(value));
50362306a36Sopenharmony_ci	}
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	if (acpi_gbl_nesting_level) {
50662306a36Sopenharmony_ci		acpi_gbl_nesting_level--;
50762306a36Sopenharmony_ci	}
50862306a36Sopenharmony_ci}
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci/*******************************************************************************
51362306a36Sopenharmony_ci *
51462306a36Sopenharmony_ci * FUNCTION:    acpi_ut_ptr_exit
51562306a36Sopenharmony_ci *
51662306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
51762306a36Sopenharmony_ci *              function_name       - Caller's procedure name
51862306a36Sopenharmony_ci *              module_name         - Caller's module name
51962306a36Sopenharmony_ci *              component_id        - Caller's component ID
52062306a36Sopenharmony_ci *              ptr                 - Pointer to display
52162306a36Sopenharmony_ci *
52262306a36Sopenharmony_ci * RETURN:      None
52362306a36Sopenharmony_ci *
52462306a36Sopenharmony_ci * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
52562306a36Sopenharmony_ci *              set in debug_level. Prints exit value also.
52662306a36Sopenharmony_ci *
52762306a36Sopenharmony_ci ******************************************************************************/
52862306a36Sopenharmony_civoid
52962306a36Sopenharmony_ciacpi_ut_ptr_exit(u32 line_number,
53062306a36Sopenharmony_ci		 const char *function_name,
53162306a36Sopenharmony_ci		 const char *module_name, u32 component_id, u8 *ptr)
53262306a36Sopenharmony_ci{
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
53762306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
53862306a36Sopenharmony_ci				 line_number, function_name, module_name,
53962306a36Sopenharmony_ci				 component_id, "%s %p\n",
54062306a36Sopenharmony_ci				 acpi_gbl_function_exit_prefix, ptr);
54162306a36Sopenharmony_ci	}
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci	if (acpi_gbl_nesting_level) {
54462306a36Sopenharmony_ci		acpi_gbl_nesting_level--;
54562306a36Sopenharmony_ci	}
54662306a36Sopenharmony_ci}
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci/*******************************************************************************
54962306a36Sopenharmony_ci *
55062306a36Sopenharmony_ci * FUNCTION:    acpi_ut_str_exit
55162306a36Sopenharmony_ci *
55262306a36Sopenharmony_ci * PARAMETERS:  line_number         - Caller's line number
55362306a36Sopenharmony_ci *              function_name       - Caller's procedure name
55462306a36Sopenharmony_ci *              module_name         - Caller's module name
55562306a36Sopenharmony_ci *              component_id        - Caller's component ID
55662306a36Sopenharmony_ci *              string              - String to display
55762306a36Sopenharmony_ci *
55862306a36Sopenharmony_ci * RETURN:      None
55962306a36Sopenharmony_ci *
56062306a36Sopenharmony_ci * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
56162306a36Sopenharmony_ci *              set in debug_level. Prints exit value also.
56262306a36Sopenharmony_ci *
56362306a36Sopenharmony_ci ******************************************************************************/
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_civoid
56662306a36Sopenharmony_ciacpi_ut_str_exit(u32 line_number,
56762306a36Sopenharmony_ci		 const char *function_name,
56862306a36Sopenharmony_ci		 const char *module_name, u32 component_id, const char *string)
56962306a36Sopenharmony_ci{
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	/* Check if enabled up-front for performance */
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci	if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
57462306a36Sopenharmony_ci		acpi_debug_print(ACPI_LV_FUNCTIONS,
57562306a36Sopenharmony_ci				 line_number, function_name, module_name,
57662306a36Sopenharmony_ci				 component_id, "%s %s\n",
57762306a36Sopenharmony_ci				 acpi_gbl_function_exit_prefix, string);
57862306a36Sopenharmony_ci	}
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	if (acpi_gbl_nesting_level) {
58162306a36Sopenharmony_ci		acpi_gbl_nesting_level--;
58262306a36Sopenharmony_ci	}
58362306a36Sopenharmony_ci}
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci/*******************************************************************************
58662306a36Sopenharmony_ci *
58762306a36Sopenharmony_ci * FUNCTION:    acpi_trace_point
58862306a36Sopenharmony_ci *
58962306a36Sopenharmony_ci * PARAMETERS:  type                - Trace event type
59062306a36Sopenharmony_ci *              begin               - TRUE if before execution
59162306a36Sopenharmony_ci *              aml                 - Executed AML address
59262306a36Sopenharmony_ci *              pathname            - Object path
59362306a36Sopenharmony_ci *              pointer             - Pointer to the related object
59462306a36Sopenharmony_ci *
59562306a36Sopenharmony_ci * RETURN:      None
59662306a36Sopenharmony_ci *
59762306a36Sopenharmony_ci * DESCRIPTION: Interpreter execution trace.
59862306a36Sopenharmony_ci *
59962306a36Sopenharmony_ci ******************************************************************************/
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_civoid
60262306a36Sopenharmony_ciacpi_trace_point(acpi_trace_event_type type, u8 begin, u8 *aml, char *pathname)
60362306a36Sopenharmony_ci{
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci	ACPI_FUNCTION_ENTRY();
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	acpi_ex_trace_point(type, begin, aml, pathname);
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci#ifdef ACPI_USE_SYSTEM_TRACER
61062306a36Sopenharmony_ci	acpi_os_trace_point(type, begin, aml, pathname);
61162306a36Sopenharmony_ci#endif
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_trace_point)
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci#endif
617