1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 2002-2005 Neterion, Inc. 24 * All right Reserved. 25 * 26 * FileName : xge-debug.h 27 * 28 * Description: debug facilities 29 * 30 * Created: 6 May 2004 31 */ 32 33 #ifndef XGE_DEBUG_H 34 #define XGE_DEBUG_H 35 36 #include "xge-os-pal.h" 37 38 /* to make some gcc versions happier */ 39 #ifndef __func__ 40 #define __func__ __FUNCTION__ 41 #endif 42 43 #ifdef XGE_DEBUG_FP 44 #define XGE_DEBUG_FP_DEVICE 0x1 45 #define XGE_DEBUG_FP_CHANNEL 0x2 46 #define XGE_DEBUG_FP_FIFO 0x4 47 #define XGE_DEBUG_FP_RING 0x8 48 #endif 49 50 /** 51 * enum xge_debug_level_e 52 * @XGE_NONE: debug disabled 53 * @XGE_ERR: all errors going to be logged out 54 * @XGE_TRACE: all errors plus all kind of verbose tracing print outs 55 * going to be logged out. Very noisy. 56 * 57 * This enumeration going to be used to switch between different 58 * debug levels during runtime if DEBUG macro defined during 59 * compilation. If DEBUG macro not defined than code will be 60 * compiled out. 61 */ 62 typedef enum xge_debug_level_e { 63 XGE_NONE = 0, 64 XGE_TRACE = 1, 65 XGE_ERR = 2, 66 } xge_debug_level_e; 67 68 #define XGE_DEBUG_MODULE_MASK_DEF 0x00003030 69 #define XGE_DEBUG_LEVEL_DEF XGE_ERR 70 71 #if defined(XGE_DEBUG_TRACE_MASK) || defined(XGE_DEBUG_ERR_MASK) 72 73 extern unsigned int *g_module_mask; 74 extern int *g_level; 75 76 #ifndef XGE_DEBUG_TRACE_MASK 77 #define XGE_DEBUG_TRACE_MASK 0 78 #endif 79 80 #ifndef XGE_DEBUG_ERR_MASK 81 #define XGE_DEBUG_ERR_MASK 0 82 #endif 83 84 /* 85 * @XGE_COMPONENT_HAL_CONFIG: do debug for xge core config module 86 * @XGE_COMPONENT_HAL_FIFO: do debug for xge core fifo module 87 * @XGE_COMPONENT_HAL_RING: do debug for xge core ring module 88 * @XGE_COMPONENT_HAL_CHANNEL: do debug for xge core channel module 89 * @XGE_COMPONENT_HAL_DEVICE: do debug for xge core device module 90 * @XGE_COMPONENT_CORE: do debug for xge KMA core module 91 * @XGE_COMPONENT_OSDEP: do debug for xge KMA os dependent parts 92 * @XGE_COMPONENT_LL: do debug for xge link layer module 93 * @XGE_COMPONENT_ALL: activate debug for all modules with no exceptions 94 * 95 * This enumeration going to be used to distinguish modules 96 * or libraries during compilation and runtime. Makefile must declare 97 * XGE_DEBUG_MODULE_MASK macro and set it to proper value. 98 */ 99 #define XGE_COMPONENT_HAL_CONFIG 0x1 100 #define XGE_COMPONENT_HAL_FIFO 0x2 101 #define XGE_COMPONENT_HAL_RING 0x4 102 #define XGE_COMPONENT_HAL_CHANNEL 0x8 103 #define XGE_COMPONENT_HAL_DEVICE 0x10 104 #define XGE_COMPONENT_HAL_MM 0x20 105 #define XGE_COMPONENT_HAL_QUEUE 0x40 106 #define XGE_COMPONENT_HAL_STATS 0x100 107 /* space for CORE_XXX */ 108 #define XGE_COMPONENT_OSDEP 0x1000 109 #define XGE_COMPONENT_LL 0x2000 110 #define XGE_COMPONENT_ALL 0xffffffff 111 112 #ifndef XGE_DEBUG_MODULE_MASK 113 #error "XGE_DEBUG_MODULE_MASK macro must be defined for DEBUG mode..." 114 #endif 115 116 #ifndef __GNUC__ 117 #ifdef XGE_TRACE_INTO_CIRCULAR_ARR 118 #define xge_trace_aux(fmt) xge_os_vatrace(g_xge_os_tracebuf, fmt) 119 #else 120 #define xge_trace_aux(fmt) xge_os_vaprintf(fmt) 121 #endif 122 123 /** 124 * xge_debug 125 * @level: level of debug verbosity. 126 * @fmt: printf like format string 127 * 128 * Provides logging facilities. Can be customized on per-module 129 * basis or/and with debug levels. Input parameters, except 130 * module and level, are the same as posix printf. This function 131 * may be compiled out if DEBUG macro was never defined. 132 * See also: xge_debug_level_e{}. 133 */ 134 #define xge_debug(module, level, fmt) { \ 135 if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \ 136 (level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \ 137 level >= *g_level && module & *g_module_mask) { \ 138 xge_trace_aux(fmt); \ 139 } \ 140 } 141 #else /* __GNUC__ */ 142 143 #ifdef XGE_TRACE_INTO_CIRCULAR_ARR 144 #define xge_trace_aux(fmt...) xge_os_trace(g_xge_os_tracebuf, fmt) 145 #else 146 #define xge_trace_aux(fmt...) xge_os_printf(fmt) 147 #endif 148 149 #define xge_debug(module, level, fmt...) { \ 150 if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \ 151 (level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \ 152 level >= *g_level && module & *g_module_mask) { \ 153 xge_trace_aux(fmt); \ 154 } \ 155 } 156 #endif /* __GNUC__ */ 157 158 #if (XGE_COMPONENT_HAL_STATS & XGE_DEBUG_MODULE_MASK) 159 #ifndef __GNUC__ 160 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) { 161 u32 module = XGE_COMPONENT_HAL_STATS; 162 xge_debug(module, level, fmt); 163 } 164 #else /* __GNUC__ */ 165 #define xge_debug_stats(level, fmt...) \ 166 xge_debug(XGE_COMPONENT_HAL_STATS, level, fmt) 167 #endif /* __GNUC__ */ 168 #else 169 #ifndef __GNUC__ 170 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {} 171 #else /* __GNUC__ */ 172 #define xge_debug_stats(level, fmt...) 173 #endif /* __GNUC__ */ 174 #endif 175 176 #if (XGE_COMPONENT_HAL_QUEUE & XGE_DEBUG_MODULE_MASK) 177 #ifndef __GNUC__ 178 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) { 179 u32 module = XGE_COMPONENT_HAL_QUEUE; 180 xge_debug(module, level, fmt); 181 } 182 #else /* __GNUC__ */ 183 #define xge_debug_queue(level, fmt...) \ 184 xge_debug(XGE_COMPONENT_HAL_QUEUE, level, fmt) 185 #endif /* __GNUC__ */ 186 #else 187 #ifndef __GNUC__ 188 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, 189 ...) {} 190 #else /* __GNUC__ */ 191 #define xge_debug_queue(level, fmt...) 192 #endif /* __GNUC__ */ 193 #endif 194 195 #if (XGE_COMPONENT_HAL_MM & XGE_DEBUG_MODULE_MASK) 196 #ifndef __GNUC__ 197 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) 198 { 199 u32 module = XGE_COMPONENT_HAL_MM; 200 xge_debug(module, level, fmt); 201 } 202 #else /* __GNUC__ */ 203 #define xge_debug_mm(level, fmt...) \ 204 xge_debug(XGE_COMPONENT_HAL_MM, level, fmt) 205 #endif /* __GNUC__ */ 206 #else 207 #ifndef __GNUC__ 208 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) 209 {} 210 #else /* __GNUC__ */ 211 #define xge_debug_mm(level, fmt...) 212 #endif /* __GNUC__ */ 213 #endif 214 215 #if (XGE_COMPONENT_HAL_CONFIG & XGE_DEBUG_MODULE_MASK) 216 #ifndef __GNUC__ 217 static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) { 218 u32 module = XGE_COMPONENT_HAL_CONFIG; 219 xge_debug(module, level, fmt); 220 } 221 #else /* __GNUC__ */ 222 #define xge_debug_config(level, fmt...) \ 223 xge_debug(XGE_COMPONENT_HAL_CONFIG, level, fmt) 224 #endif /* __GNUC__ */ 225 #else 226 #ifndef __GNUC__ 227 static inline void xge_debug_config(xge_debug_level_e level, char *fmt, 228 ...) {} 229 #else /* __GNUC__ */ 230 #define xge_debug_config(level, fmt...) 231 #endif /* __GNUC__ */ 232 #endif 233 234 #if (XGE_COMPONENT_HAL_FIFO & XGE_DEBUG_MODULE_MASK) 235 #ifndef __GNUC__ 236 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) { 237 u32 module = XGE_COMPONENT_HAL_FIFO; 238 xge_debug(module, level, fmt); 239 } 240 #else /* __GNUC__ */ 241 #define xge_debug_fifo(level, fmt...) \ 242 xge_debug(XGE_COMPONENT_HAL_FIFO, level, fmt) 243 #endif /* __GNUC__ */ 244 #else 245 #ifndef __GNUC__ 246 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {} 247 #else /* __GNUC__ */ 248 #define xge_debug_fifo(level, fmt...) 249 #endif /* __GNUC__ */ 250 #endif 251 252 #if (XGE_COMPONENT_HAL_RING & XGE_DEBUG_MODULE_MASK) 253 #ifndef __GNUC__ 254 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) { 255 u32 module = XGE_COMPONENT_HAL_RING; 256 xge_debug(module, level, fmt); 257 } 258 #else /* __GNUC__ */ 259 #define xge_debug_ring(level, fmt...) \ 260 xge_debug(XGE_COMPONENT_HAL_RING, level, fmt) 261 #endif /* __GNUC__ */ 262 #else 263 #ifndef __GNUC__ 264 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {} 265 #else /* __GNUC__ */ 266 #define xge_debug_ring(level, fmt...) 267 #endif /* __GNUC__ */ 268 #endif 269 270 #if (XGE_COMPONENT_HAL_CHANNEL & XGE_DEBUG_MODULE_MASK) 271 #ifndef __GNUC__ 272 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) { 273 u32 module = XGE_COMPONENT_HAL_CHANNEL; 274 xge_debug(module, level, fmt); 275 } 276 #else /* __GNUC__ */ 277 #define xge_debug_channel(level, fmt...) \ 278 xge_debug(XGE_COMPONENT_HAL_CHANNEL, level, fmt) 279 #endif /* __GNUC__ */ 280 #else 281 #ifndef __GNUC__ 282 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {} 283 #else /* __GNUC__ */ 284 #define xge_debug_channel(level, fmt...) 285 #endif /* __GNUC__ */ 286 #endif 287 288 #if (XGE_COMPONENT_HAL_DEVICE & XGE_DEBUG_MODULE_MASK) 289 #ifndef __GNUC__ 290 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) { 291 u32 module = XGE_COMPONENT_HAL_DEVICE; 292 xge_debug(module, level, fmt); 293 } 294 #else /* __GNUC__ */ 295 #define xge_debug_device(level, fmt...) \ 296 xge_debug(XGE_COMPONENT_HAL_DEVICE, level, fmt) 297 #endif /* __GNUC__ */ 298 #else 299 #ifndef __GNUC__ 300 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {} 301 #else /* __GNUC__ */ 302 #define xge_debug_device(level, fmt...) 303 #endif /* __GNUC__ */ 304 #endif 305 306 #if (XGE_COMPONENT_OSDEP & XGE_DEBUG_MODULE_MASK) 307 #ifndef __GNUC__ 308 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) { 309 u32 module = XGE_COMPONENT_OSDEP; 310 xge_debug(module, level, fmt); 311 } 312 #else /* __GNUC__ */ 313 #define xge_debug_osdep(level, fmt...) \ 314 xge_debug(XGE_COMPONENT_OSDEP, level, fmt) 315 #endif /* __GNUC__ */ 316 #else 317 #ifndef __GNUC__ 318 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {} 319 #else /* __GNUC__ */ 320 #define xge_debug_osdep(level, fmt...) 321 #endif /* __GNUC__ */ 322 #endif 323 324 #if (XGE_COMPONENT_LL & XGE_DEBUG_MODULE_MASK) 325 #ifndef __GNUC__ 326 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) 327 { 328 u32 module = XGE_COMPONENT_LL; 329 xge_debug(module, level, fmt); 330 } 331 #else /* __GNUC__ */ 332 #define xge_debug_ll(level, fmt...) \ 333 xge_debug(XGE_COMPONENT_LL, level, fmt) 334 #endif /* __GNUC__ */ 335 #else 336 #ifndef __GNUC__ 337 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {} 338 #else /* __GNUC__ */ 339 #define xge_debug_ll(level, fmt...) 340 #endif /* __GNUC__ */ 341 #endif 342 343 #else 344 345 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {} 346 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {} 347 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) {} 348 static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {} 349 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {} 350 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {} 351 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {} 352 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {} 353 static inline void xge_debug_hal(xge_debug_level_e level, char *fmt, ...) {} 354 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {} 355 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {} 356 357 #endif /* end of XGE_DEBUG_*_MASK */ 358 359 #ifdef XGE_DEBUG_ASSERT 360 361 /** 362 * xge_assert 363 * @test: C-condition to check 364 * @fmt: printf like format string 365 * 366 * This function implements traditional assert. By default assertions 367 * are enabled. It can be disabled by defining XGE_DEBUG_ASSERT macro in 368 * compilation 369 * time. 370 */ 371 #define xge_assert(test) { \ 372 if (!(test)) xge_os_bug("bad cond: "#test" at %s:%d\n", \ 373 __FILE__, __LINE__); } 374 #else 375 #define xge_assert(test) 376 #endif /* end of XGE_DEBUG_ASSERT */ 377 378 #endif /* XGE_DEBUG_H */ 379