Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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. void __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. void __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. void __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");\
  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.  
  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.