File: /Users/paulross/dev/linux/linux-3.13/include/linux/dynamic_debug.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: #ifndef _DYNAMIC_DEBUG_H
       2: #define _DYNAMIC_DEBUG_H
       3: 
       4: /*
       5:  * An instance of this structure is created in a special
       6:  * ELF section at every dynamic debug callsite.  At runtime,
       7:  * the special section is treated as an array of these.
       8:  */
       9: struct _ddebug {
      10:     /*
      11:      * These fields are used to drive the user interface
      12:      * for selecting and displaying debug callsites.
      13:      */
      14:     const char *modname;
      15:     const char *function;
      16:     const char *filename;
      17:     const char *format;
      18:     unsigned int lineno:18;
      19:     /*
      20:      * The flags field controls the behaviour at the callsite.
      21:      * The bits here are changed dynamically when the user
      22:      * writes commands to <debugfs>/dynamic_debug/control
      23:      */
      24: #define _DPRINTK_FLAGS_NONE    0
      25: #define _DPRINTK_FLAGS_PRINT    (1<<0) /* printk() a message using the format */
      26: #define _DPRINTK_FLAGS_INCL_MODNAME    (1<<1)
      27: #define _DPRINTK_FLAGS_INCL_FUNCNAME    (1<<2)
      28: #define _DPRINTK_FLAGS_INCL_LINENO    (1<<3)
      29: #define _DPRINTK_FLAGS_INCL_TID        (1<<4)
      30: #if defined DEBUG
      31: #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
      32: #else
      33: #define _DPRINTK_FLAGS_DEFAULT 0
      34: #endif
      35:     unsigned int flags:8;
      36: } __attribute__((aligned(8)));
      37: 
      38: 
      39: int ddebug_add_module(struct _ddebug *tab, unsigned int n,
      40:                 const char *modname);
      41: 
      42: #if defined(CONFIG_DYNAMIC_DEBUG)
      43: extern int ddebug_remove_module(const char *mod_name);
      44: extern __printf(2, 3)
      45: int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
      46: 
      47: extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
      48:                     const char *modname);
      49: 
      50: struct device;
      51: 
      52: extern __printf(3, 4)
      53: int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
      54:               const char *fmt, ...);
      55: 
      56: struct net_device;
      57: 
      58: extern __printf(3, 4)
      59: int __dynamic_netdev_dbg(struct _ddebug *descriptor,
      60:              const struct net_device *dev,
      61:              const char *fmt, ...);
      62: 
      63: #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)        \
      64:     static struct _ddebug  __aligned(8)            \
      65:     __attribute__((section("__verbose"))) name = {        \
      66:         .modname = KBUILD_MODNAME,            \
      67:         .function = __func__,                \
      68:         .filename = __FILE__,                \
      69:         .format = (fmt),                \
      70:         .lineno = __LINE__,                \
      71:         .flags =  _DPRINTK_FLAGS_DEFAULT,        \
      72:     }
      73: 
      74: #define dynamic_pr_debug(fmt, ...)                \
      75: do {                                \
      76:     DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);        \
      77:     if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))    \
      78:         __dynamic_pr_debug(&descriptor, pr_fmt(fmt),    \
      79:                    ##__VA_ARGS__);        \
      80: } while (0)
      81: 
      82: #define dynamic_dev_dbg(dev, fmt, ...)                \
      83: do {                                \
      84:     DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);        \
      85:     if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))    \
      86:         __dynamic_dev_dbg(&descriptor, dev, fmt,    \
      87:                   ##__VA_ARGS__);        \
      88: } while (0)
      89: 
      90: #define dynamic_netdev_dbg(dev, fmt, ...)            \
      91: do {                                \
      92:     DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);        \
      93:     if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))    \
      94:         __dynamic_netdev_dbg(&descriptor, dev, fmt,    \
      95:                      ##__VA_ARGS__);        \
      96: } while (0)
      97: 
      98: #define dynamic_hex_dump(prefix_str, prefix_type, rowsize,    \
      99:              groupsize, buf, len, ascii)        \
     100: do {                                \
     101:     DEFINE_DYNAMIC_DEBUG_METADATA(descriptor,        \
     102:         __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
    if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))    \
     104:         print_hex_dump(KERN_DEBUG, prefix_str,        \
     105:                    prefix_type, rowsize, groupsize,    \
     106:                    buf, len, ascii);        \
     107: } while (0)
     108: 
     109: #else
     110: 
     111: #include <linux/string.h>
     112: #include <linux/errno.h>
     113: 
     114: static inline int ddebug_remove_module(const char *mod)
     115: {
     116:     return 0;
     117: }
     118: 
     119: static inline int ddebug_dyndbg_module_param_cb(char *param, char *val,
     120:                         const char *modname)
     121: {
     122:     if (strstr(param, "dyndbg")) {
     123:         /* avoid pr_warn(), which wants pr_fmt() fully defined */
     124:         printk(KERN_WARNING "dyndbg param is supported only in "
     125:             "CONFIG_DYNAMIC_DEBUG builds\n");
     126:         return 0; /* allow and ignore */
     127:     }
     128:     return -EINVAL;
     129: }
     130: 
     131: #define dynamic_pr_debug(fmt, ...)                    \
     132:     do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
     133: #define dynamic_dev_dbg(dev, fmt, ...)                    \
     134:     do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
     135: #endif
     136: 
     137: #endif
     138: