utdebug.c revision 50df4d8b0f6e1971b930f3158c9ee0e4263e636d
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utdebug - Debug print routines
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
875a44ce00b312f57264f42a0a985d17cd9994b98Len Brown * Copyright (C) 2000 - 2008, Intel Corp.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met:
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    notice, this list of conditions, and the following disclaimer,
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    without modification.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    substantially similar to the "NO WARRANTY" disclaimer below
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    ("Disclaimer") and any redistribution must be conditioned upon
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    including a substantially similar Disclaimer requirement for further
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    binary redistribution.
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    of any contributors may be used to endorse or promote products derived
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    from this software without specific prior written permission.
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES.
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h>
4550df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore#include <acpi/accommon.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT          ACPI_UTILITIES
484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utdebug")
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ACPI_DEBUG_OUTPUT
50ab8aa06a5c0b75974fb1949365cbb20a15cedf14Len Brownstatic acpi_thread_id acpi_gbl_prev_thread_id;
514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownstatic char *acpi_gbl_fn_entry_str = "----Entry";
524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownstatic char *acpi_gbl_fn_exit_str = "----Exit-";
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
540c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore/* Local prototypes */
550c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownstatic const char *acpi_ut_trim_function_name(const char *function_name);
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_init_stack_ptr_trace
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  None
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_init_stack_ptr_trace(void)
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
721d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore	acpi_size current_sp;
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore	acpi_gbl_entry_stack_pointer = &current_sp;
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_track_stack_ptr
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  None
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: Save the current CPU stack pointer
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_track_stack_ptr(void)
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_size current_sp;
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
931d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore	if (&current_sp < acpi_gbl_lowest_stack_pointer) {
941d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore		acpi_gbl_lowest_stack_pointer = &current_sp;
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1040c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * FUNCTION:    acpi_ut_trim_function_name
1050c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *
1060c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * PARAMETERS:  function_name       - Ascii string containing a procedure name
1070c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *
1080c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * RETURN:      Updated pointer to the function name
1090c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *
1100c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
11196b2dd1f1fdb9a131b7f2e79e5c7b2e4282cfcbfHarvey Harrison *              This allows compiler macros such as __func__ to be used
1120c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *              with no change to the debug output.
1130c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *
1140c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore ******************************************************************************/
1150c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownstatic const char *acpi_ut_trim_function_name(const char *function_name)
1170c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore{
1180c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1190c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore	/* All Function names are longer than 4 chars, check is safe */
1200c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
121a18ecf413ca9846becb760f7f990c2c62c15965eBob Moore	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
12252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
1230c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		/* This is the case where the original source has not been modified */
1240c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1250c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		return (function_name + 4);
1260c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore	}
1270c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
128a18ecf413ca9846becb760f7f990c2c62c15965eBob Moore	if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
12952fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
1300c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		/* This is the case where the source has been 'linuxized' */
1310c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1320c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		return (function_name + 5);
1330c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore	}
1340c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1350c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore	return (function_name);
1360c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore}
1370c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore
1380c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore/*******************************************************************************
1390c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *
14050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore * FUNCTION:    acpi_debug_print
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
14244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  requested_debug_level - Requested debug print level
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              line_number         - Caller's line number (for error output)
144f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
145f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
146f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Format              - Printf format field
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              ...                 - Optional printf arguments
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Print error message with prefix consisting of the module name,
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              line number, and component ID.
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
15544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid ACPI_INTERNAL_VAR_XFACE
15850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Mooreacpi_debug_print(u32 requested_debug_level,
15950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		 u32 line_number,
16050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		 const char *function_name,
16150df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		 const char *module_name,
16250df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		 u32 component_id, const char *format, ...)
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1648313524a0d466f451a62709aaedf988d8257b21cBob Moore	acpi_thread_id thread_id;
1654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	va_list args;
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Stay silent if the debug level or component ID is disabled
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(requested_debug_level & acpi_dbg_level) ||
1714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    !(component_id & acpi_dbg_layer)) {
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Thread tracking and context switch notification
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	thread_id = acpi_os_get_thread_id();
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (thread_id != acpi_gbl_prev_thread_id) {
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ACPI_LV_THREADS & acpi_dbg_level) {
1814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_os_printf
182b0b7eaaf0c7aefd118d3ff8640fbed75a9fad9a1Alexey Starikovskiy			    ("\n**** Context Switch from TID %lX to TID %lX ****\n\n",
183fd3509436fde38d4c854bf5a6b83d2c779904f8eLen Brown			     (unsigned long)acpi_gbl_prev_thread_id,
184fd3509436fde38d4c854bf5a6b83d2c779904f8eLen Brown			     (unsigned long)thread_id);
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		acpi_gbl_prev_thread_id = thread_id;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Display the module name, current line number, thread ID (if requested),
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * current procedure nesting level, and the current procedure name
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_os_printf("%8s-%04ld ", module_name, line_number);
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ACPI_LV_THREADS & acpi_dbg_level) {
197b0b7eaaf0c7aefd118d3ff8640fbed75a9fad9a1Alexey Starikovskiy		acpi_os_printf("[%04lX] ", (unsigned long)thread_id);
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_os_printf("[%02ld] %-22.22s: ",
2014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		       acpi_gbl_nesting_level,
2024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		       acpi_ut_trim_function_name(function_name));
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	va_start(args, format);
2054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_os_vprintf(format, args);
206507f046c4dd17e9c94b5130ba184f8da90504685Bob Moore	va_end(args);
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob MooreACPI_EXPORT_SYMBOL(acpi_debug_print)
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
21350df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore * FUNCTION:    acpi_debug_print_raw
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  requested_debug_level - Requested debug print level
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              line_number         - Caller's line number
217f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
218f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
219f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Format              - Printf format field
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              ...                 - Optional printf arguments
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Print message with no headers.  Has same interface as
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              debug_print so that the same macros can be used.
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
22844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
2294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid ACPI_INTERNAL_VAR_XFACE
23050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Mooreacpi_debug_print_raw(u32 requested_debug_level,
23150df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		     u32 line_number,
23250df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		     const char *function_name,
23350df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		     const char *module_name,
23450df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		     u32 component_id, const char *format, ...)
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	va_list args;
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(requested_debug_level & acpi_dbg_level) ||
2394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    !(component_id & acpi_dbg_layer)) {
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	va_start(args, format);
2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_os_vprintf(format, args);
245507f046c4dd17e9c94b5130ba184f8da90504685Bob Moore	va_end(args);
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob MooreACPI_EXPORT_SYMBOL(acpi_debug_print_raw)
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
25044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_trace
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
255f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
256f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
257f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
26444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
2664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_trace(u32 line_number,
2674b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore	      const char *function_name,
2684b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore	      const char *module_name, u32 component_id)
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level++;
2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_track_stack_ptr();
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27450df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
27550df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
27650df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s\n", acpi_gbl_fn_entry_str);
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2798313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_ut_trace)
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_trace_ptr
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
286f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
287f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
288f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Pointer             - Pointer to display
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
29644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
2984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_trace_ptr(u32 line_number,
2994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		  const char *function_name,
3004b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		  const char *module_name, u32 component_id, void *pointer)
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level++;
3034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_track_stack_ptr();
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30550df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
30650df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
30750df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s %p\n", acpi_gbl_fn_entry_str, pointer);
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_trace_str
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
315f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
316f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
317f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              String              - Additional string to display
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
32544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
3284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_trace_str(u32 line_number,
3294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		  const char *function_name,
3304b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		  const char *module_name, u32 component_id, char *string)
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level++;
3344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_track_stack_ptr();
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33650df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
33750df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
33850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s %s\n", acpi_gbl_fn_entry_str, string);
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_trace_u32
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
346f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
347f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
348f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Integer             - Integer to display
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
35644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_trace_u32(u32 line_number,
3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		  const char *function_name,
3614b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		  const char *module_name, u32 component_id, u32 integer)
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level++;
3654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_track_stack_ptr();
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36750df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
36850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
36950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s %08X\n", acpi_gbl_fn_entry_str, integer);
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
37244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_exit
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
377f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
378f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
379f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
38644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
3894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_exit(u32 line_number,
3904b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore	     const char *function_name,
3914b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore	     const char *module_name, u32 component_id)
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39450df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
39550df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
39650df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s\n", acpi_gbl_fn_exit_str);
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level--;
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4018313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_ut_exit)
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_status_exit
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
408f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
409f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
410f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Status              - Exit status code
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level. Prints exit status also.
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
4204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_status_exit(u32 line_number,
4214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    const char *function_name,
4224b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		    const char *module_name,
4234b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		    u32 component_id, acpi_status status)
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_SUCCESS(status)) {
42750df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		acpi_debug_print(ACPI_LV_FUNCTIONS,
42850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 line_number, function_name, module_name,
42950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 component_id, "%s %s\n", acpi_gbl_fn_exit_str,
43050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 acpi_format_exception(status));
4314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	} else {
43250df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore		acpi_debug_print(ACPI_LV_FUNCTIONS,
43350df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 line_number, function_name, module_name,
43450df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 component_id, "%s ****Exception****: %s\n",
43550df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 acpi_gbl_fn_exit_str,
43650df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore				 acpi_format_exception(status));
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level--;
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4428313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_ut_status_exit)
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_value_exit
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
449f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
450f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
451f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Value               - Value to be printed with exit msg
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level. Prints exit value also.
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
45944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
4614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_value_exit(u32 line_number,
4624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		   const char *function_name,
4634b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		   const char *module_name,
4644b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		   u32 component_id, acpi_integer value)
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46750df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
46850df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
46950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
47050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 ACPI_FORMAT_UINT64(value));
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level--;
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4758313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_ptr_exit
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  line_number         - Caller's line number
482f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              function_name       - Caller's procedure name
483f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              module_name         - Caller's module name
484f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore *              component_id        - Caller's component ID
48544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              Ptr                 - Pointer to display
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              set in debug_level. Prints exit value also.
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
49244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
4944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_ptr_exit(u32 line_number,
4954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		 const char *function_name,
4964b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore		 const char *module_name, u32 component_id, u8 *ptr)
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49950df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore	acpi_debug_print(ACPI_LV_FUNCTIONS,
50050df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 line_number, function_name, module_name, component_id,
50150df4d8b0f6e1971b930f3158c9ee0e4263e636dBob Moore			 "%s %p\n", acpi_gbl_fn_exit_str, ptr);
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	acpi_gbl_nesting_level--;
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_dump_buffer
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  Buffer              - Buffer to dump
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Count               - Amount to dump, in bytes
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Display             - BYTE, WORD, DWORD, or QWORD display
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              component_iD        - Caller's component ID
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      None
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Generic dump buffer in both hex and ascii.
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
52144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
523793c2388cae3fd023b3b5166354931752d42353cBob Moorevoid acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
52567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore	u32 i = 0;
52667a119f990063f5662574f6d6414fe9bc5ece86aBob Moore	u32 j;
5274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 temp32;
5284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u8 buf_char;
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5305eb691805f7ec5960fe9d5d7fc57a7fc3097bbd0Bob Moore	if (!buffer) {
5315eb691805f7ec5960fe9d5d7fc57a7fc3097bbd0Bob Moore		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
5325eb691805f7ec5960fe9d5d7fc57a7fc3097bbd0Bob Moore		return;
5335eb691805f7ec5960fe9d5d7fc57a7fc3097bbd0Bob Moore	}
5345eb691805f7ec5960fe9d5d7fc57a7fc3097bbd0Bob Moore
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((count < 4) || (count & 0x01)) {
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		display = DB_BYTE_DISPLAY;
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore	/* Nasty little dump buffer routine! */
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (i < count) {
54252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Print current offset */
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore		acpi_os_printf("%6.4X: ", i);
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Print 16 hex chars */
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (j = 0; j < 16;) {
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (i + j >= count) {
55152fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
55244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore				/* Dump fill spaces */
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%*s", ((display * 2) + 1), " ");
55567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				j += display;
55644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore				continue;
55744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore			}
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (display) {
560793c2388cae3fd023b3b5166354931752d42353cBob Moore			case DB_BYTE_DISPLAY:
5614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			default:	/* Default is BYTE display */
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56367a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				acpi_os_printf("%02X ",
56467a119f990063f5662574f6d6414fe9bc5ece86aBob Moore					       buffer[(acpi_size) i + j]);
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case DB_WORD_DISPLAY:
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56967a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				ACPI_MOVE_16_TO_32(&temp32,
57067a119f990063f5662574f6d6414fe9bc5ece86aBob Moore						   &buffer[(acpi_size) i + j]);
5714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%04X ", temp32);
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case DB_DWORD_DISPLAY:
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57667a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				ACPI_MOVE_32_TO_32(&temp32,
57767a119f990063f5662574f6d6414fe9bc5ece86aBob Moore						   &buffer[(acpi_size) i + j]);
5784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%08X ", temp32);
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case DB_QWORD_DISPLAY:
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58367a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				ACPI_MOVE_32_TO_32(&temp32,
58467a119f990063f5662574f6d6414fe9bc5ece86aBob Moore						   &buffer[(acpi_size) i + j]);
5854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%08X", temp32);
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58767a119f990063f5662574f6d6414fe9bc5ece86aBob Moore				ACPI_MOVE_32_TO_32(&temp32,
58867a119f990063f5662574f6d6414fe9bc5ece86aBob Moore						   &buffer[(acpi_size) i + j +
58967a119f990063f5662574f6d6414fe9bc5ece86aBob Moore							   4]);
5904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%08X ", temp32);
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
59344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
59467a119f990063f5662574f6d6414fe9bc5ece86aBob Moore			j += display;
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
5980c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		 * Print the ASCII equivalent characters but watch out for the bad
5990c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore		 * unprintable ones (printable chars are 0x20 through 0x7E)
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_os_printf(" ");
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (j = 0; j < 16; j++) {
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (i + j >= count) {
6044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("\n");
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60867a119f990063f5662574f6d6414fe9bc5ece86aBob Moore			buf_char = buffer[(acpi_size) i + j];
6094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			if (ACPI_IS_PRINT(buf_char)) {
6104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf("%c", buf_char);
6114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			} else {
6124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_os_printf(".");
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Done with that line. */
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_os_printf("\n");
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		i += 16;
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return;
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
624793c2388cae3fd023b3b5166354931752d42353cBob Moore
625793c2388cae3fd023b3b5166354931752d42353cBob Moore/*******************************************************************************
626793c2388cae3fd023b3b5166354931752d42353cBob Moore *
627793c2388cae3fd023b3b5166354931752d42353cBob Moore * FUNCTION:    acpi_ut_dump_buffer
628793c2388cae3fd023b3b5166354931752d42353cBob Moore *
629793c2388cae3fd023b3b5166354931752d42353cBob Moore * PARAMETERS:  Buffer              - Buffer to dump
630793c2388cae3fd023b3b5166354931752d42353cBob Moore *              Count               - Amount to dump, in bytes
631793c2388cae3fd023b3b5166354931752d42353cBob Moore *              Display             - BYTE, WORD, DWORD, or QWORD display
632793c2388cae3fd023b3b5166354931752d42353cBob Moore *              component_iD        - Caller's component ID
633793c2388cae3fd023b3b5166354931752d42353cBob Moore *
634793c2388cae3fd023b3b5166354931752d42353cBob Moore * RETURN:      None
635793c2388cae3fd023b3b5166354931752d42353cBob Moore *
636793c2388cae3fd023b3b5166354931752d42353cBob Moore * DESCRIPTION: Generic dump buffer in both hex and ascii.
637793c2388cae3fd023b3b5166354931752d42353cBob Moore *
638793c2388cae3fd023b3b5166354931752d42353cBob Moore ******************************************************************************/
639793c2388cae3fd023b3b5166354931752d42353cBob Moore
640793c2388cae3fd023b3b5166354931752d42353cBob Moorevoid acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id)
641793c2388cae3fd023b3b5166354931752d42353cBob Moore{
642793c2388cae3fd023b3b5166354931752d42353cBob Moore
643793c2388cae3fd023b3b5166354931752d42353cBob Moore	/* Only dump the buffer if tracing is enabled */
644793c2388cae3fd023b3b5166354931752d42353cBob Moore
645793c2388cae3fd023b3b5166354931752d42353cBob Moore	if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
646793c2388cae3fd023b3b5166354931752d42353cBob Moore	      (component_id & acpi_dbg_layer))) {
647793c2388cae3fd023b3b5166354931752d42353cBob Moore		return;
648793c2388cae3fd023b3b5166354931752d42353cBob Moore	}
649793c2388cae3fd023b3b5166354931752d42353cBob Moore
650793c2388cae3fd023b3b5166354931752d42353cBob Moore	acpi_ut_dump_buffer2(buffer, count, display);
651793c2388cae3fd023b3b5166354931752d42353cBob Moore}
652