1*fb403678SAdrian Chadd /*- 2*fb403678SAdrian Chadd * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com> 3*fb403678SAdrian Chadd * All rights reserved. 4*fb403678SAdrian Chadd * 5*fb403678SAdrian Chadd * Redistribution and use in source and binary forms, with or without 6*fb403678SAdrian Chadd * modification, are permitted provided that the following conditions 7*fb403678SAdrian Chadd * are met: 8*fb403678SAdrian Chadd * 1. Redistributions of source code must retain the above copyright 9*fb403678SAdrian Chadd * notice, this list of conditions and the following disclaimer, 10*fb403678SAdrian Chadd * without modification. 11*fb403678SAdrian Chadd * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12*fb403678SAdrian Chadd * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 13*fb403678SAdrian Chadd * redistribution must be conditioned upon including a substantially 14*fb403678SAdrian Chadd * similar Disclaimer requirement for further binary redistribution. 15*fb403678SAdrian Chadd * 16*fb403678SAdrian Chadd * NO WARRANTY 17*fb403678SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*fb403678SAdrian Chadd * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*fb403678SAdrian Chadd * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 20*fb403678SAdrian Chadd * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21*fb403678SAdrian Chadd * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22*fb403678SAdrian Chadd * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*fb403678SAdrian Chadd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*fb403678SAdrian Chadd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*fb403678SAdrian Chadd * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*fb403678SAdrian Chadd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27*fb403678SAdrian Chadd * THE POSSIBILITY OF SUCH DAMAGES. 28*fb403678SAdrian Chadd */ 29*fb403678SAdrian Chadd 30*fb403678SAdrian Chadd /* $FreeBSD$ */ 31*fb403678SAdrian Chadd 32*fb403678SAdrian Chadd /* 33*fb403678SAdrian Chadd * This file provides set of macros for logging: 34*fb403678SAdrian Chadd * - BHND_<LEVEL> and 35*fb403678SAdrian Chadd * - BHND_<LEVEL>_DEV 36*fb403678SAdrian Chadd * where LEVEL = {ERROR,WARN,INFO,DEBUG} 37*fb403678SAdrian Chadd * 38*fb403678SAdrian Chadd * BHND_<LEVEL> macros is proxies to printf call and accept same parameters, 39*fb403678SAdrian Chadd * for instance: 40*fb403678SAdrian Chadd * BHND_INFO("register %d has value %d", reg, val); 41*fb403678SAdrian Chadd * 42*fb403678SAdrian Chadd * BHND_<LEVEL>_DEV macros is proxies to device_printf call and accept 43*fb403678SAdrian Chadd * same parameters, for instance: 44*fb403678SAdrian Chadd * BHND_INFO_DEV(dev, "register %d has value %d", reg, val); 45*fb403678SAdrian Chadd * 46*fb403678SAdrian Chadd * All macros contains newline char at the end of each call 47*fb403678SAdrian Chadd * 48*fb403678SAdrian Chadd * ERROR, WARN, INFO messages are printed only if: 49*fb403678SAdrian Chadd * - log message level is lower than BHND_LOGGING (logging threshold) 50*fb403678SAdrian Chadd * 51*fb403678SAdrian Chadd * DEBUG, TRACE messages are printed only if: 52*fb403678SAdrian Chadd * - bootverbose and 53*fb403678SAdrian Chadd * - log message level is lower than BHND_LOGGING (logging threshold) 54*fb403678SAdrian Chadd * 55*fb403678SAdrian Chadd * In addition, for debugging purpose log message contains information about 56*fb403678SAdrian Chadd * file name and line number if BHND_LOGGING is more than BHND_INFO_LEVEL 57*fb403678SAdrian Chadd * 58*fb403678SAdrian Chadd * NOTE: macros starting with underscore (_) are private and should be not used 59*fb403678SAdrian Chadd * 60*fb403678SAdrian Chadd * To override logging (for instance, force tracing), you can use: 61*fb403678SAdrian Chadd * - "options BHND_LOGLEVEL=BHND_TRACE_LEVEL" in kernel configuration 62*fb403678SAdrian Chadd * - "#define BHND_LOGGING BHND_TRACE_LEVEL" in source code file 63*fb403678SAdrian Chadd * 64*fb403678SAdrian Chadd * NOTE: kernel config option doesn't override log level defined on file level, 65*fb403678SAdrian Chadd * so try to avoid "#define BHND_LOGGING" 66*fb403678SAdrian Chadd */ 67*fb403678SAdrian Chadd 68*fb403678SAdrian Chadd #ifndef _BHND_BHND_DEBUG_H_ 69*fb403678SAdrian Chadd #define _BHND_BHND_DEBUG_H_ 70*fb403678SAdrian Chadd 71*fb403678SAdrian Chadd #include <sys/systm.h> 72*fb403678SAdrian Chadd 73*fb403678SAdrian Chadd #include "opt_global.h" 74*fb403678SAdrian Chadd 75*fb403678SAdrian Chadd #define BHND_ERROR_LEVEL 0x00 76*fb403678SAdrian Chadd #define BHND_ERROR_MSG "ERROR" 77*fb403678SAdrian Chadd #define BHND_WARN_LEVEL 0x10 78*fb403678SAdrian Chadd #define BHND_WARN_MSG "!WARN" 79*fb403678SAdrian Chadd #define BHND_INFO_LEVEL 0x20 80*fb403678SAdrian Chadd #define BHND_INFO_MSG " info" 81*fb403678SAdrian Chadd #define BHND_DEBUG_LEVEL 0x30 82*fb403678SAdrian Chadd #define BHND_DEBUG_MSG "debug" 83*fb403678SAdrian Chadd #define BHND_TRACE_LEVEL 0x40 84*fb403678SAdrian Chadd #define BHND_TRACE_MSG "trace" 85*fb403678SAdrian Chadd 86*fb403678SAdrian Chadd #if !(defined(BHND_LOGGING)) 87*fb403678SAdrian Chadd #if !(defined(BHND_LOGLEVEL)) 88*fb403678SAdrian Chadd /* By default logging will print only INFO+ message*/ 89*fb403678SAdrian Chadd #define BHND_LOGGING BHND_INFO_LEVEL 90*fb403678SAdrian Chadd #else /* defined(BHND_LOGLEVEL) */ 91*fb403678SAdrian Chadd /* Kernel configuration specifies logging level */ 92*fb403678SAdrian Chadd #define BHND_LOGGING BHND_LOGLEVEL 93*fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGLEVEL)) */ 94*fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGGING)) */ 95*fb403678SAdrian Chadd 96*fb403678SAdrian Chadd #if BHND_LOGGING > BHND_INFO_LEVEL 97*fb403678SAdrian Chadd #define _BHND_PRINT(fn, level, fmt, ...) \ 98*fb403678SAdrian Chadd do { \ 99*fb403678SAdrian Chadd if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ 100*fb403678SAdrian Chadd fn "[BHND " level##MSG "] %s:%d => " fmt "\n", \ 101*fb403678SAdrian Chadd __func__, __LINE__, ## __VA_ARGS__); \ 102*fb403678SAdrian Chadd } while(0); 103*fb403678SAdrian Chadd #else /* BHND_LOGGING <= BHND_INFO_LEVEL */ 104*fb403678SAdrian Chadd #define _BHND_PRINT(fn, level, fmt, ...) \ 105*fb403678SAdrian Chadd do { \ 106*fb403678SAdrian Chadd if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ 107*fb403678SAdrian Chadd fn "bhnd: " fmt "\n", ## __VA_ARGS__); \ 108*fb403678SAdrian Chadd } while(0); 109*fb403678SAdrian Chadd #endif /* BHND_LOGGING > BHND_INFO_LEVEL */ 110*fb403678SAdrian Chadd 111*fb403678SAdrian Chadd 112*fb403678SAdrian Chadd #define _BHND_RAWPRINTFN printf( 113*fb403678SAdrian Chadd #define _BHND_DEVPRINTFN(dev) device_printf(dev, 114*fb403678SAdrian Chadd 115*fb403678SAdrian Chadd #define _BHND_LOGPRINT(level, fmt, ...) \ 116*fb403678SAdrian Chadd _BHND_PRINT(_BHND_RAWPRINTFN, level, fmt, ## __VA_ARGS__) 117*fb403678SAdrian Chadd #define _BHND_DEVPRINT(dev, level, fmt, ...) \ 118*fb403678SAdrian Chadd _BHND_PRINT(_BHND_DEVPRINTFN(dev), level, fmt, ## __VA_ARGS__) 119*fb403678SAdrian Chadd 120*fb403678SAdrian Chadd #define BHND_ERROR(fmt, ...) \ 121*fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_ERROR_, fmt, ## __VA_ARGS__); 122*fb403678SAdrian Chadd #define BHND_ERROR_DEV(dev, fmt, ...) \ 123*fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_ERROR_, fmt, ## __VA_ARGS__) 124*fb403678SAdrian Chadd 125*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_WARN_LEVEL 126*fb403678SAdrian Chadd #define BHND_WARN(fmt, ...) \ 127*fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_WARN_, fmt, ## __VA_ARGS__) 128*fb403678SAdrian Chadd #define BHND_WARN_DEV(dev, fmt, ...) \ 129*fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_WARN_, fmt, ## __VA_ARGS__) 130*fb403678SAdrian Chadd 131*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_INFO_LEVEL 132*fb403678SAdrian Chadd #define BHND_INFO(fmt, ...) \ 133*fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_INFO_, fmt, ## __VA_ARGS__) 134*fb403678SAdrian Chadd #define BHND_INFO_DEV(dev, fmt, ...) \ 135*fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_INFO_, fmt, ## __VA_ARGS__) 136*fb403678SAdrian Chadd 137*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_DEBUG_LEVEL 138*fb403678SAdrian Chadd #define BHND_DEBUG(fmt, ...) \ 139*fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_DEBUG_, fmt, ## __VA_ARGS__) 140*fb403678SAdrian Chadd #define BHND_DEBUG_DEV(dev, fmt, ...) \ 141*fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_DEBUG_, fmt, ## __VA_ARGS__) 142*fb403678SAdrian Chadd 143*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_TRACE_LEVEL 144*fb403678SAdrian Chadd #define BHND_TRACE(fmt, ...) \ 145*fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_TRACE_, fmt, ## __VA_ARGS__) 146*fb403678SAdrian Chadd #define BHND_TRACE_DEV(dev, fmt, ...) \ 147*fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_TRACE_, fmt, ## __VA_ARGS__) 148*fb403678SAdrian Chadd 149*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_TRACE_LEVEL */ 150*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_DEBUG_LEVEL */ 151*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_INFO_LEVEL */ 152*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_WARN_LEVEL */ 153*fb403678SAdrian Chadd 154*fb403678SAdrian Chadd /* 155*fb403678SAdrian Chadd * Empty defines without device context 156*fb403678SAdrian Chadd */ 157*fb403678SAdrian Chadd #if !(defined(BHND_WARN)) 158*fb403678SAdrian Chadd #define BHND_WARN(fmt, ...); 159*fb403678SAdrian Chadd #endif 160*fb403678SAdrian Chadd 161*fb403678SAdrian Chadd #if !(defined(BHND_INFO)) 162*fb403678SAdrian Chadd #define BHND_INFO(fmt, ...); 163*fb403678SAdrian Chadd #endif 164*fb403678SAdrian Chadd 165*fb403678SAdrian Chadd #if !(defined(BHND_DEBUG)) 166*fb403678SAdrian Chadd #define BHND_DEBUG(fmt, ...); 167*fb403678SAdrian Chadd #endif 168*fb403678SAdrian Chadd 169*fb403678SAdrian Chadd #if !(defined(BHND_TRACE)) 170*fb403678SAdrian Chadd #define BHND_TRACE(fmt, ...); 171*fb403678SAdrian Chadd #endif 172*fb403678SAdrian Chadd 173*fb403678SAdrian Chadd /* 174*fb403678SAdrian Chadd * Empty defines with device context 175*fb403678SAdrian Chadd */ 176*fb403678SAdrian Chadd #if !(defined(BHND_WARN_DEV)) 177*fb403678SAdrian Chadd #define BHND_WARN_DEV(dev, fmt, ...); 178*fb403678SAdrian Chadd #endif 179*fb403678SAdrian Chadd 180*fb403678SAdrian Chadd #if !(defined(BHND_INFO_DEV)) 181*fb403678SAdrian Chadd #define BHND_INFO_DEV(dev, fmt, ...); 182*fb403678SAdrian Chadd #endif 183*fb403678SAdrian Chadd 184*fb403678SAdrian Chadd #if !(defined(BHND_DEBUG_DEV)) 185*fb403678SAdrian Chadd #define BHND_DEBUG_DEV(dev, fmt, ...); 186*fb403678SAdrian Chadd #endif 187*fb403678SAdrian Chadd 188*fb403678SAdrian Chadd #if !(defined(BHND_TRACE_DEV)) 189*fb403678SAdrian Chadd #define BHND_TRACE_DEV(dev, fmt, ...); 190*fb403678SAdrian Chadd #endif 191*fb403678SAdrian Chadd 192*fb403678SAdrian Chadd #endif /* _BHND_BHND_DEBUG_H_ */ 193