root/arch/s390/include/asm/debug.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. debug_level_enabled
  2. debug_event
  3. debug_int_event
  4. debug_long_event
  5. debug_text_event
  6. debug_exception
  7. debug_int_exception
  8. debug_long_exception
  9. debug_text_exception

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *   S/390 debug facility
   4  *
   5  *    Copyright IBM Corp. 1999, 2000
   6  */
   7 #ifndef DEBUG_H
   8 #define DEBUG_H
   9 
  10 #include <linux/string.h>
  11 #include <linux/spinlock.h>
  12 #include <linux/kernel.h>
  13 #include <linux/time.h>
  14 #include <linux/refcount.h>
  15 #include <uapi/asm/debug.h>
  16 
  17 #define DEBUG_MAX_LEVEL            6  /* debug levels range from 0 to 6 */
  18 #define DEBUG_OFF_LEVEL            -1 /* level where debug is switched off */
  19 #define DEBUG_FLUSH_ALL            -1 /* parameter to flush all areas */
  20 #define DEBUG_MAX_VIEWS            10 /* max number of views in proc fs */
  21 #define DEBUG_MAX_NAME_LEN         64 /* max length for a debugfs file name */
  22 #define DEBUG_DEFAULT_LEVEL        3  /* initial debug level */
  23 
  24 #define DEBUG_DIR_ROOT "s390dbf" /* name of debug root directory in proc fs */
  25 
  26 #define DEBUG_DATA(entry) (char *)(entry + 1) /* data is stored behind */
  27                                               /* the entry information */
  28 
  29 typedef struct __debug_entry debug_entry_t;
  30 
  31 struct debug_view;
  32 
  33 typedef struct debug_info {
  34         struct debug_info *next;
  35         struct debug_info *prev;
  36         refcount_t ref_count;
  37         spinlock_t lock;
  38         int level;
  39         int nr_areas;
  40         int pages_per_area;
  41         int buf_size;
  42         int entry_size;
  43         debug_entry_t ***areas;
  44         int active_area;
  45         int *active_pages;
  46         int *active_entries;
  47         struct dentry *debugfs_root_entry;
  48         struct dentry *debugfs_entries[DEBUG_MAX_VIEWS];
  49         struct debug_view *views[DEBUG_MAX_VIEWS];
  50         char name[DEBUG_MAX_NAME_LEN];
  51         umode_t mode;
  52 } debug_info_t;
  53 
  54 typedef int (debug_header_proc_t) (debug_info_t *id,
  55                                    struct debug_view *view,
  56                                    int area,
  57                                    debug_entry_t *entry,
  58                                    char *out_buf);
  59 
  60 typedef int (debug_format_proc_t) (debug_info_t *id,
  61                                    struct debug_view *view, char *out_buf,
  62                                    const char *in_buf);
  63 typedef int (debug_prolog_proc_t) (debug_info_t *id,
  64                                    struct debug_view *view,
  65                                    char *out_buf);
  66 typedef int (debug_input_proc_t) (debug_info_t *id,
  67                                   struct debug_view *view,
  68                                   struct file *file,
  69                                   const char __user *user_buf,
  70                                   size_t in_buf_size, loff_t *offset);
  71 
  72 int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view,
  73                          int area, debug_entry_t *entry, char *out_buf);
  74 
  75 struct debug_view {
  76         char name[DEBUG_MAX_NAME_LEN];
  77         debug_prolog_proc_t *prolog_proc;
  78         debug_header_proc_t *header_proc;
  79         debug_format_proc_t *format_proc;
  80         debug_input_proc_t  *input_proc;
  81         void                *private_data;
  82 };
  83 
  84 extern struct debug_view debug_hex_ascii_view;
  85 extern struct debug_view debug_raw_view;
  86 extern struct debug_view debug_sprintf_view;
  87 
  88 /* do NOT use the _common functions */
  89 
  90 debug_entry_t *debug_event_common(debug_info_t *id, int level,
  91                                   const void *data, int length);
  92 
  93 debug_entry_t *debug_exception_common(debug_info_t *id, int level,
  94                                       const void *data, int length);
  95 
  96 /* Debug Feature API: */
  97 
  98 debug_info_t *debug_register(const char *name, int pages, int nr_areas,
  99                              int buf_size);
 100 
 101 debug_info_t *debug_register_mode(const char *name, int pages, int nr_areas,
 102                                   int buf_size, umode_t mode, uid_t uid,
 103                                   gid_t gid);
 104 
 105 void debug_unregister(debug_info_t *id);
 106 
 107 void debug_set_level(debug_info_t *id, int new_level);
 108 
 109 void debug_set_critical(void);
 110 
 111 void debug_stop_all(void);
 112 
 113 /**
 114  * debug_level_enabled() - Returns true if debug events for the specified
 115  *                         level would be logged. Otherwise returns false.
 116  *
 117  * @id:         handle for debug log
 118  * @level:      debug level
 119  *
 120  * Return:
 121  * - %true if level is less or equal to the current debug level.
 122  */
 123 static inline bool debug_level_enabled(debug_info_t *id, int level)
 124 {
 125         return level <= id->level;
 126 }
 127 
 128 /**
 129  * debug_event() - writes binary debug entry to active debug area
 130  *                 (if level <= actual debug level)
 131  *
 132  * @id:         handle for debug log
 133  * @level:      debug level
 134  * @data:       pointer to data for debug entry
 135  * @length:     length of data in bytes
 136  *
 137  * Return:
 138  * - Address of written debug entry
 139  * - %NULL if error
 140  */
 141 static inline debug_entry_t *debug_event(debug_info_t *id, int level,
 142                                          void *data, int length)
 143 {
 144         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 145                 return NULL;
 146         return debug_event_common(id, level, data, length);
 147 }
 148 
 149 /**
 150  * debug_int_event() - writes unsigned integer debug entry to active debug area
 151  *                     (if level <= actual debug level)
 152  *
 153  * @id:         handle for debug log
 154  * @level:      debug level
 155  * @tag:        integer value for debug entry
 156  *
 157  * Return:
 158  * - Address of written debug entry
 159  * - %NULL if error
 160  */
 161 static inline debug_entry_t *debug_int_event(debug_info_t *id, int level,
 162                                              unsigned int tag)
 163 {
 164         unsigned int t = tag;
 165 
 166         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 167                 return NULL;
 168         return debug_event_common(id, level, &t, sizeof(unsigned int));
 169 }
 170 
 171 /**
 172  * debug_long_event() - writes unsigned long debug entry to active debug area
 173  *                     (if level <= actual debug level)
 174  *
 175  * @id:         handle for debug log
 176  * @level:      debug level
 177  * @tag:        long integer value for debug entry
 178  *
 179  * Return:
 180  * - Address of written debug entry
 181  * - %NULL if error
 182  */
 183 static inline debug_entry_t *debug_long_event(debug_info_t *id, int level,
 184                                               unsigned long tag)
 185 {
 186         unsigned long t = tag;
 187 
 188         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 189                 return NULL;
 190         return debug_event_common(id, level, &t, sizeof(unsigned long));
 191 }
 192 
 193 /**
 194  * debug_text_event() - writes string debug entry in ascii format to active
 195  *                      debug area (if level <= actual debug level)
 196  *
 197  * @id:         handle for debug log
 198  * @level:      debug level
 199  * @txt:        string for debug entry
 200  *
 201  * Return:
 202  * - Address of written debug entry
 203  * - %NULL if error
 204  */
 205 static inline debug_entry_t *debug_text_event(debug_info_t *id, int level,
 206                                               const char *txt)
 207 {
 208         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 209                 return NULL;
 210         return debug_event_common(id, level, txt, strlen(txt));
 211 }
 212 
 213 /*
 214  * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are
 215  * stored in the s390dbf. See Documentation/s390/s390dbf.rst for more details!
 216  */
 217 extern debug_entry_t *
 218 __debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
 219         __attribute__ ((format(printf, 3, 4)));
 220 
 221 /**
 222  * debug_sprintf_event() - writes debug entry with format string
 223  *                         and varargs (longs) to active debug area
 224  *                         (if level $<=$ actual debug level).
 225  *
 226  * @_id:        handle for debug log
 227  * @_level:     debug level
 228  * @_fmt:       format string for debug entry
 229  * @...:        varargs used as in sprintf()
 230  *
 231  * Return:
 232  * - Address of written debug entry
 233  * - %NULL if error
 234  *
 235  * floats and long long datatypes cannot be used as varargs.
 236  */
 237 #define debug_sprintf_event(_id, _level, _fmt, ...)                     \
 238 ({                                                                      \
 239         debug_entry_t *__ret;                                           \
 240         debug_info_t *__id = _id;                                       \
 241         int __level = _level;                                           \
 242                                                                         \
 243         if ((!__id) || (__level > __id->level))                         \
 244                 __ret = NULL;                                           \
 245         else                                                            \
 246                 __ret = __debug_sprintf_event(__id, __level,            \
 247                                               _fmt, ## __VA_ARGS__);    \
 248         __ret;                                                          \
 249 })
 250 
 251 /**
 252  * debug_exception() - writes binary debug entry to active debug area
 253  *                     (if level <= actual debug level)
 254  *                     and switches to next debug area
 255  *
 256  * @id:         handle for debug log
 257  * @level:      debug level
 258  * @data:       pointer to data for debug entry
 259  * @length:     length of data in bytes
 260  *
 261  * Return:
 262  * - Address of written debug entry
 263  * - %NULL if error
 264  */
 265 static inline debug_entry_t *debug_exception(debug_info_t *id, int level,
 266                                              void *data, int length)
 267 {
 268         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 269                 return NULL;
 270         return debug_exception_common(id, level, data, length);
 271 }
 272 
 273 /**
 274  * debug_int_exception() - writes unsigned int debug entry to active debug area
 275  *                         (if level <= actual debug level)
 276  *                         and switches to next debug area
 277  *
 278  * @id:         handle for debug log
 279  * @level:      debug level
 280  * @tag:        integer value for debug entry
 281  *
 282  * Return:
 283  * - Address of written debug entry
 284  * - %NULL if error
 285  */
 286 static inline debug_entry_t *debug_int_exception(debug_info_t *id, int level,
 287                                                  unsigned int tag)
 288 {
 289         unsigned int t = tag;
 290 
 291         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 292                 return NULL;
 293         return debug_exception_common(id, level, &t, sizeof(unsigned int));
 294 }
 295 
 296 /**
 297  * debug_long_exception() - writes long debug entry to active debug area
 298  *                         (if level <= actual debug level)
 299  *                         and switches to next debug area
 300  *
 301  * @id:         handle for debug log
 302  * @level:      debug level
 303  * @tag:        long integer value for debug entry
 304  *
 305  * Return:
 306  * - Address of written debug entry
 307  * - %NULL if error
 308  */
 309 static inline debug_entry_t *debug_long_exception (debug_info_t *id, int level,
 310                                                    unsigned long tag)
 311 {
 312         unsigned long t = tag;
 313 
 314         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 315                 return NULL;
 316         return debug_exception_common(id, level, &t, sizeof(unsigned long));
 317 }
 318 
 319 /**
 320  * debug_text_exception() - writes string debug entry in ascii format to active
 321  *                          debug area (if level <= actual debug level)
 322  *                          and switches to next debug area
 323  * area
 324  *
 325  * @id: handle for debug log
 326  * @level:      debug level
 327  * @txt:        string for debug entry
 328  *
 329  * Return:
 330  * - Address of written debug entry
 331  * - %NULL if error
 332  */
 333 static inline debug_entry_t *debug_text_exception(debug_info_t *id, int level,
 334                                                   const char *txt)
 335 {
 336         if ((!id) || (level > id->level) || (id->pages_per_area == 0))
 337                 return NULL;
 338         return debug_exception_common(id, level, txt, strlen(txt));
 339 }
 340 
 341 /*
 342  * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are
 343  * stored in the s390dbf. See Documentation/s390/s390dbf.rst for more details!
 344  */
 345 extern debug_entry_t *
 346 __debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
 347         __attribute__ ((format(printf, 3, 4)));
 348 
 349 
 350 /**
 351  * debug_sprintf_exception() - writes debug entry with format string and
 352  *                             varargs (longs) to active debug area
 353  *                             (if level <= actual debug level)
 354  *                             and switches to next debug area.
 355  *
 356  * @_id:        handle for debug log
 357  * @_level:     debug level
 358  * @_fmt:       format string for debug entry
 359  * @...:        varargs used as in sprintf()
 360  *
 361  * Return:
 362  * - Address of written debug entry
 363  * - %NULL if error
 364  *
 365  * floats and long long datatypes cannot be used as varargs.
 366  */
 367 #define debug_sprintf_exception(_id, _level, _fmt, ...)                 \
 368 ({                                                                      \
 369         debug_entry_t *__ret;                                           \
 370         debug_info_t *__id = _id;                                       \
 371         int __level = _level;                                           \
 372                                                                         \
 373         if ((!__id) || (__level > __id->level))                         \
 374                 __ret = NULL;                                           \
 375         else                                                            \
 376                 __ret = __debug_sprintf_exception(__id, __level,        \
 377                                                   _fmt, ## __VA_ARGS__);\
 378         __ret;                                                          \
 379 })
 380 
 381 int debug_register_view(debug_info_t *id, struct debug_view *view);
 382 
 383 int debug_unregister_view(debug_info_t *id, struct debug_view *view);
 384 
 385 /*
 386    define the debug levels:
 387    - 0 No debugging output to console or syslog
 388    - 1 Log internal errors to syslog, ignore check conditions
 389    - 2 Log internal errors and check conditions to syslog
 390    - 3 Log internal errors to console, log check conditions to syslog
 391    - 4 Log internal errors and check conditions to console
 392    - 5 panic on internal errors, log check conditions to console
 393    - 6 panic on both, internal errors and check conditions
 394  */
 395 
 396 #ifndef DEBUG_LEVEL
 397 #define DEBUG_LEVEL 4
 398 #endif
 399 
 400 #define INTERNAL_ERRMSG(x,y...) "E" __FILE__ "%d: " x, __LINE__, y
 401 #define INTERNAL_WRNMSG(x,y...) "W" __FILE__ "%d: " x, __LINE__, y
 402 #define INTERNAL_INFMSG(x,y...) "I" __FILE__ "%d: " x, __LINE__, y
 403 #define INTERNAL_DEBMSG(x,y...) "D" __FILE__ "%d: " x, __LINE__, y
 404 
 405 #if DEBUG_LEVEL > 0
 406 #define PRINT_DEBUG(x...)       printk(KERN_DEBUG PRINTK_HEADER x)
 407 #define PRINT_INFO(x...)        printk(KERN_INFO PRINTK_HEADER x)
 408 #define PRINT_WARN(x...)        printk(KERN_WARNING PRINTK_HEADER x)
 409 #define PRINT_ERR(x...)         printk(KERN_ERR PRINTK_HEADER x)
 410 #define PRINT_FATAL(x...)       panic(PRINTK_HEADER x)
 411 #else
 412 #define PRINT_DEBUG(x...)       printk(KERN_DEBUG PRINTK_HEADER x)
 413 #define PRINT_INFO(x...)        printk(KERN_DEBUG PRINTK_HEADER x)
 414 #define PRINT_WARN(x...)        printk(KERN_DEBUG PRINTK_HEADER x)
 415 #define PRINT_ERR(x...)         printk(KERN_DEBUG PRINTK_HEADER x)
 416 #define PRINT_FATAL(x...)       printk(KERN_DEBUG PRINTK_HEADER x)
 417 #endif /* DASD_DEBUG */
 418 
 419 #endif /* DEBUG_H */

/* [<][>][^][v][top][bottom][index][help] */