debug.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. #include <linux/string.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/kernel.h>
  12. #include <linux/time.h>
  13. #include <linux/refcount.h>
  14. #include <uapi/asm/debug.h>
  15. #define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */
  16. #define DEBUG_OFF_LEVEL -1 /* level where debug is switched off */
  17. #define DEBUG_FLUSH_ALL -1 /* parameter to flush all areas */
  18. #define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
  19. #define DEBUG_MAX_NAME_LEN 64 /* max length for a debugfs file name */
  20. #define DEBUG_DEFAULT_LEVEL 3 /* initial debug level */
  21. #define DEBUG_DIR_ROOT "s390dbf" /* name of debug root directory in proc fs */
  22. #define DEBUG_DATA(entry) (char *)(entry + 1) /* data is stored behind */
  23. /* the entry information */
  24. typedef struct __debug_entry debug_entry_t;
  25. struct debug_view;
  26. typedef struct debug_info {
  27. struct debug_info *next;
  28. struct debug_info *prev;
  29. refcount_t ref_count;
  30. spinlock_t lock;
  31. int level;
  32. int nr_areas;
  33. int pages_per_area;
  34. int buf_size;
  35. int entry_size;
  36. debug_entry_t ***areas;
  37. int active_area;
  38. int *active_pages;
  39. int *active_entries;
  40. struct dentry *debugfs_root_entry;
  41. struct dentry *debugfs_entries[DEBUG_MAX_VIEWS];
  42. struct debug_view *views[DEBUG_MAX_VIEWS];
  43. char name[DEBUG_MAX_NAME_LEN];
  44. umode_t mode;
  45. } debug_info_t;
  46. typedef int (debug_header_proc_t) (debug_info_t *id,
  47. struct debug_view *view,
  48. int area,
  49. debug_entry_t *entry,
  50. char *out_buf);
  51. typedef int (debug_format_proc_t) (debug_info_t *id,
  52. struct debug_view *view, char *out_buf,
  53. const char *in_buf);
  54. typedef int (debug_prolog_proc_t) (debug_info_t *id,
  55. struct debug_view *view,
  56. char *out_buf);
  57. typedef int (debug_input_proc_t) (debug_info_t *id,
  58. struct debug_view *view,
  59. struct file *file,
  60. const char __user *user_buf,
  61. size_t in_buf_size, loff_t *offset);
  62. int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view,
  63. int area, debug_entry_t *entry, char *out_buf);
  64. struct debug_view {
  65. char name[DEBUG_MAX_NAME_LEN];
  66. debug_prolog_proc_t *prolog_proc;
  67. debug_header_proc_t *header_proc;
  68. debug_format_proc_t *format_proc;
  69. debug_input_proc_t *input_proc;
  70. void *private_data;
  71. };
  72. extern struct debug_view debug_hex_ascii_view;
  73. extern struct debug_view debug_raw_view;
  74. extern struct debug_view debug_sprintf_view;
  75. /* do NOT use the _common functions */
  76. debug_entry_t *debug_event_common(debug_info_t *id, int level,
  77. const void *data, int length);
  78. debug_entry_t *debug_exception_common(debug_info_t *id, int level,
  79. const void *data, int length);
  80. /* Debug Feature API: */
  81. debug_info_t *debug_register(const char *name, int pages, int nr_areas,
  82. int buf_size);
  83. debug_info_t *debug_register_mode(const char *name, int pages, int nr_areas,
  84. int buf_size, umode_t mode, uid_t uid,
  85. gid_t gid);
  86. void debug_unregister(debug_info_t *id);
  87. void debug_set_level(debug_info_t *id, int new_level);
  88. void debug_set_critical(void);
  89. void debug_stop_all(void);
  90. static inline bool debug_level_enabled(debug_info_t *id, int level)
  91. {
  92. return level <= id->level;
  93. }
  94. static inline debug_entry_t *debug_event(debug_info_t *id, int level,
  95. void *data, int length)
  96. {
  97. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  98. return NULL;
  99. return debug_event_common(id, level, data, length);
  100. }
  101. static inline debug_entry_t *debug_int_event(debug_info_t *id, int level,
  102. unsigned int tag)
  103. {
  104. unsigned int t = tag;
  105. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  106. return NULL;
  107. return debug_event_common(id, level, &t, sizeof(unsigned int));
  108. }
  109. static inline debug_entry_t *debug_long_event(debug_info_t *id, int level,
  110. unsigned long tag)
  111. {
  112. unsigned long t = tag;
  113. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  114. return NULL;
  115. return debug_event_common(id, level, &t, sizeof(unsigned long));
  116. }
  117. static inline debug_entry_t *debug_text_event(debug_info_t *id, int level,
  118. const char *txt)
  119. {
  120. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  121. return NULL;
  122. return debug_event_common(id, level, txt, strlen(txt));
  123. }
  124. /*
  125. * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are
  126. * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
  127. */
  128. extern debug_entry_t *
  129. __debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
  130. __attribute__ ((format(printf, 3, 4)));
  131. #define debug_sprintf_event(_id, _level, _fmt, ...) \
  132. ({ \
  133. debug_entry_t *__ret; \
  134. debug_info_t *__id = _id; \
  135. int __level = _level; \
  136. \
  137. if ((!__id) || (__level > __id->level)) \
  138. __ret = NULL; \
  139. else \
  140. __ret = __debug_sprintf_event(__id, __level, \
  141. _fmt, ## __VA_ARGS__); \
  142. __ret; \
  143. })
  144. static inline debug_entry_t *debug_exception(debug_info_t *id, int level,
  145. void *data, int length)
  146. {
  147. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  148. return NULL;
  149. return debug_exception_common(id, level, data, length);
  150. }
  151. static inline debug_entry_t *debug_int_exception(debug_info_t *id, int level,
  152. unsigned int tag)
  153. {
  154. unsigned int t = tag;
  155. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  156. return NULL;
  157. return debug_exception_common(id, level, &t, sizeof(unsigned int));
  158. }
  159. static inline debug_entry_t *debug_long_exception (debug_info_t *id, int level,
  160. unsigned long tag)
  161. {
  162. unsigned long t = tag;
  163. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  164. return NULL;
  165. return debug_exception_common(id, level, &t, sizeof(unsigned long));
  166. }
  167. static inline debug_entry_t *debug_text_exception(debug_info_t *id, int level,
  168. const char *txt)
  169. {
  170. if ((!id) || (level > id->level) || (id->pages_per_area == 0))
  171. return NULL;
  172. return debug_exception_common(id, level, txt, strlen(txt));
  173. }
  174. /*
  175. * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are
  176. * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
  177. */
  178. extern debug_entry_t *
  179. __debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
  180. __attribute__ ((format(printf, 3, 4)));
  181. #define debug_sprintf_exception(_id, _level, _fmt, ...) \
  182. ({ \
  183. debug_entry_t *__ret; \
  184. debug_info_t *__id = _id; \
  185. int __level = _level; \
  186. \
  187. if ((!__id) || (__level > __id->level)) \
  188. __ret = NULL; \
  189. else \
  190. __ret = __debug_sprintf_exception(__id, __level, \
  191. _fmt, ## __VA_ARGS__);\
  192. __ret; \
  193. })
  194. int debug_register_view(debug_info_t *id, struct debug_view *view);
  195. int debug_unregister_view(debug_info_t *id, struct debug_view *view);
  196. /*
  197. define the debug levels:
  198. - 0 No debugging output to console or syslog
  199. - 1 Log internal errors to syslog, ignore check conditions
  200. - 2 Log internal errors and check conditions to syslog
  201. - 3 Log internal errors to console, log check conditions to syslog
  202. - 4 Log internal errors and check conditions to console
  203. - 5 panic on internal errors, log check conditions to console
  204. - 6 panic on both, internal errors and check conditions
  205. */
  206. #ifndef DEBUG_LEVEL
  207. #define DEBUG_LEVEL 4
  208. #endif
  209. #define INTERNAL_ERRMSG(x,y...) "E" __FILE__ "%d: " x, __LINE__, y
  210. #define INTERNAL_WRNMSG(x,y...) "W" __FILE__ "%d: " x, __LINE__, y
  211. #define INTERNAL_INFMSG(x,y...) "I" __FILE__ "%d: " x, __LINE__, y
  212. #define INTERNAL_DEBMSG(x,y...) "D" __FILE__ "%d: " x, __LINE__, y
  213. #if DEBUG_LEVEL > 0
  214. #define PRINT_DEBUG(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  215. #define PRINT_INFO(x...) printk(KERN_INFO PRINTK_HEADER x)
  216. #define PRINT_WARN(x...) printk(KERN_WARNING PRINTK_HEADER x)
  217. #define PRINT_ERR(x...) printk(KERN_ERR PRINTK_HEADER x)
  218. #define PRINT_FATAL(x...) panic(PRINTK_HEADER x)
  219. #else
  220. #define PRINT_DEBUG(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  221. #define PRINT_INFO(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  222. #define PRINT_WARN(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  223. #define PRINT_ERR(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  224. #define PRINT_FATAL(x...) printk(KERN_DEBUG PRINTK_HEADER x)
  225. #endif /* DASD_DEBUG */
  226. #endif /* DEBUG_H */