Path: blob/main/sys/contrib/dev/acpica/include/acoutput.h
48287 views
/******************************************************************************1*2* Name: acoutput.h -- debug output3*4*****************************************************************************/56/******************************************************************************7*8* 1. Copyright Notice9*10* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.11* All rights reserved.12*13* 2. License14*15* 2.1. This is your license from Intel Corp. under its intellectual property16* rights. You may have additional license terms from the party that provided17* you this software, covering your right to use that party's intellectual18* property rights.19*20* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a21* copy of the source code appearing in this file ("Covered Code") an22* irrevocable, perpetual, worldwide license under Intel's copyrights in the23* base code distributed originally by Intel ("Original Intel Code") to copy,24* make derivatives, distribute, use and display any portion of the Covered25* Code in any form, with the right to sublicense such rights; and26*27* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent28* license (with the right to sublicense), under only those claims of Intel29* patents that are infringed by the Original Intel Code, to make, use, sell,30* offer to sell, and import the Covered Code and derivative works thereof31* solely to the minimum extent necessary to exercise the above copyright32* license, and in no event shall the patent license extend to any additions33* to or modifications of the Original Intel Code. No other license or right34* is granted directly or by implication, estoppel or otherwise;35*36* The above copyright and patent license is granted only if the following37* conditions are met:38*39* 3. Conditions40*41* 3.1. Redistribution of Source with Rights to Further Distribute Source.42* Redistribution of source code of any substantial portion of the Covered43* Code or modification with rights to further distribute source must include44* the above Copyright Notice, the above License, this list of Conditions,45* and the following Disclaimer and Export Compliance provision. In addition,46* Licensee must cause all Covered Code to which Licensee contributes to47* contain a file documenting the changes Licensee made to create that Covered48* Code and the date of any change. Licensee must include in that file the49* documentation of any changes made by any predecessor Licensee. Licensee50* must include a prominent statement that the modification is derived,51* directly or indirectly, from Original Intel Code.52*53* 3.2. Redistribution of Source with no Rights to Further Distribute Source.54* Redistribution of source code of any substantial portion of the Covered55* Code or modification without rights to further distribute source must56* include the following Disclaimer and Export Compliance provision in the57* documentation and/or other materials provided with distribution. In58* addition, Licensee may not authorize further sublicense of source of any59* portion of the Covered Code, and must include terms to the effect that the60* license from Licensee to its licensee is limited to the intellectual61* property embodied in the software Licensee provides to its licensee, and62* not to intellectual property embodied in modifications its licensee may63* make.64*65* 3.3. Redistribution of Executable. Redistribution in executable form of any66* substantial portion of the Covered Code or modification must reproduce the67* above Copyright Notice, and the following Disclaimer and Export Compliance68* provision in the documentation and/or other materials provided with the69* distribution.70*71* 3.4. Intel retains all right, title, and interest in and to the Original72* Intel Code.73*74* 3.5. Neither the name Intel nor any other trademark owned or controlled by75* Intel shall be used in advertising or otherwise to promote the sale, use or76* other dealings in products derived from or relating to the Covered Code77* without prior written authorization from Intel.78*79* 4. Disclaimer and Export Compliance80*81* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED82* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE83* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,84* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY85* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY86* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A87* PARTICULAR PURPOSE.88*89* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES90* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR91* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,92* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY93* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL94* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS95* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY96* LIMITED REMEDY.97*98* 4.3. Licensee shall not export, either directly or indirectly, any of this99* software or system incorporating such software without first obtaining any100* required license or other approval from the U. S. Department of Commerce or101* any other agency or department of the United States Government. In the102* event Licensee exports any such software from the United States or103* re-exports any such software from a foreign destination, Licensee shall104* ensure that the distribution and export/re-export of the software is in105* compliance with all laws, regulations, orders, or other restrictions of the106* U.S. Export Administration Regulations. Licensee agrees that neither it nor107* any of its subsidiaries will export/re-export any technical data, process,108* software, or service, directly or indirectly, to any country for which the109* United States government or any agency thereof requires an export license,110* other governmental approval, or letter of assurance, without first obtaining111* such license, approval or letter.112*113*****************************************************************************114*115* Alternatively, you may choose to be licensed under the terms of the116* following license:117*118* Redistribution and use in source and binary forms, with or without119* modification, are permitted provided that the following conditions120* are met:121* 1. Redistributions of source code must retain the above copyright122* notice, this list of conditions, and the following disclaimer,123* without modification.124* 2. Redistributions in binary form must reproduce at minimum a disclaimer125* substantially similar to the "NO WARRANTY" disclaimer below126* ("Disclaimer") and any redistribution must be conditioned upon127* including a substantially similar Disclaimer requirement for further128* binary redistribution.129* 3. Neither the names of the above-listed copyright holders nor the names130* of any contributors may be used to endorse or promote products derived131* from this software without specific prior written permission.132*133* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS134* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT135* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR136* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT137* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,138* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT139* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,140* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY141* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT142* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE143* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.144*145* Alternatively, you may choose to be licensed under the terms of the146* GNU General Public License ("GPL") version 2 as published by the Free147* Software Foundation.148*149*****************************************************************************/150151#ifndef __ACOUTPUT_H__152#define __ACOUTPUT_H__153154/*155* Debug levels and component IDs. These are used to control the156* granularity of the output of the ACPI_DEBUG_PRINT macro -- on a157* per-component basis and a per-exception-type basis.158*/159160/* Component IDs are used in the global "DebugLayer" */161162#define ACPI_UTILITIES 0x00000001163#define ACPI_HARDWARE 0x00000002164#define ACPI_EVENTS 0x00000004165#define ACPI_TABLES 0x00000008166#define ACPI_NAMESPACE 0x00000010167#define ACPI_PARSER 0x00000020168#define ACPI_DISPATCHER 0x00000040169#define ACPI_EXECUTER 0x00000080170#define ACPI_RESOURCES 0x00000100171#define ACPI_CA_DEBUGGER 0x00000200172#define ACPI_OS_SERVICES 0x00000400173#define ACPI_CA_DISASSEMBLER 0x00000800174175/* Component IDs for ACPI tools and utilities */176177#define ACPI_COMPILER 0x00001000178#define ACPI_TOOLS 0x00002000179#define ACPI_EXAMPLE 0x00004000180#define ACPI_DRIVER 0x00008000181#define DT_COMPILER 0x00010000182#define ASL_PREPROCESSOR 0x00020000183184#define ACPI_ALL_COMPONENTS 0x0001FFFF185#define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS)186187/* Component IDs reserved for ACPI drivers */188189#define ACPI_ALL_DRIVERS 0xFFFF0000190191192/*193* Raw debug output levels, do not use these in the ACPI_DEBUG_PRINT macros194*/195#define ACPI_LV_INIT 0x00000001196#define ACPI_LV_DEBUG_OBJECT 0x00000002197#define ACPI_LV_INFO 0x00000004198#define ACPI_LV_REPAIR 0x00000008199#define ACPI_LV_TRACE_POINT 0x00000010200#define ACPI_LV_ALL_EXCEPTIONS 0x0000001F201202/* Trace verbosity level 1 [Standard Trace Level] */203204#define ACPI_LV_INIT_NAMES 0x00000020205#define ACPI_LV_PARSE 0x00000040206#define ACPI_LV_LOAD 0x00000080207#define ACPI_LV_DISPATCH 0x00000100208#define ACPI_LV_EXEC 0x00000200209#define ACPI_LV_NAMES 0x00000400210#define ACPI_LV_OPREGION 0x00000800211#define ACPI_LV_BFIELD 0x00001000212#define ACPI_LV_TABLES 0x00002000213#define ACPI_LV_VALUES 0x00004000214#define ACPI_LV_OBJECTS 0x00008000215#define ACPI_LV_RESOURCES 0x00010000216#define ACPI_LV_USER_REQUESTS 0x00020000217#define ACPI_LV_PACKAGE 0x00040000218#define ACPI_LV_EVALUATION 0x00080000219#define ACPI_LV_VERBOSITY1 0x000FFF40 | ACPI_LV_ALL_EXCEPTIONS220221/* Trace verbosity level 2 [Function tracing and memory allocation] */222223#define ACPI_LV_ALLOCATIONS 0x00100000224#define ACPI_LV_FUNCTIONS 0x00200000225#define ACPI_LV_OPTIMIZATIONS 0x00400000226#define ACPI_LV_PARSE_TREES 0x00800000227#define ACPI_LV_VERBOSITY2 0x00F00000 | ACPI_LV_VERBOSITY1228#define ACPI_LV_ALL ACPI_LV_VERBOSITY2229230/* Trace verbosity level 3 [Threading, I/O, and Interrupts] */231232#define ACPI_LV_MUTEX 0x01000000233#define ACPI_LV_THREADS 0x02000000234#define ACPI_LV_IO 0x04000000235#define ACPI_LV_INTERRUPTS 0x08000000236#define ACPI_LV_VERBOSITY3 0x0F000000 | ACPI_LV_VERBOSITY2237238/* Exceptionally verbose output -- also used in the global "DebugLevel" */239240#define ACPI_LV_AML_DISASSEMBLE 0x10000000241#define ACPI_LV_VERBOSE_INFO 0x20000000242#define ACPI_LV_FULL_TABLES 0x40000000243#define ACPI_LV_EVENTS 0x80000000244#define ACPI_LV_VERBOSE 0xF0000000245246247/*248* Debug level macros that are used in the DEBUG_PRINT macros249*/250#define ACPI_DEBUG_LEVEL(dl) (UINT32) dl,ACPI_DEBUG_PARAMETERS251252/*253* Exception level -- used in the global "DebugLevel"254*255* Note: For errors, use the ACPI_ERROR or ACPI_EXCEPTION interfaces.256* For warnings, use ACPI_WARNING.257*/258#define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT)259#define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT)260#define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO)261#define ACPI_DB_REPAIR ACPI_DEBUG_LEVEL (ACPI_LV_REPAIR)262#define ACPI_DB_TRACE_POINT ACPI_DEBUG_LEVEL (ACPI_LV_TRACE_POINT)263#define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS)264265/* Trace level -- also used in the global "DebugLevel" */266267#define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES)268#define ACPI_DB_THREADS ACPI_DEBUG_LEVEL (ACPI_LV_THREADS)269#define ACPI_DB_PARSE ACPI_DEBUG_LEVEL (ACPI_LV_PARSE)270#define ACPI_DB_DISPATCH ACPI_DEBUG_LEVEL (ACPI_LV_DISPATCH)271#define ACPI_DB_LOAD ACPI_DEBUG_LEVEL (ACPI_LV_LOAD)272#define ACPI_DB_EXEC ACPI_DEBUG_LEVEL (ACPI_LV_EXEC)273#define ACPI_DB_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_NAMES)274#define ACPI_DB_OPREGION ACPI_DEBUG_LEVEL (ACPI_LV_OPREGION)275#define ACPI_DB_BFIELD ACPI_DEBUG_LEVEL (ACPI_LV_BFIELD)276#define ACPI_DB_TABLES ACPI_DEBUG_LEVEL (ACPI_LV_TABLES)277#define ACPI_DB_FUNCTIONS ACPI_DEBUG_LEVEL (ACPI_LV_FUNCTIONS)278#define ACPI_DB_OPTIMIZATIONS ACPI_DEBUG_LEVEL (ACPI_LV_OPTIMIZATIONS)279#define ACPI_DB_PARSE_TREES ACPI_DEBUG_LEVEL (ACPI_LV_PARSE_TREES)280#define ACPI_DB_VALUES ACPI_DEBUG_LEVEL (ACPI_LV_VALUES)281#define ACPI_DB_OBJECTS ACPI_DEBUG_LEVEL (ACPI_LV_OBJECTS)282#define ACPI_DB_ALLOCATIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALLOCATIONS)283#define ACPI_DB_RESOURCES ACPI_DEBUG_LEVEL (ACPI_LV_RESOURCES)284#define ACPI_DB_IO ACPI_DEBUG_LEVEL (ACPI_LV_IO)285#define ACPI_DB_INTERRUPTS ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS)286#define ACPI_DB_USER_REQUESTS ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS)287#define ACPI_DB_PACKAGE ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE)288#define ACPI_DB_EVALUATION ACPI_DEBUG_LEVEL (ACPI_LV_EVALUATION)289#define ACPI_DB_MUTEX ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX)290#define ACPI_DB_EVENTS ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS)291292#define ACPI_DB_ALL ACPI_DEBUG_LEVEL (ACPI_LV_ALL)293294/* Defaults for DebugLevel, debug and normal */295296#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_EVALUATION | ACPI_LV_REPAIR)297#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR)298#define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL)299300301/*302* Global trace flags303*/304#define ACPI_TRACE_ENABLED ((UINT32) 4)305#define ACPI_TRACE_ONESHOT ((UINT32) 2)306#define ACPI_TRACE_OPCODE ((UINT32) 1)307308/* Defaults for trace debugging level/layer */309310#define ACPI_TRACE_LEVEL_ALL ACPI_LV_ALL311#define ACPI_TRACE_LAYER_ALL 0x000001FF312#define ACPI_TRACE_LEVEL_DEFAULT ACPI_LV_TRACE_POINT313#define ACPI_TRACE_LAYER_DEFAULT ACPI_EXECUTER314315316#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)317/*318* The module name is used primarily for error and debug messages.319* The __FILE__ macro is not very useful for this, because it320* usually includes the entire pathname to the module making the321* debug output difficult to read.322*/323#define ACPI_MODULE_NAME(Name) static const char ACPI_UNUSED_VAR _AcpiModuleName[] = Name;324#else325/*326* For the no-debug and no-error-msg cases, we must at least define327* a null module name.328*/329#define ACPI_MODULE_NAME(Name)330#define _AcpiModuleName ""331#endif332333/*334* Ascii error messages can be configured out335*/336#ifndef ACPI_NO_ERROR_MESSAGES337#define AE_INFO _AcpiModuleName, __LINE__338#define ACPI_ONCE(_fn, _plist) { static char _done; if (!_done) { _done = 1; _fn _plist; } }339340/*341* Error reporting. Callers module and line number are inserted by AE_INFO,342* the plist contains a set of parens to allow variable-length lists.343* These macros are used for both the debug and non-debug versions of the code.344*/345#define ACPI_INFO(plist) AcpiInfo plist346#define ACPI_WARNING(plist) AcpiWarning plist347#define ACPI_WARNING_ONCE(plist) ACPI_ONCE(AcpiWarning, plist)348#define ACPI_EXCEPTION(plist) AcpiException plist349#define ACPI_ERROR(plist) AcpiError plist350#define ACPI_ERROR_ONCE(plist) ACPI_ONCE(AcpiError, plist)351#define ACPI_BIOS_WARNING(plist) AcpiBiosWarning plist352#define ACPI_BIOS_EXCEPTION(plist) AcpiBiosException plist353#define ACPI_BIOS_ERROR(plist) AcpiBiosError plist354#define ACPI_DEBUG_OBJECT(obj,l,i) AcpiExDoDebugObject(obj,l,i)355356#else357358/* No error messages */359360#define ACPI_INFO(plist)361#define ACPI_WARNING(plist)362#define ACPI_WARNING_ONCE(plist)363#define ACPI_EXCEPTION(plist)364#define ACPI_ERROR(plist)365#define ACPI_ERROR_ONCE(plist)366#define ACPI_BIOS_WARNING(plist)367#define ACPI_BIOS_EXCEPTION(plist)368#define ACPI_BIOS_ERROR(plist)369#define ACPI_DEBUG_OBJECT(obj,l,i)370371#endif /* ACPI_NO_ERROR_MESSAGES */372373374/*375* Debug macros that are conditionally compiled376*/377#ifdef ACPI_DEBUG_OUTPUT378379/*380* If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header,381* define it now. This is the case where there the compiler does not support382* a __FUNCTION__ macro or equivalent.383*/384#ifndef ACPI_GET_FUNCTION_NAME385#define ACPI_GET_FUNCTION_NAME _AcpiFunctionName386387/*388* The Name parameter should be the procedure name as a non-quoted string.389* The function name is also used by the function exit macros below.390* Note: (const char) is used to be compatible with the debug interfaces391* and macros such as __FUNCTION__.392*/393#define ACPI_FUNCTION_NAME(Name) static const char _AcpiFunctionName[] = #Name;394395#else396/* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */397398#define ACPI_FUNCTION_NAME(Name)399#endif /* ACPI_GET_FUNCTION_NAME */400401/*402* Common parameters used for debug output functions:403* line number, function name, module(file) name, component ID404*/405#define ACPI_DEBUG_PARAMETERS \406__LINE__, ACPI_GET_FUNCTION_NAME, _AcpiModuleName, _COMPONENT407408/* Check if debug output is currently dynamically enabled */409410#define ACPI_IS_DEBUG_ENABLED(Level, Component) \411((Level & AcpiDbgLevel) && (Component & AcpiDbgLayer))412413/*414* Master debug print macros415* Print message if and only if:416* 1) Debug print for the current component is enabled417* 2) Debug error level or trace level for the print statement is enabled418*419* November 2012: Moved the runtime check for whether to actually emit the420* debug message outside of the print function itself. This improves overall421* performance at a relatively small code cost. Implementation involves the422* use of variadic macros supported by C99.423*424* Note: the ACPI_DO_WHILE0 macro is used to prevent some compilers from425* complaining about these constructs. On other compilers the do...while426* adds some extra code, so this feature is optional.427*/428#ifdef ACPI_USE_DO_WHILE_0429#define ACPI_DO_WHILE0(a) do a while(0)430#else431#define ACPI_DO_WHILE0(a) a432#endif433434/* DEBUG_PRINT functions */435436#ifndef COMPILER_VA_MACRO437438#define ACPI_DEBUG_PRINT(plist) AcpiDebugPrint plist439#define ACPI_DEBUG_PRINT_RAW(plist) AcpiDebugPrintRaw plist440441#else442443/* Helper macros for DEBUG_PRINT */444445#define ACPI_DO_DEBUG_PRINT(Function, Level, Line, Filename, Modulename, Component, ...) \446ACPI_DO_WHILE0 ({ \447if (ACPI_IS_DEBUG_ENABLED (Level, Component)) \448{ \449Function (Level, Line, Filename, Modulename, Component, __VA_ARGS__); \450} \451})452453#define ACPI_ACTUAL_DEBUG(Level, Line, Filename, Modulename, Component, ...) \454ACPI_DO_DEBUG_PRINT (AcpiDebugPrint, Level, Line, \455Filename, Modulename, Component, __VA_ARGS__)456457#define ACPI_ACTUAL_DEBUG_RAW(Level, Line, Filename, Modulename, Component, ...) \458ACPI_DO_DEBUG_PRINT (AcpiDebugPrintRaw, Level, Line, \459Filename, Modulename, Component, __VA_ARGS__)460461#define ACPI_DEBUG_PRINT(plist) ACPI_ACTUAL_DEBUG plist462#define ACPI_DEBUG_PRINT_RAW(plist) ACPI_ACTUAL_DEBUG_RAW plist463464#endif465466467/*468* Function entry tracing469*470* The name of the function is emitted as a local variable that is471* intended to be used by both the entry trace and the exit trace.472*/473474/* Helper macro */475476#define ACPI_TRACE_ENTRY(Name, Function, Type, Param) \477ACPI_FUNCTION_NAME (Name) \478Function (ACPI_DEBUG_PARAMETERS, (Type) (Param))479480/* The actual entry trace macros */481482#define ACPI_FUNCTION_TRACE(Name) \483ACPI_FUNCTION_NAME(Name) \484AcpiUtTrace (ACPI_DEBUG_PARAMETERS)485486#define ACPI_FUNCTION_TRACE_PTR(Name, Pointer) \487ACPI_TRACE_ENTRY (Name, AcpiUtTracePtr, void *, Pointer)488489#define ACPI_FUNCTION_TRACE_U32(Name, Value) \490ACPI_TRACE_ENTRY (Name, AcpiUtTraceU32, UINT32, Value)491492#define ACPI_FUNCTION_TRACE_STR(Name, String) \493ACPI_TRACE_ENTRY (Name, AcpiUtTraceStr, const char *, String)494495#define ACPI_FUNCTION_ENTRY() \496AcpiUtTrackStackPtr()497498499/*500* Function exit tracing501*502* These macros include a return statement. This is usually considered503* bad form, but having a separate exit macro before the actual return504* is very ugly and difficult to maintain.505*506* One of the FUNCTION_TRACE macros above must be used in conjunction507* with these macros so that "_AcpiFunctionName" is defined.508*509* There are two versions of most of the return macros. The default version is510* safer, since it avoids side-effects by guaranteeing that the argument will511* not be evaluated twice.512*513* A less-safe version of the macros is provided for optional use if the514* compiler uses excessive CPU stack (for example, this may happen in the515* debug case if code optimization is disabled.)516*/517518/* Exit trace helper macro */519520#ifndef ACPI_SIMPLE_RETURN_MACROS521522#define ACPI_TRACE_EXIT(Function, Type, Param) \523ACPI_DO_WHILE0 ({ \524register Type _Param = (Type) (Param); \525Function (ACPI_DEBUG_PARAMETERS, _Param); \526return (_Param); \527})528529#else /* Use original less-safe macros */530531#define ACPI_TRACE_EXIT(Function, Type, Param) \532ACPI_DO_WHILE0 ({ \533Function (ACPI_DEBUG_PARAMETERS, (Type) (Param)); \534return (Param); \535})536537#endif /* ACPI_SIMPLE_RETURN_MACROS */538539/* The actual exit macros */540541#define return_VOID \542ACPI_DO_WHILE0 ({ \543AcpiUtExit (ACPI_DEBUG_PARAMETERS); \544return; \545})546547#define return_ACPI_STATUS(Status) \548ACPI_TRACE_EXIT (AcpiUtStatusExit, ACPI_STATUS, Status)549550#define return_PTR(Pointer) \551ACPI_TRACE_EXIT (AcpiUtPtrExit, void *, Pointer)552553#define return_STR(String) \554ACPI_TRACE_EXIT (AcpiUtStrExit, const char *, String)555556#define return_VALUE(Value) \557ACPI_TRACE_EXIT (AcpiUtValueExit, UINT64, Value)558559#define return_UINT32(Value) \560ACPI_TRACE_EXIT (AcpiUtValueExit, UINT32, Value)561562#define return_UINT8(Value) \563ACPI_TRACE_EXIT (AcpiUtValueExit, UINT8, Value)564565/* Conditional execution */566567#define ACPI_DEBUG_EXEC(a) a568#define ACPI_DEBUG_ONLY_MEMBERS(a) a569#define _VERBOSE_STRUCTURES570571572/* Various object display routines for debug */573574#define ACPI_DUMP_STACK_ENTRY(a) AcpiExDumpOperand((a), 0)575#define ACPI_DUMP_OPERANDS(a, b ,c) AcpiExDumpOperands(a, b, c)576#define ACPI_DUMP_ENTRY(a, b) AcpiNsDumpEntry (a, b)577#define ACPI_DUMP_PATHNAME(a, b, c, d) AcpiNsDumpPathname(a, b, c, d)578#define ACPI_DUMP_BUFFER(a, b) AcpiUtDebugDumpBuffer((UINT8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT)579580#define ACPI_TRACE_POINT(a, b, c, d) AcpiTracePoint (a, b, c, d)581582#else /* ACPI_DEBUG_OUTPUT */583/*584* This is the non-debug case -- make everything go away,585* leaving no executable debug code!586*/587#define ACPI_DEBUG_PRINT(pl)588#define ACPI_DEBUG_PRINT_RAW(pl)589#define ACPI_DEBUG_EXEC(a)590#define ACPI_DEBUG_ONLY_MEMBERS(a)591#define ACPI_FUNCTION_NAME(a)592#define ACPI_FUNCTION_TRACE(a)593#define ACPI_FUNCTION_TRACE_PTR(a, b)594#define ACPI_FUNCTION_TRACE_U32(a, b)595#define ACPI_FUNCTION_TRACE_STR(a, b)596#define ACPI_FUNCTION_ENTRY()597#define ACPI_DUMP_STACK_ENTRY(a)598#define ACPI_DUMP_OPERANDS(a, b, c)599#define ACPI_DUMP_ENTRY(a, b)600#define ACPI_DUMP_PATHNAME(a, b, c, d)601#define ACPI_DUMP_BUFFER(a, b)602#define ACPI_IS_DEBUG_ENABLED(Level, Component) 0603#define ACPI_TRACE_POINT(a, b, c, d)604605/* Return macros must have a return statement at the minimum */606607#define return_VOID return608#define return_ACPI_STATUS(s) return(s)609#define return_PTR(s) return(s)610#define return_STR(s) return(s)611#define return_VALUE(s) return(s)612#define return_UINT8(s) return(s)613#define return_UINT32(s) return(s)614615#endif /* ACPI_DEBUG_OUTPUT */616617618#endif /* __ACOUTPUT_H__ */619620621