linux/include/linux/dynamic_debug.h
<<
>>
Prefs
   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 */
   9struct _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
  39int ddebug_add_module(struct _ddebug *tab, unsigned int n,
  40                                const char *modname);
  41
  42#if defined(CONFIG_DYNAMIC_DEBUG)
  43extern int ddebug_remove_module(const char *mod_name);
  44extern __printf(2, 3)
  45void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
  46
  47extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
  48                                        const char *modname);
  49
  50struct device;
  51
  52extern __printf(3, 4)
  53void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
  54                       const char *fmt, ...);
  55
  56struct net_device;
  57
  58extern __printf(3, 4)
  59void __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, ...)                              \
  75do {                                                            \
  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, ...)                          \
  83do {                                                            \
  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, ...)                       \
  91do {                                                            \
  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)            \
 100do {                                                            \
 101        DEFINE_DYNAMIC_DEBUG_METADATA(descriptor,               \
 102                __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
 103        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
 114static inline int ddebug_remove_module(const char *mod)
 115{
 116        return 0;
 117}
 118
 119static 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