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