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