1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Name: acoutput.h -- debug output 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2000 - 2020, Intel Corp. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun *****************************************************************************/ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ACOUTPUT_H__ 11*4882a593Smuzhiyun #define __ACOUTPUT_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * Debug levels and component IDs. These are used to control the 15*4882a593Smuzhiyun * granularity of the output of the ACPI_DEBUG_PRINT macro -- on a 16*4882a593Smuzhiyun * per-component basis and a per-exception-type basis. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* Component IDs are used in the global "DebugLayer" */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define ACPI_UTILITIES 0x00000001 22*4882a593Smuzhiyun #define ACPI_HARDWARE 0x00000002 23*4882a593Smuzhiyun #define ACPI_EVENTS 0x00000004 24*4882a593Smuzhiyun #define ACPI_TABLES 0x00000008 25*4882a593Smuzhiyun #define ACPI_NAMESPACE 0x00000010 26*4882a593Smuzhiyun #define ACPI_PARSER 0x00000020 27*4882a593Smuzhiyun #define ACPI_DISPATCHER 0x00000040 28*4882a593Smuzhiyun #define ACPI_EXECUTER 0x00000080 29*4882a593Smuzhiyun #define ACPI_RESOURCES 0x00000100 30*4882a593Smuzhiyun #define ACPI_CA_DEBUGGER 0x00000200 31*4882a593Smuzhiyun #define ACPI_OS_SERVICES 0x00000400 32*4882a593Smuzhiyun #define ACPI_CA_DISASSEMBLER 0x00000800 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Component IDs for ACPI tools and utilities */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define ACPI_COMPILER 0x00001000 37*4882a593Smuzhiyun #define ACPI_TOOLS 0x00002000 38*4882a593Smuzhiyun #define ACPI_EXAMPLE 0x00004000 39*4882a593Smuzhiyun #define ACPI_DRIVER 0x00008000 40*4882a593Smuzhiyun #define DT_COMPILER 0x00010000 41*4882a593Smuzhiyun #define ASL_PREPROCESSOR 0x00020000 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define ACPI_ALL_COMPONENTS 0x0001FFFF 44*4882a593Smuzhiyun #define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* Component IDs reserved for ACPI drivers */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define ACPI_ALL_DRIVERS 0xFFFF0000 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * Raw debug output levels, do not use these in the ACPI_DEBUG_PRINT macros 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #define ACPI_LV_INIT 0x00000001 54*4882a593Smuzhiyun #define ACPI_LV_DEBUG_OBJECT 0x00000002 55*4882a593Smuzhiyun #define ACPI_LV_INFO 0x00000004 56*4882a593Smuzhiyun #define ACPI_LV_REPAIR 0x00000008 57*4882a593Smuzhiyun #define ACPI_LV_TRACE_POINT 0x00000010 58*4882a593Smuzhiyun #define ACPI_LV_ALL_EXCEPTIONS 0x0000001F 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Trace verbosity level 1 [Standard Trace Level] */ 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define ACPI_LV_INIT_NAMES 0x00000020 63*4882a593Smuzhiyun #define ACPI_LV_PARSE 0x00000040 64*4882a593Smuzhiyun #define ACPI_LV_LOAD 0x00000080 65*4882a593Smuzhiyun #define ACPI_LV_DISPATCH 0x00000100 66*4882a593Smuzhiyun #define ACPI_LV_EXEC 0x00000200 67*4882a593Smuzhiyun #define ACPI_LV_NAMES 0x00000400 68*4882a593Smuzhiyun #define ACPI_LV_OPREGION 0x00000800 69*4882a593Smuzhiyun #define ACPI_LV_BFIELD 0x00001000 70*4882a593Smuzhiyun #define ACPI_LV_TABLES 0x00002000 71*4882a593Smuzhiyun #define ACPI_LV_VALUES 0x00004000 72*4882a593Smuzhiyun #define ACPI_LV_OBJECTS 0x00008000 73*4882a593Smuzhiyun #define ACPI_LV_RESOURCES 0x00010000 74*4882a593Smuzhiyun #define ACPI_LV_USER_REQUESTS 0x00020000 75*4882a593Smuzhiyun #define ACPI_LV_PACKAGE 0x00040000 76*4882a593Smuzhiyun #define ACPI_LV_EVALUATION 0x00080000 77*4882a593Smuzhiyun #define ACPI_LV_VERBOSITY1 0x000FFF40 | ACPI_LV_ALL_EXCEPTIONS 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* Trace verbosity level 2 [Function tracing and memory allocation] */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define ACPI_LV_ALLOCATIONS 0x00100000 82*4882a593Smuzhiyun #define ACPI_LV_FUNCTIONS 0x00200000 83*4882a593Smuzhiyun #define ACPI_LV_OPTIMIZATIONS 0x00400000 84*4882a593Smuzhiyun #define ACPI_LV_PARSE_TREES 0x00800000 85*4882a593Smuzhiyun #define ACPI_LV_VERBOSITY2 0x00F00000 | ACPI_LV_VERBOSITY1 86*4882a593Smuzhiyun #define ACPI_LV_ALL ACPI_LV_VERBOSITY2 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* Trace verbosity level 3 [Threading, I/O, and Interrupts] */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define ACPI_LV_MUTEX 0x01000000 91*4882a593Smuzhiyun #define ACPI_LV_THREADS 0x02000000 92*4882a593Smuzhiyun #define ACPI_LV_IO 0x04000000 93*4882a593Smuzhiyun #define ACPI_LV_INTERRUPTS 0x08000000 94*4882a593Smuzhiyun #define ACPI_LV_VERBOSITY3 0x0F000000 | ACPI_LV_VERBOSITY2 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Exceptionally verbose output -- also used in the global "DebugLevel" */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define ACPI_LV_AML_DISASSEMBLE 0x10000000 99*4882a593Smuzhiyun #define ACPI_LV_VERBOSE_INFO 0x20000000 100*4882a593Smuzhiyun #define ACPI_LV_FULL_TABLES 0x40000000 101*4882a593Smuzhiyun #define ACPI_LV_EVENTS 0x80000000 102*4882a593Smuzhiyun #define ACPI_LV_VERBOSE 0xF0000000 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * Debug level macros that are used in the DEBUG_PRINT macros 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun #define ACPI_DEBUG_LEVEL(dl) (u32) dl,ACPI_DEBUG_PARAMETERS 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* 110*4882a593Smuzhiyun * Exception level -- used in the global "DebugLevel" 111*4882a593Smuzhiyun * 112*4882a593Smuzhiyun * Note: For errors, use the ACPI_ERROR or ACPI_EXCEPTION interfaces. 113*4882a593Smuzhiyun * For warnings, use ACPI_WARNING. 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun #define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT) 116*4882a593Smuzhiyun #define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT) 117*4882a593Smuzhiyun #define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO) 118*4882a593Smuzhiyun #define ACPI_DB_REPAIR ACPI_DEBUG_LEVEL (ACPI_LV_REPAIR) 119*4882a593Smuzhiyun #define ACPI_DB_TRACE_POINT ACPI_DEBUG_LEVEL (ACPI_LV_TRACE_POINT) 120*4882a593Smuzhiyun #define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* Trace level -- also used in the global "DebugLevel" */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES) 125*4882a593Smuzhiyun #define ACPI_DB_THREADS ACPI_DEBUG_LEVEL (ACPI_LV_THREADS) 126*4882a593Smuzhiyun #define ACPI_DB_PARSE ACPI_DEBUG_LEVEL (ACPI_LV_PARSE) 127*4882a593Smuzhiyun #define ACPI_DB_DISPATCH ACPI_DEBUG_LEVEL (ACPI_LV_DISPATCH) 128*4882a593Smuzhiyun #define ACPI_DB_LOAD ACPI_DEBUG_LEVEL (ACPI_LV_LOAD) 129*4882a593Smuzhiyun #define ACPI_DB_EXEC ACPI_DEBUG_LEVEL (ACPI_LV_EXEC) 130*4882a593Smuzhiyun #define ACPI_DB_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_NAMES) 131*4882a593Smuzhiyun #define ACPI_DB_OPREGION ACPI_DEBUG_LEVEL (ACPI_LV_OPREGION) 132*4882a593Smuzhiyun #define ACPI_DB_BFIELD ACPI_DEBUG_LEVEL (ACPI_LV_BFIELD) 133*4882a593Smuzhiyun #define ACPI_DB_TABLES ACPI_DEBUG_LEVEL (ACPI_LV_TABLES) 134*4882a593Smuzhiyun #define ACPI_DB_FUNCTIONS ACPI_DEBUG_LEVEL (ACPI_LV_FUNCTIONS) 135*4882a593Smuzhiyun #define ACPI_DB_OPTIMIZATIONS ACPI_DEBUG_LEVEL (ACPI_LV_OPTIMIZATIONS) 136*4882a593Smuzhiyun #define ACPI_DB_PARSE_TREES ACPI_DEBUG_LEVEL (ACPI_LV_PARSE_TREES) 137*4882a593Smuzhiyun #define ACPI_DB_VALUES ACPI_DEBUG_LEVEL (ACPI_LV_VALUES) 138*4882a593Smuzhiyun #define ACPI_DB_OBJECTS ACPI_DEBUG_LEVEL (ACPI_LV_OBJECTS) 139*4882a593Smuzhiyun #define ACPI_DB_ALLOCATIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALLOCATIONS) 140*4882a593Smuzhiyun #define ACPI_DB_RESOURCES ACPI_DEBUG_LEVEL (ACPI_LV_RESOURCES) 141*4882a593Smuzhiyun #define ACPI_DB_IO ACPI_DEBUG_LEVEL (ACPI_LV_IO) 142*4882a593Smuzhiyun #define ACPI_DB_INTERRUPTS ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS) 143*4882a593Smuzhiyun #define ACPI_DB_USER_REQUESTS ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS) 144*4882a593Smuzhiyun #define ACPI_DB_PACKAGE ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE) 145*4882a593Smuzhiyun #define ACPI_DB_EVALUATION ACPI_DEBUG_LEVEL (ACPI_LV_EVALUATION) 146*4882a593Smuzhiyun #define ACPI_DB_MUTEX ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX) 147*4882a593Smuzhiyun #define ACPI_DB_EVENTS ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define ACPI_DB_ALL ACPI_DEBUG_LEVEL (ACPI_LV_ALL) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* Defaults for debug_level, debug and normal */ 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #ifndef ACPI_DEBUG_DEFAULT 154*4882a593Smuzhiyun #define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_EVALUATION | ACPI_LV_REPAIR) 155*4882a593Smuzhiyun #endif 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR) 158*4882a593Smuzhiyun #define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* 161*4882a593Smuzhiyun * Global trace flags 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun #define ACPI_TRACE_ENABLED ((u32) 4) 164*4882a593Smuzhiyun #define ACPI_TRACE_ONESHOT ((u32) 2) 165*4882a593Smuzhiyun #define ACPI_TRACE_OPCODE ((u32) 1) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* Defaults for trace debugging level/layer */ 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define ACPI_TRACE_LEVEL_ALL ACPI_LV_ALL 170*4882a593Smuzhiyun #define ACPI_TRACE_LAYER_ALL 0x000001FF 171*4882a593Smuzhiyun #define ACPI_TRACE_LEVEL_DEFAULT ACPI_LV_TRACE_POINT 172*4882a593Smuzhiyun #define ACPI_TRACE_LAYER_DEFAULT ACPI_EXECUTER 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES) 175*4882a593Smuzhiyun /* 176*4882a593Smuzhiyun * The module name is used primarily for error and debug messages. 177*4882a593Smuzhiyun * The __FILE__ macro is not very useful for this, because it 178*4882a593Smuzhiyun * usually includes the entire pathname to the module making the 179*4882a593Smuzhiyun * debug output difficult to read. 180*4882a593Smuzhiyun */ 181*4882a593Smuzhiyun #define ACPI_MODULE_NAME(name) static const char ACPI_UNUSED_VAR _acpi_module_name[] = name; 182*4882a593Smuzhiyun #else 183*4882a593Smuzhiyun /* 184*4882a593Smuzhiyun * For the no-debug and no-error-msg cases, we must at least define 185*4882a593Smuzhiyun * a null module name. 186*4882a593Smuzhiyun */ 187*4882a593Smuzhiyun #define ACPI_MODULE_NAME(name) 188*4882a593Smuzhiyun #define _acpi_module_name "" 189*4882a593Smuzhiyun #endif 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* 192*4882a593Smuzhiyun * Ascii error messages can be configured out 193*4882a593Smuzhiyun */ 194*4882a593Smuzhiyun #ifndef ACPI_NO_ERROR_MESSAGES 195*4882a593Smuzhiyun #define AE_INFO _acpi_module_name, __LINE__ 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* 198*4882a593Smuzhiyun * Error reporting. Callers module and line number are inserted by AE_INFO, 199*4882a593Smuzhiyun * the plist contains a set of parens to allow variable-length lists. 200*4882a593Smuzhiyun * These macros are used for both the debug and non-debug versions of the code. 201*4882a593Smuzhiyun */ 202*4882a593Smuzhiyun #define ACPI_INFO(plist) acpi_info plist 203*4882a593Smuzhiyun #define ACPI_WARNING(plist) acpi_warning plist 204*4882a593Smuzhiyun #define ACPI_EXCEPTION(plist) acpi_exception plist 205*4882a593Smuzhiyun #define ACPI_ERROR(plist) acpi_error plist 206*4882a593Smuzhiyun #define ACPI_BIOS_WARNING(plist) acpi_bios_warning plist 207*4882a593Smuzhiyun #define ACPI_BIOS_EXCEPTION(plist) acpi_bios_exception plist 208*4882a593Smuzhiyun #define ACPI_BIOS_ERROR(plist) acpi_bios_error plist 209*4882a593Smuzhiyun #define ACPI_DEBUG_OBJECT(obj,l,i) acpi_ex_do_debug_object(obj,l,i) 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun #else 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* No error messages */ 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #define ACPI_INFO(plist) 216*4882a593Smuzhiyun #define ACPI_WARNING(plist) 217*4882a593Smuzhiyun #define ACPI_EXCEPTION(plist) 218*4882a593Smuzhiyun #define ACPI_ERROR(plist) 219*4882a593Smuzhiyun #define ACPI_BIOS_WARNING(plist) 220*4882a593Smuzhiyun #define ACPI_BIOS_EXCEPTION(plist) 221*4882a593Smuzhiyun #define ACPI_BIOS_ERROR(plist) 222*4882a593Smuzhiyun #define ACPI_DEBUG_OBJECT(obj,l,i) 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #endif /* ACPI_NO_ERROR_MESSAGES */ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* 227*4882a593Smuzhiyun * Debug macros that are conditionally compiled 228*4882a593Smuzhiyun */ 229*4882a593Smuzhiyun #ifdef ACPI_DEBUG_OUTPUT 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* 232*4882a593Smuzhiyun * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header, 233*4882a593Smuzhiyun * define it now. This is the case where there the compiler does not support 234*4882a593Smuzhiyun * a __func__ macro or equivalent. 235*4882a593Smuzhiyun */ 236*4882a593Smuzhiyun #ifndef ACPI_GET_FUNCTION_NAME 237*4882a593Smuzhiyun #define ACPI_GET_FUNCTION_NAME _acpi_function_name 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* 240*4882a593Smuzhiyun * The Name parameter should be the procedure name as a non-quoted string. 241*4882a593Smuzhiyun * The function name is also used by the function exit macros below. 242*4882a593Smuzhiyun * Note: (const char) is used to be compatible with the debug interfaces 243*4882a593Smuzhiyun * and macros such as __func__. 244*4882a593Smuzhiyun */ 245*4882a593Smuzhiyun #define ACPI_FUNCTION_NAME(name) static const char _acpi_function_name[] = #name; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun #else 248*4882a593Smuzhiyun /* Compiler supports __func__ (or equivalent) -- Ignore this macro */ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun #define ACPI_FUNCTION_NAME(name) 251*4882a593Smuzhiyun #endif /* ACPI_GET_FUNCTION_NAME */ 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* 254*4882a593Smuzhiyun * Common parameters used for debug output functions: 255*4882a593Smuzhiyun * line number, function name, module(file) name, component ID 256*4882a593Smuzhiyun */ 257*4882a593Smuzhiyun #define ACPI_DEBUG_PARAMETERS \ 258*4882a593Smuzhiyun __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* Check if debug output is currently dynamically enabled */ 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #define ACPI_IS_DEBUG_ENABLED(level, component) \ 263*4882a593Smuzhiyun ((level & acpi_dbg_level) && (component & acpi_dbg_layer)) 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun /* 266*4882a593Smuzhiyun * Master debug print macros 267*4882a593Smuzhiyun * Print message if and only if: 268*4882a593Smuzhiyun * 1) Debug print for the current component is enabled 269*4882a593Smuzhiyun * 2) Debug error level or trace level for the print statement is enabled 270*4882a593Smuzhiyun * 271*4882a593Smuzhiyun * November 2012: Moved the runtime check for whether to actually emit the 272*4882a593Smuzhiyun * debug message outside of the print function itself. This improves overall 273*4882a593Smuzhiyun * performance at a relatively small code cost. Implementation involves the 274*4882a593Smuzhiyun * use of variadic macros supported by C99. 275*4882a593Smuzhiyun * 276*4882a593Smuzhiyun * Note: the ACPI_DO_WHILE0 macro is used to prevent some compilers from 277*4882a593Smuzhiyun * complaining about these constructs. On other compilers the do...while 278*4882a593Smuzhiyun * adds some extra code, so this feature is optional. 279*4882a593Smuzhiyun */ 280*4882a593Smuzhiyun #ifdef ACPI_USE_DO_WHILE_0 281*4882a593Smuzhiyun #define ACPI_DO_WHILE0(a) do a while(0) 282*4882a593Smuzhiyun #else 283*4882a593Smuzhiyun #define ACPI_DO_WHILE0(a) a 284*4882a593Smuzhiyun #endif 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* DEBUG_PRINT functions */ 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun #ifndef COMPILER_VA_MACRO 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT(plist) acpi_debug_print plist 291*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT_RAW(plist) acpi_debug_print_raw plist 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun #else 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /* Helper macros for DEBUG_PRINT */ 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun #define ACPI_DO_DEBUG_PRINT(function, level, line, filename, modulename, component, ...) \ 298*4882a593Smuzhiyun ACPI_DO_WHILE0 ({ \ 299*4882a593Smuzhiyun if (ACPI_IS_DEBUG_ENABLED (level, component)) \ 300*4882a593Smuzhiyun { \ 301*4882a593Smuzhiyun function (level, line, filename, modulename, component, __VA_ARGS__); \ 302*4882a593Smuzhiyun } \ 303*4882a593Smuzhiyun }) 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #define ACPI_ACTUAL_DEBUG(level, line, filename, modulename, component, ...) \ 306*4882a593Smuzhiyun ACPI_DO_DEBUG_PRINT (acpi_debug_print, level, line, \ 307*4882a593Smuzhiyun filename, modulename, component, __VA_ARGS__) 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun #define ACPI_ACTUAL_DEBUG_RAW(level, line, filename, modulename, component, ...) \ 310*4882a593Smuzhiyun ACPI_DO_DEBUG_PRINT (acpi_debug_print_raw, level, line, \ 311*4882a593Smuzhiyun filename, modulename, component, __VA_ARGS__) 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT(plist) ACPI_ACTUAL_DEBUG plist 314*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT_RAW(plist) ACPI_ACTUAL_DEBUG_RAW plist 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun #endif 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /* 319*4882a593Smuzhiyun * Function entry tracing 320*4882a593Smuzhiyun * 321*4882a593Smuzhiyun * The name of the function is emitted as a local variable that is 322*4882a593Smuzhiyun * intended to be used by both the entry trace and the exit trace. 323*4882a593Smuzhiyun */ 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /* Helper macro */ 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #define ACPI_TRACE_ENTRY(name, function, type, param) \ 328*4882a593Smuzhiyun ACPI_FUNCTION_NAME (name) \ 329*4882a593Smuzhiyun function (ACPI_DEBUG_PARAMETERS, (type) (param)) 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun /* The actual entry trace macros */ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE(name) \ 334*4882a593Smuzhiyun ACPI_FUNCTION_NAME(name) \ 335*4882a593Smuzhiyun acpi_ut_trace (ACPI_DEBUG_PARAMETERS) 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_PTR(name, pointer) \ 338*4882a593Smuzhiyun ACPI_TRACE_ENTRY (name, acpi_ut_trace_ptr, void *, pointer) 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_U32(name, value) \ 341*4882a593Smuzhiyun ACPI_TRACE_ENTRY (name, acpi_ut_trace_u32, u32, value) 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_STR(name, string) \ 344*4882a593Smuzhiyun ACPI_TRACE_ENTRY (name, acpi_ut_trace_str, const char *, string) 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun #define ACPI_FUNCTION_ENTRY() \ 347*4882a593Smuzhiyun acpi_ut_track_stack_ptr() 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun /* 350*4882a593Smuzhiyun * Function exit tracing 351*4882a593Smuzhiyun * 352*4882a593Smuzhiyun * These macros include a return statement. This is usually considered 353*4882a593Smuzhiyun * bad form, but having a separate exit macro before the actual return 354*4882a593Smuzhiyun * is very ugly and difficult to maintain. 355*4882a593Smuzhiyun * 356*4882a593Smuzhiyun * One of the FUNCTION_TRACE macros above must be used in conjunction 357*4882a593Smuzhiyun * with these macros so that "_AcpiFunctionName" is defined. 358*4882a593Smuzhiyun * 359*4882a593Smuzhiyun * There are two versions of most of the return macros. The default version is 360*4882a593Smuzhiyun * safer, since it avoids side-effects by guaranteeing that the argument will 361*4882a593Smuzhiyun * not be evaluated twice. 362*4882a593Smuzhiyun * 363*4882a593Smuzhiyun * A less-safe version of the macros is provided for optional use if the 364*4882a593Smuzhiyun * compiler uses excessive CPU stack (for example, this may happen in the 365*4882a593Smuzhiyun * debug case if code optimzation is disabled.) 366*4882a593Smuzhiyun */ 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun /* Exit trace helper macro */ 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun #ifndef ACPI_SIMPLE_RETURN_MACROS 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun #define ACPI_TRACE_EXIT(function, type, param) \ 373*4882a593Smuzhiyun ACPI_DO_WHILE0 ({ \ 374*4882a593Smuzhiyun register type _param = (type) (param); \ 375*4882a593Smuzhiyun function (ACPI_DEBUG_PARAMETERS, _param); \ 376*4882a593Smuzhiyun return (_param); \ 377*4882a593Smuzhiyun }) 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun #else /* Use original less-safe macros */ 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun #define ACPI_TRACE_EXIT(function, type, param) \ 382*4882a593Smuzhiyun ACPI_DO_WHILE0 ({ \ 383*4882a593Smuzhiyun function (ACPI_DEBUG_PARAMETERS, (type) (param)); \ 384*4882a593Smuzhiyun return (param); \ 385*4882a593Smuzhiyun }) 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun #endif /* ACPI_SIMPLE_RETURN_MACROS */ 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* The actual exit macros */ 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun #define return_VOID \ 392*4882a593Smuzhiyun ACPI_DO_WHILE0 ({ \ 393*4882a593Smuzhiyun acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \ 394*4882a593Smuzhiyun return; \ 395*4882a593Smuzhiyun }) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun #define return_ACPI_STATUS(status) \ 398*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_status_exit, acpi_status, status) 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun #define return_PTR(pointer) \ 401*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_ptr_exit, void *, pointer) 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun #define return_STR(string) \ 404*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_str_exit, const char *, string) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun #define return_VALUE(value) \ 407*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_value_exit, u64, value) 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun #define return_UINT32(value) \ 410*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_value_exit, u32, value) 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun #define return_UINT8(value) \ 413*4882a593Smuzhiyun ACPI_TRACE_EXIT (acpi_ut_value_exit, u8, value) 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* Conditional execution */ 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun #define ACPI_DEBUG_EXEC(a) a 418*4882a593Smuzhiyun #define ACPI_DEBUG_ONLY_MEMBERS(a) a; 419*4882a593Smuzhiyun #define _VERBOSE_STRUCTURES 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun /* Various object display routines for debug */ 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun #define ACPI_DUMP_STACK_ENTRY(a) acpi_ex_dump_operand((a), 0) 424*4882a593Smuzhiyun #define ACPI_DUMP_OPERANDS(a, b ,c) acpi_ex_dump_operands(a, b, c) 425*4882a593Smuzhiyun #define ACPI_DUMP_ENTRY(a, b) acpi_ns_dump_entry (a, b) 426*4882a593Smuzhiyun #define ACPI_DUMP_PATHNAME(a, b, c, d) acpi_ns_dump_pathname(a, b, c, d) 427*4882a593Smuzhiyun #define ACPI_DUMP_BUFFER(a, b) acpi_ut_debug_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT) 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun #define ACPI_TRACE_POINT(a, b, c, d) acpi_trace_point (a, b, c, d) 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun #else /* ACPI_DEBUG_OUTPUT */ 432*4882a593Smuzhiyun /* 433*4882a593Smuzhiyun * This is the non-debug case -- make everything go away, 434*4882a593Smuzhiyun * leaving no executable debug code! 435*4882a593Smuzhiyun */ 436*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT(pl) 437*4882a593Smuzhiyun #define ACPI_DEBUG_PRINT_RAW(pl) 438*4882a593Smuzhiyun #define ACPI_DEBUG_EXEC(a) 439*4882a593Smuzhiyun #define ACPI_DEBUG_ONLY_MEMBERS(a) 440*4882a593Smuzhiyun #define ACPI_FUNCTION_NAME(a) 441*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE(a) 442*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_PTR(a, b) 443*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_U32(a, b) 444*4882a593Smuzhiyun #define ACPI_FUNCTION_TRACE_STR(a, b) 445*4882a593Smuzhiyun #define ACPI_FUNCTION_ENTRY() 446*4882a593Smuzhiyun #define ACPI_DUMP_STACK_ENTRY(a) 447*4882a593Smuzhiyun #define ACPI_DUMP_OPERANDS(a, b, c) 448*4882a593Smuzhiyun #define ACPI_DUMP_ENTRY(a, b) 449*4882a593Smuzhiyun #define ACPI_DUMP_PATHNAME(a, b, c, d) 450*4882a593Smuzhiyun #define ACPI_DUMP_BUFFER(a, b) 451*4882a593Smuzhiyun #define ACPI_IS_DEBUG_ENABLED(level, component) 0 452*4882a593Smuzhiyun #define ACPI_TRACE_POINT(a, b, c, d) 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* Return macros must have a return statement at the minimum */ 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun #define return_VOID return 457*4882a593Smuzhiyun #define return_ACPI_STATUS(s) return(s) 458*4882a593Smuzhiyun #define return_PTR(s) return(s) 459*4882a593Smuzhiyun #define return_STR(s) return(s) 460*4882a593Smuzhiyun #define return_VALUE(s) return(s) 461*4882a593Smuzhiyun #define return_UINT8(s) return(s) 462*4882a593Smuzhiyun #define return_UINT32(s) return(s) 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun #endif /* ACPI_DEBUG_OUTPUT */ 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun #endif /* __ACOUTPUT_H__ */ 467