]> Git Repo - J-linux.git/blob - arch/s390/kernel/debug.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / arch / s390 / kernel / debug.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *   S/390 debug facility
4  *
5  *    Copyright IBM Corp. 1999, 2020
6  *
7  *    Author(s): Michael Holzheu ([email protected]),
8  *               Holger Smolinski ([email protected])
9  *
10  *    Bugreports to: <[email protected]>
11  */
12
13 #define KMSG_COMPONENT "s390dbf"
14 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
15
16 #include <linux/stddef.h>
17 #include <linux/kernel.h>
18 #include <linux/errno.h>
19 #include <linux/slab.h>
20 #include <linux/ctype.h>
21 #include <linux/string.h>
22 #include <linux/sysctl.h>
23 #include <linux/uaccess.h>
24 #include <linux/export.h>
25 #include <linux/init.h>
26 #include <linux/fs.h>
27 #include <linux/minmax.h>
28 #include <linux/debugfs.h>
29
30 #include <asm/debug.h>
31
32 #define DEBUG_PROLOG_ENTRY -1
33
34 #define ALL_AREAS 0 /* copy all debug areas */
35 #define NO_AREAS  1 /* copy no debug areas */
36
37 /* typedefs */
38
39 typedef struct file_private_info {
40         loff_t offset;                  /* offset of last read in file */
41         int    act_area;                /* number of last formatted area */
42         int    act_page;                /* act page in given area */
43         int    act_entry;               /* last formatted entry (offset */
44                                         /* relative to beginning of last */
45                                         /* formatted page) */
46         size_t act_entry_offset;        /* up to this offset we copied */
47                                         /* in last read the last formatted */
48                                         /* entry to userland */
49         char   temp_buf[2048];          /* buffer for output */
50         debug_info_t *debug_info_org;   /* original debug information */
51         debug_info_t *debug_info_snap;  /* snapshot of debug information */
52         struct debug_view *view;        /* used view of debug info */
53 } file_private_info_t;
54
55 typedef struct {
56         char *string;
57         /*
58          * This assumes that all args are converted into longs
59          * on L/390 this is the case for all types of parameter
60          * except of floats, and long long (32 bit)
61          *
62          */
63         long args[];
64 } debug_sprintf_entry_t;
65
66 /* internal function prototypes */
67
68 static int debug_init(void);
69 static ssize_t debug_output(struct file *file, char __user *user_buf,
70                             size_t user_len, loff_t *offset);
71 static ssize_t debug_input(struct file *file, const char __user *user_buf,
72                            size_t user_len, loff_t *offset);
73 static int debug_open(struct inode *inode, struct file *file);
74 static int debug_close(struct inode *inode, struct file *file);
75 static debug_info_t *debug_info_create(const char *name, int pages_per_area,
76                                        int nr_areas, int buf_size, umode_t mode);
77 static void debug_info_get(debug_info_t *);
78 static void debug_info_put(debug_info_t *);
79 static int debug_prolog_level_fn(debug_info_t *id,
80                                  struct debug_view *view, char *out_buf,
81                                  size_t out_buf_size);
82 static int debug_input_level_fn(debug_info_t *id, struct debug_view *view,
83                                 struct file *file, const char __user *user_buf,
84                                 size_t user_buf_size, loff_t *offset);
85 static int debug_prolog_pages_fn(debug_info_t *id,
86                                  struct debug_view *view, char *out_buf,
87                                  size_t out_buf_size);
88 static int debug_input_pages_fn(debug_info_t *id, struct debug_view *view,
89                                 struct file *file, const char __user *user_buf,
90                                 size_t user_buf_size, loff_t *offset);
91 static int debug_input_flush_fn(debug_info_t *id, struct debug_view *view,
92                                 struct file *file, const char __user *user_buf,
93                                 size_t user_buf_size, loff_t *offset);
94 static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view,
95                                      char *out_buf, size_t out_buf_size,
96                                      const char *in_buf);
97 static int debug_sprintf_format_fn(debug_info_t *id, struct debug_view *view,
98                                    char *out_buf, size_t out_buf_size,
99                                    const char *inbuf);
100 static void debug_areas_swap(debug_info_t *a, debug_info_t *b);
101 static void debug_events_append(debug_info_t *dest, debug_info_t *src);
102
103 /* globals */
104
105 struct debug_view debug_hex_ascii_view = {
106         "hex_ascii",
107         NULL,
108         &debug_dflt_header_fn,
109         &debug_hex_ascii_format_fn,
110         NULL,
111         NULL
112 };
113 EXPORT_SYMBOL(debug_hex_ascii_view);
114
115 static struct debug_view debug_level_view = {
116         "level",
117         &debug_prolog_level_fn,
118         NULL,
119         NULL,
120         &debug_input_level_fn,
121         NULL
122 };
123
124 static struct debug_view debug_pages_view = {
125         "pages",
126         &debug_prolog_pages_fn,
127         NULL,
128         NULL,
129         &debug_input_pages_fn,
130         NULL
131 };
132
133 static struct debug_view debug_flush_view = {
134         "flush",
135         NULL,
136         NULL,
137         NULL,
138         &debug_input_flush_fn,
139         NULL
140 };
141
142 struct debug_view debug_sprintf_view = {
143         "sprintf",
144         NULL,
145         &debug_dflt_header_fn,
146         &debug_sprintf_format_fn,
147         NULL,
148         NULL
149 };
150 EXPORT_SYMBOL(debug_sprintf_view);
151
152 /* used by dump analysis tools to determine version of debug feature */
153 static unsigned int __used debug_feature_version = __DEBUG_FEATURE_VERSION;
154
155 /* static globals */
156
157 static debug_info_t *debug_area_first;
158 static debug_info_t *debug_area_last;
159 static DEFINE_MUTEX(debug_mutex);
160
161 static int initialized;
162 static int debug_critical;
163
164 static const struct file_operations debug_file_ops = {
165         .owner   = THIS_MODULE,
166         .read    = debug_output,
167         .write   = debug_input,
168         .open    = debug_open,
169         .release = debug_close,
170 };
171
172 static struct dentry *debug_debugfs_root_entry;
173
174 /* functions */
175
176 /*
177  * debug_areas_alloc
178  * - Debug areas are implemented as a threedimensonal array:
179  *   areas[areanumber][pagenumber][pageoffset]
180  */
181
182 static debug_entry_t ***debug_areas_alloc(int pages_per_area, int nr_areas)
183 {
184         debug_entry_t ***areas;
185         int i, j;
186
187         areas = kmalloc_array(nr_areas, sizeof(debug_entry_t **), GFP_KERNEL);
188         if (!areas)
189                 goto fail_malloc_areas;
190         for (i = 0; i < nr_areas; i++) {
191                 /* GFP_NOWARN to avoid user triggerable WARN, we handle fails */
192                 areas[i] = kmalloc_array(pages_per_area,
193                                          sizeof(debug_entry_t *),
194                                          GFP_KERNEL | __GFP_NOWARN);
195                 if (!areas[i])
196                         goto fail_malloc_areas2;
197                 for (j = 0; j < pages_per_area; j++) {
198                         areas[i][j] = kzalloc(PAGE_SIZE, GFP_KERNEL);
199                         if (!areas[i][j]) {
200                                 for (j--; j >= 0 ; j--)
201                                         kfree(areas[i][j]);
202                                 kfree(areas[i]);
203                                 goto fail_malloc_areas2;
204                         }
205                 }
206         }
207         return areas;
208
209 fail_malloc_areas2:
210         for (i--; i >= 0; i--) {
211                 for (j = 0; j < pages_per_area; j++)
212                         kfree(areas[i][j]);
213                 kfree(areas[i]);
214         }
215         kfree(areas);
216 fail_malloc_areas:
217         return NULL;
218 }
219
220 /*
221  * debug_info_alloc
222  * - alloc new debug-info
223  */
224 static debug_info_t *debug_info_alloc(const char *name, int pages_per_area,
225                                       int nr_areas, int buf_size, int level,
226                                       int mode)
227 {
228         debug_info_t *rc;
229
230         /* alloc everything */
231         rc = kmalloc(sizeof(debug_info_t), GFP_KERNEL);
232         if (!rc)
233                 goto fail_malloc_rc;
234         rc->active_entries = kcalloc(nr_areas, sizeof(int), GFP_KERNEL);
235         if (!rc->active_entries)
236                 goto fail_malloc_active_entries;
237         rc->active_pages = kcalloc(nr_areas, sizeof(int), GFP_KERNEL);
238         if (!rc->active_pages)
239                 goto fail_malloc_active_pages;
240         if ((mode == ALL_AREAS) && (pages_per_area != 0)) {
241                 rc->areas = debug_areas_alloc(pages_per_area, nr_areas);
242                 if (!rc->areas)
243                         goto fail_malloc_areas;
244         } else {
245                 rc->areas = NULL;
246         }
247
248         /* initialize members */
249         spin_lock_init(&rc->lock);
250         rc->pages_per_area = pages_per_area;
251         rc->nr_areas       = nr_areas;
252         rc->active_area    = 0;
253         rc->level          = level;
254         rc->buf_size       = buf_size;
255         rc->entry_size     = sizeof(debug_entry_t) + buf_size;
256         strscpy(rc->name, name, sizeof(rc->name));
257         memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *));
258         memset(rc->debugfs_entries, 0, DEBUG_MAX_VIEWS * sizeof(struct dentry *));
259         refcount_set(&(rc->ref_count), 0);
260
261         return rc;
262
263 fail_malloc_areas:
264         kfree(rc->active_pages);
265 fail_malloc_active_pages:
266         kfree(rc->active_entries);
267 fail_malloc_active_entries:
268         kfree(rc);
269 fail_malloc_rc:
270         return NULL;
271 }
272
273 /*
274  * debug_areas_free
275  * - free all debug areas
276  */
277 static void debug_areas_free(debug_info_t *db_info)
278 {
279         int i, j;
280
281         if (!db_info->areas)
282                 return;
283         for (i = 0; i < db_info->nr_areas; i++) {
284                 for (j = 0; j < db_info->pages_per_area; j++)
285                         kfree(db_info->areas[i][j]);
286                 kfree(db_info->areas[i]);
287         }
288         kfree(db_info->areas);
289         db_info->areas = NULL;
290 }
291
292 /*
293  * debug_info_free
294  * - free memory debug-info
295  */
296 static void debug_info_free(debug_info_t *db_info)
297 {
298         debug_areas_free(db_info);
299         kfree(db_info->active_entries);
300         kfree(db_info->active_pages);
301         kfree(db_info);
302 }
303
304 /*
305  * debug_info_create
306  * - create new debug-info
307  */
308
309 static debug_info_t *debug_info_create(const char *name, int pages_per_area,
310                                        int nr_areas, int buf_size, umode_t mode)
311 {
312         debug_info_t *rc;
313
314         rc = debug_info_alloc(name, pages_per_area, nr_areas, buf_size,
315                               DEBUG_DEFAULT_LEVEL, ALL_AREAS);
316         if (!rc)
317                 goto out;
318
319         rc->mode = mode & ~S_IFMT;
320         refcount_set(&rc->ref_count, 1);
321 out:
322         return rc;
323 }
324
325 /*
326  * debug_info_copy
327  * - copy debug-info
328  */
329 static debug_info_t *debug_info_copy(debug_info_t *in, int mode)
330 {
331         unsigned long flags;
332         debug_info_t *rc;
333         int i, j;
334
335         /* get a consistent copy of the debug areas */
336         do {
337                 rc = debug_info_alloc(in->name, in->pages_per_area,
338                         in->nr_areas, in->buf_size, in->level, mode);
339                 spin_lock_irqsave(&in->lock, flags);
340                 if (!rc)
341                         goto out;
342                 /* has something changed in the meantime ? */
343                 if ((rc->pages_per_area == in->pages_per_area) &&
344                     (rc->nr_areas == in->nr_areas)) {
345                         break;
346                 }
347                 spin_unlock_irqrestore(&in->lock, flags);
348                 debug_info_free(rc);
349         } while (1);
350
351         if (mode == NO_AREAS)
352                 goto out;
353
354         for (i = 0; i < in->nr_areas; i++) {
355                 for (j = 0; j < in->pages_per_area; j++)
356                         memcpy(rc->areas[i][j], in->areas[i][j], PAGE_SIZE);
357         }
358 out:
359         spin_unlock_irqrestore(&in->lock, flags);
360         return rc;
361 }
362
363 /*
364  * debug_info_get
365  * - increments reference count for debug-info
366  */
367 static void debug_info_get(debug_info_t *db_info)
368 {
369         if (db_info)
370                 refcount_inc(&db_info->ref_count);
371 }
372
373 /*
374  * debug_info_put:
375  * - decreases reference count for debug-info and frees it if necessary
376  */
377 static void debug_info_put(debug_info_t *db_info)
378 {
379         if (!db_info)
380                 return;
381         if (refcount_dec_and_test(&db_info->ref_count))
382                 debug_info_free(db_info);
383 }
384
385 /*
386  * debug_format_entry:
387  * - format one debug entry and return size of formatted data
388  */
389 static int debug_format_entry(file_private_info_t *p_info)
390 {
391         debug_info_t *id_snap   = p_info->debug_info_snap;
392         struct debug_view *view = p_info->view;
393         debug_entry_t *act_entry;
394         size_t len = 0;
395
396         if (p_info->act_entry == DEBUG_PROLOG_ENTRY) {
397                 /* print prolog */
398                 if (view->prolog_proc) {
399                         len += view->prolog_proc(id_snap, view, p_info->temp_buf,
400                                                  sizeof(p_info->temp_buf));
401                 }
402                 goto out;
403         }
404         if (!id_snap->areas) /* this is true, if we have a prolog only view */
405                 goto out;    /* or if 'pages_per_area' is 0 */
406         act_entry = (debug_entry_t *) ((char *)id_snap->areas[p_info->act_area]
407                                        [p_info->act_page] + p_info->act_entry);
408
409         if (act_entry->clock == 0LL)
410                 goto out; /* empty entry */
411         if (view->header_proc) {
412                 len += view->header_proc(id_snap, view, p_info->act_area,
413                                          act_entry, p_info->temp_buf + len,
414                                          sizeof(p_info->temp_buf) - len);
415         }
416         if (view->format_proc) {
417                 len += view->format_proc(id_snap, view, p_info->temp_buf + len,
418                                          sizeof(p_info->temp_buf) - len,
419                                          DEBUG_DATA(act_entry));
420         }
421 out:
422         return len;
423 }
424
425 /*
426  * debug_next_entry:
427  * - goto next entry in p_info
428  */
429 static inline int debug_next_entry(file_private_info_t *p_info)
430 {
431         debug_info_t *id;
432
433         id = p_info->debug_info_snap;
434         if (p_info->act_entry == DEBUG_PROLOG_ENTRY) {
435                 p_info->act_entry = 0;
436                 p_info->act_page  = 0;
437                 goto out;
438         }
439         if (!id->areas)
440                 return 1;
441         p_info->act_entry += id->entry_size;
442         /* switch to next page, if we reached the end of the page  */
443         if (p_info->act_entry > (PAGE_SIZE - id->entry_size)) {
444                 /* next page */
445                 p_info->act_entry = 0;
446                 p_info->act_page += 1;
447                 if ((p_info->act_page % id->pages_per_area) == 0) {
448                         /* next area */
449                         p_info->act_area++;
450                         p_info->act_page = 0;
451                 }
452                 if (p_info->act_area >= id->nr_areas)
453                         return 1;
454         }
455 out:
456         return 0;
457 }
458
459 /*
460  * debug_output:
461  * - called for user read()
462  * - copies formatted debug entries to the user buffer
463  */
464 static ssize_t debug_output(struct file *file,          /* file descriptor */
465                             char __user *user_buf,      /* user buffer */
466                             size_t len,                 /* length of buffer */
467                             loff_t *offset)             /* offset in the file */
468 {
469         size_t count = 0;
470         size_t entry_offset;
471         file_private_info_t *p_info;
472
473         p_info = (file_private_info_t *) file->private_data;
474         if (*offset != p_info->offset)
475                 return -EPIPE;
476         if (p_info->act_area >= p_info->debug_info_snap->nr_areas)
477                 return 0;
478         entry_offset = p_info->act_entry_offset;
479         while (count < len) {
480                 int formatted_line_residue;
481                 int formatted_line_size;
482                 int user_buf_residue;
483                 size_t copy_size;
484
485                 formatted_line_size = debug_format_entry(p_info);
486                 formatted_line_residue = formatted_line_size - entry_offset;
487                 user_buf_residue = len-count;
488                 copy_size = min(user_buf_residue, formatted_line_residue);
489                 if (copy_size) {
490                         if (copy_to_user(user_buf + count, p_info->temp_buf
491                                          + entry_offset, copy_size))
492                                 return -EFAULT;
493                         count += copy_size;
494                         entry_offset += copy_size;
495                 }
496                 if (copy_size == formatted_line_residue) {
497                         entry_offset = 0;
498                         if (debug_next_entry(p_info))
499                                 goto out;
500                 }
501         }
502 out:
503         p_info->offset           = *offset + count;
504         p_info->act_entry_offset = entry_offset;
505         *offset = p_info->offset;
506         return count;
507 }
508
509 /*
510  * debug_input:
511  * - called for user write()
512  * - calls input function of view
513  */
514 static ssize_t debug_input(struct file *file, const char __user *user_buf,
515                            size_t length, loff_t *offset)
516 {
517         file_private_info_t *p_info;
518         int rc = 0;
519
520         mutex_lock(&debug_mutex);
521         p_info = ((file_private_info_t *) file->private_data);
522         if (p_info->view->input_proc) {
523                 rc = p_info->view->input_proc(p_info->debug_info_org,
524                                               p_info->view, file, user_buf,
525                                               length, offset);
526         } else {
527                 rc = -EPERM;
528         }
529         mutex_unlock(&debug_mutex);
530         return rc; /* number of input characters */
531 }
532
533 /*
534  * debug_open:
535  * - called for user open()
536  * - copies formatted output to private_data area of the file
537  *   handle
538  */
539 static int debug_open(struct inode *inode, struct file *file)
540 {
541         debug_info_t *debug_info, *debug_info_snapshot;
542         file_private_info_t *p_info;
543         int i, rc = 0;
544
545         mutex_lock(&debug_mutex);
546         debug_info = file_inode(file)->i_private;
547         /* find debug view */
548         for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
549                 if (!debug_info->views[i])
550                         continue;
551                 else if (debug_info->debugfs_entries[i] == file->f_path.dentry)
552                         goto found; /* found view ! */
553         }
554         /* no entry found */
555         rc = -EINVAL;
556         goto out;
557
558 found:
559
560         /* Make snapshot of current debug areas to get it consistent.     */
561         /* To copy all the areas is only needed, if we have a view which  */
562         /* formats the debug areas. */
563
564         if (!debug_info->views[i]->format_proc && !debug_info->views[i]->header_proc)
565                 debug_info_snapshot = debug_info_copy(debug_info, NO_AREAS);
566         else
567                 debug_info_snapshot = debug_info_copy(debug_info, ALL_AREAS);
568
569         if (!debug_info_snapshot) {
570                 rc = -ENOMEM;
571                 goto out;
572         }
573         p_info = kmalloc(sizeof(file_private_info_t), GFP_KERNEL);
574         if (!p_info) {
575                 debug_info_free(debug_info_snapshot);
576                 rc = -ENOMEM;
577                 goto out;
578         }
579         p_info->offset = 0;
580         p_info->debug_info_snap = debug_info_snapshot;
581         p_info->debug_info_org  = debug_info;
582         p_info->view = debug_info->views[i];
583         p_info->act_area = 0;
584         p_info->act_page = 0;
585         p_info->act_entry = DEBUG_PROLOG_ENTRY;
586         p_info->act_entry_offset = 0;
587         file->private_data = p_info;
588         debug_info_get(debug_info);
589         nonseekable_open(inode, file);
590 out:
591         mutex_unlock(&debug_mutex);
592         return rc;
593 }
594
595 /*
596  * debug_close:
597  * - called for user close()
598  * - deletes  private_data area of the file handle
599  */
600 static int debug_close(struct inode *inode, struct file *file)
601 {
602         file_private_info_t *p_info;
603
604         p_info = (file_private_info_t *) file->private_data;
605         if (p_info->debug_info_snap)
606                 debug_info_free(p_info->debug_info_snap);
607         debug_info_put(p_info->debug_info_org);
608         kfree(file->private_data);
609         return 0; /* success */
610 }
611
612 /* Create debugfs entries and add to internal list. */
613 static void _debug_register(debug_info_t *id)
614 {
615         /* create root directory */
616         id->debugfs_root_entry = debugfs_create_dir(id->name,
617                                                     debug_debugfs_root_entry);
618
619         /* append new element to linked list */
620         if (!debug_area_first) {
621                 /* first element in list */
622                 debug_area_first = id;
623                 id->prev = NULL;
624         } else {
625                 /* append element to end of list */
626                 debug_area_last->next = id;
627                 id->prev = debug_area_last;
628         }
629         debug_area_last = id;
630         id->next = NULL;
631
632         debug_register_view(id, &debug_level_view);
633         debug_register_view(id, &debug_flush_view);
634         debug_register_view(id, &debug_pages_view);
635 }
636
637 /**
638  * debug_register_mode() - creates and initializes debug area.
639  *
640  * @name:       Name of debug log (e.g. used for debugfs entry)
641  * @pages_per_area:     Number of pages, which will be allocated per area
642  * @nr_areas:   Number of debug areas
643  * @buf_size:   Size of data area in each debug entry
644  * @mode:       File mode for debugfs files. E.g. S_IRWXUGO
645  * @uid:        User ID for debugfs files. Currently only 0 is supported.
646  * @gid:        Group ID for debugfs files. Currently only 0 is supported.
647  *
648  * Return:
649  * - Handle for generated debug area
650  * - %NULL if register failed
651  *
652  * Allocates memory for a debug log.
653  * Must not be called within an interrupt handler.
654  */
655 debug_info_t *debug_register_mode(const char *name, int pages_per_area,
656                                   int nr_areas, int buf_size, umode_t mode,
657                                   uid_t uid, gid_t gid)
658 {
659         debug_info_t *rc = NULL;
660
661         /* Since debugfs currently does not support uid/gid other than root, */
662         /* we do not allow gid/uid != 0 until we get support for that. */
663         if ((uid != 0) || (gid != 0))
664                 pr_warn("Root becomes the owner of all s390dbf files in sysfs\n");
665         BUG_ON(!initialized);
666
667         /* create new debug_info */
668         rc = debug_info_create(name, pages_per_area, nr_areas, buf_size, mode);
669         if (rc) {
670                 mutex_lock(&debug_mutex);
671                 _debug_register(rc);
672                 mutex_unlock(&debug_mutex);
673         } else {
674                 pr_err("Registering debug feature %s failed\n", name);
675         }
676         return rc;
677 }
678 EXPORT_SYMBOL(debug_register_mode);
679
680 /**
681  * debug_register() - creates and initializes debug area with default file mode.
682  *
683  * @name:       Name of debug log (e.g. used for debugfs entry)
684  * @pages_per_area:     Number of pages, which will be allocated per area
685  * @nr_areas:   Number of debug areas
686  * @buf_size:   Size of data area in each debug entry
687  *
688  * Return:
689  * - Handle for generated debug area
690  * - %NULL if register failed
691  *
692  * Allocates memory for a debug log.
693  * The debugfs file mode access permissions are read and write for user.
694  * Must not be called within an interrupt handler.
695  */
696 debug_info_t *debug_register(const char *name, int pages_per_area,
697                              int nr_areas, int buf_size)
698 {
699         return debug_register_mode(name, pages_per_area, nr_areas, buf_size,
700                                    S_IRUSR | S_IWUSR, 0, 0);
701 }
702 EXPORT_SYMBOL(debug_register);
703
704 /**
705  * debug_register_static() - registers a static debug area
706  *
707  * @id: Handle for static debug area
708  * @pages_per_area: Number of pages per area
709  * @nr_areas: Number of debug areas
710  *
711  * Register debug_info_t defined using DEFINE_STATIC_DEBUG_INFO.
712  *
713  * Note: This function is called automatically via an initcall generated by
714  *       DEFINE_STATIC_DEBUG_INFO.
715  */
716 void debug_register_static(debug_info_t *id, int pages_per_area, int nr_areas)
717 {
718         unsigned long flags;
719         debug_info_t *copy;
720
721         if (!initialized) {
722                 pr_err("Tried to register debug feature %s too early\n",
723                        id->name);
724                 return;
725         }
726
727         copy = debug_info_alloc("", pages_per_area, nr_areas, id->buf_size,
728                                 id->level, ALL_AREAS);
729         if (!copy) {
730                 pr_err("Registering debug feature %s failed\n", id->name);
731
732                 /* Clear pointers to prevent tracing into released initdata. */
733                 spin_lock_irqsave(&id->lock, flags);
734                 id->areas = NULL;
735                 id->active_pages = NULL;
736                 id->active_entries = NULL;
737                 spin_unlock_irqrestore(&id->lock, flags);
738
739                 return;
740         }
741
742         /* Replace static trace area with dynamic copy. */
743         spin_lock_irqsave(&id->lock, flags);
744         debug_events_append(copy, id);
745         debug_areas_swap(id, copy);
746         spin_unlock_irqrestore(&id->lock, flags);
747
748         /* Clear pointers to initdata and discard copy. */
749         copy->areas = NULL;
750         copy->active_pages = NULL;
751         copy->active_entries = NULL;
752         debug_info_free(copy);
753
754         mutex_lock(&debug_mutex);
755         _debug_register(id);
756         mutex_unlock(&debug_mutex);
757 }
758
759 /* Remove debugfs entries and remove from internal list. */
760 static void _debug_unregister(debug_info_t *id)
761 {
762         int i;
763
764         for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
765                 if (!id->views[i])
766                         continue;
767                 debugfs_remove(id->debugfs_entries[i]);
768         }
769         debugfs_remove(id->debugfs_root_entry);
770         if (id == debug_area_first)
771                 debug_area_first = id->next;
772         if (id == debug_area_last)
773                 debug_area_last = id->prev;
774         if (id->prev)
775                 id->prev->next = id->next;
776         if (id->next)
777                 id->next->prev = id->prev;
778 }
779
780 /**
781  * debug_unregister() - give back debug area.
782  *
783  * @id:         handle for debug log
784  *
785  * Return:
786  *    none
787  */
788 void debug_unregister(debug_info_t *id)
789 {
790         if (!id)
791                 return;
792         mutex_lock(&debug_mutex);
793         _debug_unregister(id);
794         mutex_unlock(&debug_mutex);
795
796         debug_info_put(id);
797 }
798 EXPORT_SYMBOL(debug_unregister);
799
800 /*
801  * debug_set_size:
802  * - set area size (number of pages) and number of areas
803  */
804 static int debug_set_size(debug_info_t *id, int nr_areas, int pages_per_area)
805 {
806         debug_info_t *new_id;
807         unsigned long flags;
808
809         if (!id || (nr_areas <= 0) || (pages_per_area < 0))
810                 return -EINVAL;
811
812         new_id = debug_info_alloc("", pages_per_area, nr_areas, id->buf_size,
813                                   id->level, ALL_AREAS);
814         if (!new_id) {
815                 pr_info("Allocating memory for %i pages failed\n",
816                         pages_per_area);
817                 return -ENOMEM;
818         }
819
820         spin_lock_irqsave(&id->lock, flags);
821         debug_events_append(new_id, id);
822         debug_areas_swap(new_id, id);
823         debug_info_free(new_id);
824         spin_unlock_irqrestore(&id->lock, flags);
825         pr_info("%s: set new size (%i pages)\n", id->name, pages_per_area);
826
827         return 0;
828 }
829
830 /**
831  * debug_set_level() - Sets new actual debug level if new_level is valid.
832  *
833  * @id:         handle for debug log
834  * @new_level:  new debug level
835  *
836  * Return:
837  *    none
838  */
839 void debug_set_level(debug_info_t *id, int new_level)
840 {
841         unsigned long flags;
842
843         if (!id)
844                 return;
845
846         if (new_level == DEBUG_OFF_LEVEL) {
847                 pr_info("%s: switched off\n", id->name);
848         } else if ((new_level > DEBUG_MAX_LEVEL) || (new_level < 0)) {
849                 pr_info("%s: level %i is out of range (%i - %i)\n",
850                         id->name, new_level, 0, DEBUG_MAX_LEVEL);
851                 return;
852         }
853
854         spin_lock_irqsave(&id->lock, flags);
855         id->level = new_level;
856         spin_unlock_irqrestore(&id->lock, flags);
857 }
858 EXPORT_SYMBOL(debug_set_level);
859
860 /*
861  * proceed_active_entry:
862  * - set active entry to next in the ring buffer
863  */
864 static inline void proceed_active_entry(debug_info_t *id)
865 {
866         if ((id->active_entries[id->active_area] += id->entry_size)
867             > (PAGE_SIZE - id->entry_size)) {
868                 id->active_entries[id->active_area] = 0;
869                 id->active_pages[id->active_area] =
870                         (id->active_pages[id->active_area] + 1) %
871                         id->pages_per_area;
872         }
873 }
874
875 /*
876  * proceed_active_area:
877  * - set active area to next in the ring buffer
878  */
879 static inline void proceed_active_area(debug_info_t *id)
880 {
881         id->active_area++;
882         id->active_area = id->active_area % id->nr_areas;
883 }
884
885 /*
886  * get_active_entry:
887  */
888 static inline debug_entry_t *get_active_entry(debug_info_t *id)
889 {
890         return (debug_entry_t *) (((char *) id->areas[id->active_area]
891                                    [id->active_pages[id->active_area]]) +
892                                   id->active_entries[id->active_area]);
893 }
894
895 /* Swap debug areas of a and b. */
896 static void debug_areas_swap(debug_info_t *a, debug_info_t *b)
897 {
898         swap(a->nr_areas, b->nr_areas);
899         swap(a->pages_per_area, b->pages_per_area);
900         swap(a->areas, b->areas);
901         swap(a->active_area, b->active_area);
902         swap(a->active_pages, b->active_pages);
903         swap(a->active_entries, b->active_entries);
904 }
905
906 /* Append all debug events in active area from source to destination log. */
907 static void debug_events_append(debug_info_t *dest, debug_info_t *src)
908 {
909         debug_entry_t *from, *to, *last;
910
911         if (!src->areas || !dest->areas)
912                 return;
913
914         /* Loop over all entries in src, starting with oldest. */
915         from = get_active_entry(src);
916         last = from;
917         do {
918                 if (from->clock != 0LL) {
919                         to = get_active_entry(dest);
920                         memset(to, 0, dest->entry_size);
921                         memcpy(to, from, min(src->entry_size,
922                                              dest->entry_size));
923                         proceed_active_entry(dest);
924                 }
925
926                 proceed_active_entry(src);
927                 from = get_active_entry(src);
928         } while (from != last);
929 }
930
931 /*
932  * debug_finish_entry:
933  * - set timestamp, caller address, cpu number etc.
934  */
935
936 static inline void debug_finish_entry(debug_info_t *id, debug_entry_t *active,
937                                       int level, int exception)
938 {
939         unsigned long timestamp;
940         union tod_clock clk;
941
942         store_tod_clock_ext(&clk);
943         timestamp = clk.us;
944         timestamp -= TOD_UNIX_EPOCH >> 12;
945         active->clock = timestamp;
946         active->cpu = smp_processor_id();
947         active->caller = __builtin_return_address(0);
948         active->exception = exception;
949         active->level = level;
950         proceed_active_entry(id);
951         if (exception)
952                 proceed_active_area(id);
953 }
954
955 static int debug_stoppable = 1;
956 static int debug_active = 1;
957
958 #define CTL_S390DBF_STOPPABLE 5678
959 #define CTL_S390DBF_ACTIVE 5679
960
961 /*
962  * proc handler for the running debug_active sysctl
963  * always allow read, allow write only if debug_stoppable is set or
964  * if debug_active is already off
965  */
966 static int s390dbf_procactive(const struct ctl_table *table, int write,
967                               void *buffer, size_t *lenp, loff_t *ppos)
968 {
969         if (!write || debug_stoppable || !debug_active)
970                 return proc_dointvec(table, write, buffer, lenp, ppos);
971         else
972                 return 0;
973 }
974
975 static struct ctl_table s390dbf_table[] = {
976         {
977                 .procname       = "debug_stoppable",
978                 .data           = &debug_stoppable,
979                 .maxlen         = sizeof(int),
980                 .mode           = S_IRUGO | S_IWUSR,
981                 .proc_handler   = proc_dointvec,
982         },
983         {
984                 .procname       = "debug_active",
985                 .data           = &debug_active,
986                 .maxlen         = sizeof(int),
987                 .mode           = S_IRUGO | S_IWUSR,
988                 .proc_handler   = s390dbf_procactive,
989         },
990 };
991
992 static struct ctl_table_header *s390dbf_sysctl_header;
993
994 /**
995  * debug_stop_all() - stops the debug feature if stopping is allowed.
996  *
997  * Return:
998  * -   none
999  *
1000  * Currently used in case of a kernel oops.
1001  */
1002 void debug_stop_all(void)
1003 {
1004         if (debug_stoppable)
1005                 debug_active = 0;
1006 }
1007 EXPORT_SYMBOL(debug_stop_all);
1008
1009 /**
1010  * debug_set_critical() - event/exception functions try lock instead of spin.
1011  *
1012  * Return:
1013  * -   none
1014  *
1015  * Currently used in case of stopping all CPUs but the current one.
1016  * Once in this state, functions to write a debug entry for an
1017  * event or exception no longer spin on the debug area lock,
1018  * but only try to get it and fail if they do not get the lock.
1019  */
1020 void debug_set_critical(void)
1021 {
1022         debug_critical = 1;
1023 }
1024
1025 /*
1026  * debug_event_common:
1027  * - write debug entry with given size
1028  */
1029 debug_entry_t *debug_event_common(debug_info_t *id, int level, const void *buf,
1030                                   int len)
1031 {
1032         debug_entry_t *active;
1033         unsigned long flags;
1034
1035         if (!debug_active || !id->areas)
1036                 return NULL;
1037         if (debug_critical) {
1038                 if (!spin_trylock_irqsave(&id->lock, flags))
1039                         return NULL;
1040         } else {
1041                 spin_lock_irqsave(&id->lock, flags);
1042         }
1043         do {
1044                 active = get_active_entry(id);
1045                 memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size));
1046                 if (len < id->buf_size)
1047                         memset((DEBUG_DATA(active)) + len, 0, id->buf_size - len);
1048                 debug_finish_entry(id, active, level, 0);
1049                 len -= id->buf_size;
1050                 buf += id->buf_size;
1051         } while (len > 0);
1052
1053         spin_unlock_irqrestore(&id->lock, flags);
1054         return active;
1055 }
1056 EXPORT_SYMBOL(debug_event_common);
1057
1058 /*
1059  * debug_exception_common:
1060  * - write debug entry with given size and switch to next debug area
1061  */
1062 debug_entry_t *debug_exception_common(debug_info_t *id, int level,
1063                                       const void *buf, int len)
1064 {
1065         debug_entry_t *active;
1066         unsigned long flags;
1067
1068         if (!debug_active || !id->areas)
1069                 return NULL;
1070         if (debug_critical) {
1071                 if (!spin_trylock_irqsave(&id->lock, flags))
1072                         return NULL;
1073         } else {
1074                 spin_lock_irqsave(&id->lock, flags);
1075         }
1076         do {
1077                 active = get_active_entry(id);
1078                 memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size));
1079                 if (len < id->buf_size)
1080                         memset((DEBUG_DATA(active)) + len, 0, id->buf_size - len);
1081                 debug_finish_entry(id, active, level, len <= id->buf_size);
1082                 len -= id->buf_size;
1083                 buf += id->buf_size;
1084         } while (len > 0);
1085
1086         spin_unlock_irqrestore(&id->lock, flags);
1087         return active;
1088 }
1089 EXPORT_SYMBOL(debug_exception_common);
1090
1091 /*
1092  * counts arguments in format string for sprintf view
1093  */
1094 static inline int debug_count_numargs(char *string)
1095 {
1096         int numargs = 0;
1097
1098         while (*string) {
1099                 if (*string++ == '%')
1100                         numargs++;
1101         }
1102         return numargs;
1103 }
1104
1105 /*
1106  * debug_sprintf_event:
1107  */
1108 debug_entry_t *__debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
1109 {
1110         debug_sprintf_entry_t *curr_event;
1111         debug_entry_t *active;
1112         unsigned long flags;
1113         int numargs, idx;
1114         va_list ap;
1115
1116         if (!debug_active || !id->areas)
1117                 return NULL;
1118         numargs = debug_count_numargs(string);
1119
1120         if (debug_critical) {
1121                 if (!spin_trylock_irqsave(&id->lock, flags))
1122                         return NULL;
1123         } else {
1124                 spin_lock_irqsave(&id->lock, flags);
1125         }
1126         active = get_active_entry(id);
1127         curr_event = (debug_sprintf_entry_t *) DEBUG_DATA(active);
1128         va_start(ap, string);
1129         curr_event->string = string;
1130         for (idx = 0; idx < min(numargs, (int)(id->buf_size / sizeof(long)) - 1); idx++)
1131                 curr_event->args[idx] = va_arg(ap, long);
1132         va_end(ap);
1133         debug_finish_entry(id, active, level, 0);
1134         spin_unlock_irqrestore(&id->lock, flags);
1135
1136         return active;
1137 }
1138 EXPORT_SYMBOL(__debug_sprintf_event);
1139
1140 /*
1141  * debug_sprintf_exception:
1142  */
1143 debug_entry_t *__debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
1144 {
1145         debug_sprintf_entry_t *curr_event;
1146         debug_entry_t *active;
1147         unsigned long flags;
1148         int numargs, idx;
1149         va_list ap;
1150
1151         if (!debug_active || !id->areas)
1152                 return NULL;
1153
1154         numargs = debug_count_numargs(string);
1155
1156         if (debug_critical) {
1157                 if (!spin_trylock_irqsave(&id->lock, flags))
1158                         return NULL;
1159         } else {
1160                 spin_lock_irqsave(&id->lock, flags);
1161         }
1162         active = get_active_entry(id);
1163         curr_event = (debug_sprintf_entry_t *)DEBUG_DATA(active);
1164         va_start(ap, string);
1165         curr_event->string = string;
1166         for (idx = 0; idx < min(numargs, (int)(id->buf_size / sizeof(long)) - 1); idx++)
1167                 curr_event->args[idx] = va_arg(ap, long);
1168         va_end(ap);
1169         debug_finish_entry(id, active, level, 1);
1170         spin_unlock_irqrestore(&id->lock, flags);
1171
1172         return active;
1173 }
1174 EXPORT_SYMBOL(__debug_sprintf_exception);
1175
1176 /**
1177  * debug_register_view() - registers new debug view and creates debugfs
1178  *                         dir entry
1179  *
1180  * @id:         handle for debug log
1181  * @view:       pointer to debug view struct
1182  *
1183  * Return:
1184  * -   0  : ok
1185  * -   < 0: Error
1186  */
1187 int debug_register_view(debug_info_t *id, struct debug_view *view)
1188 {
1189         unsigned long flags;
1190         struct dentry *pde;
1191         umode_t mode;
1192         int rc = 0;
1193         int i;
1194
1195         if (!id)
1196                 goto out;
1197         mode = (id->mode | S_IFREG) & ~S_IXUGO;
1198         if (!(view->prolog_proc || view->format_proc || view->header_proc))
1199                 mode &= ~(S_IRUSR | S_IRGRP | S_IROTH);
1200         if (!view->input_proc)
1201                 mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
1202         pde = debugfs_create_file(view->name, mode, id->debugfs_root_entry,
1203                                   id, &debug_file_ops);
1204         spin_lock_irqsave(&id->lock, flags);
1205         for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
1206                 if (!id->views[i])
1207                         break;
1208         }
1209         if (i == DEBUG_MAX_VIEWS) {
1210                 rc = -1;
1211         } else {
1212                 id->views[i] = view;
1213                 id->debugfs_entries[i] = pde;
1214         }
1215         spin_unlock_irqrestore(&id->lock, flags);
1216         if (rc) {
1217                 pr_err("Registering view %s/%s would exceed the maximum "
1218                        "number of views %i\n", id->name, view->name, i);
1219                 debugfs_remove(pde);
1220         }
1221 out:
1222         return rc;
1223 }
1224 EXPORT_SYMBOL(debug_register_view);
1225
1226 /**
1227  * debug_unregister_view() - unregisters debug view and removes debugfs
1228  *                           dir entry
1229  *
1230  * @id:         handle for debug log
1231  * @view:       pointer to debug view struct
1232  *
1233  * Return:
1234  * -   0  : ok
1235  * -   < 0: Error
1236  */
1237 int debug_unregister_view(debug_info_t *id, struct debug_view *view)
1238 {
1239         struct dentry *dentry = NULL;
1240         unsigned long flags;
1241         int i, rc = 0;
1242
1243         if (!id)
1244                 goto out;
1245         spin_lock_irqsave(&id->lock, flags);
1246         for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
1247                 if (id->views[i] == view)
1248                         break;
1249         }
1250         if (i == DEBUG_MAX_VIEWS) {
1251                 rc = -1;
1252         } else {
1253                 dentry = id->debugfs_entries[i];
1254                 id->views[i] = NULL;
1255                 id->debugfs_entries[i] = NULL;
1256         }
1257         spin_unlock_irqrestore(&id->lock, flags);
1258         debugfs_remove(dentry);
1259 out:
1260         return rc;
1261 }
1262 EXPORT_SYMBOL(debug_unregister_view);
1263
1264 static inline char *debug_get_user_string(const char __user *user_buf,
1265                                           size_t user_len)
1266 {
1267         char *buffer;
1268
1269         buffer = kmalloc(user_len + 1, GFP_KERNEL);
1270         if (!buffer)
1271                 return ERR_PTR(-ENOMEM);
1272         if (copy_from_user(buffer, user_buf, user_len) != 0) {
1273                 kfree(buffer);
1274                 return ERR_PTR(-EFAULT);
1275         }
1276         /* got the string, now strip linefeed. */
1277         if (buffer[user_len - 1] == '\n')
1278                 buffer[user_len - 1] = 0;
1279         else
1280                 buffer[user_len] = 0;
1281         return buffer;
1282 }
1283
1284 static inline int debug_get_uint(char *buf)
1285 {
1286         int rc;
1287
1288         buf = skip_spaces(buf);
1289         rc = simple_strtoul(buf, &buf, 10);
1290         if (*buf)
1291                 rc = -EINVAL;
1292         return rc;
1293 }
1294
1295 /*
1296  * functions for debug-views
1297  ***********************************
1298 */
1299
1300 /*
1301  * prints out actual debug level
1302  */
1303
1304 static int debug_prolog_pages_fn(debug_info_t *id, struct debug_view *view,
1305                                  char *out_buf, size_t out_buf_size)
1306 {
1307         return scnprintf(out_buf, out_buf_size, "%i\n", id->pages_per_area);
1308 }
1309
1310 /*
1311  * reads new size (number of pages per debug area)
1312  */
1313
1314 static int debug_input_pages_fn(debug_info_t *id, struct debug_view *view,
1315                                 struct file *file, const char __user *user_buf,
1316                                 size_t user_len, loff_t *offset)
1317 {
1318         int rc, new_pages;
1319         char *str;
1320
1321         if (user_len > 0x10000)
1322                 user_len = 0x10000;
1323         if (*offset != 0) {
1324                 rc = -EPIPE;
1325                 goto out;
1326         }
1327         str = debug_get_user_string(user_buf, user_len);
1328         if (IS_ERR(str)) {
1329                 rc = PTR_ERR(str);
1330                 goto out;
1331         }
1332         new_pages = debug_get_uint(str);
1333         if (new_pages < 0) {
1334                 rc = -EINVAL;
1335                 goto free_str;
1336         }
1337         rc = debug_set_size(id, id->nr_areas, new_pages);
1338         if (rc != 0) {
1339                 rc = -EINVAL;
1340                 goto free_str;
1341         }
1342         rc = user_len;
1343 free_str:
1344         kfree(str);
1345 out:
1346         *offset += user_len;
1347         return rc;              /* number of input characters */
1348 }
1349
1350 /*
1351  * prints out actual debug level
1352  */
1353 static int debug_prolog_level_fn(debug_info_t *id, struct debug_view *view,
1354                                  char *out_buf, size_t out_buf_size)
1355 {
1356         int rc = 0;
1357
1358         if (id->level == DEBUG_OFF_LEVEL)
1359                 rc = scnprintf(out_buf, out_buf_size, "-\n");
1360         else
1361                 rc = scnprintf(out_buf, out_buf_size, "%i\n", id->level);
1362         return rc;
1363 }
1364
1365 /*
1366  * reads new debug level
1367  */
1368 static int debug_input_level_fn(debug_info_t *id, struct debug_view *view,
1369                                 struct file *file, const char __user *user_buf,
1370                                 size_t user_len, loff_t *offset)
1371 {
1372         int rc, new_level;
1373         char *str;
1374
1375         if (user_len > 0x10000)
1376                 user_len = 0x10000;
1377         if (*offset != 0) {
1378                 rc = -EPIPE;
1379                 goto out;
1380         }
1381         str = debug_get_user_string(user_buf, user_len);
1382         if (IS_ERR(str)) {
1383                 rc = PTR_ERR(str);
1384                 goto out;
1385         }
1386         if (str[0] == '-') {
1387                 debug_set_level(id, DEBUG_OFF_LEVEL);
1388                 rc = user_len;
1389                 goto free_str;
1390         } else {
1391                 new_level = debug_get_uint(str);
1392         }
1393         if (new_level < 0) {
1394                 pr_warn("%s is not a valid level for a debug feature\n", str);
1395                 rc = -EINVAL;
1396         } else {
1397                 debug_set_level(id, new_level);
1398                 rc = user_len;
1399         }
1400 free_str:
1401         kfree(str);
1402 out:
1403         *offset += user_len;
1404         return rc;              /* number of input characters */
1405 }
1406
1407 /*
1408  * flushes debug areas
1409  */
1410 static void debug_flush(debug_info_t *id, int area)
1411 {
1412         unsigned long flags;
1413         int i, j;
1414
1415         if (!id || !id->areas)
1416                 return;
1417         spin_lock_irqsave(&id->lock, flags);
1418         if (area == DEBUG_FLUSH_ALL) {
1419                 id->active_area = 0;
1420                 memset(id->active_entries, 0, id->nr_areas * sizeof(int));
1421                 for (i = 0; i < id->nr_areas; i++) {
1422                         id->active_pages[i] = 0;
1423                         for (j = 0; j < id->pages_per_area; j++)
1424                                 memset(id->areas[i][j], 0, PAGE_SIZE);
1425                 }
1426         } else if (area >= 0 && area < id->nr_areas) {
1427                 id->active_entries[area] = 0;
1428                 id->active_pages[area] = 0;
1429                 for (i = 0; i < id->pages_per_area; i++)
1430                         memset(id->areas[area][i], 0, PAGE_SIZE);
1431         }
1432         spin_unlock_irqrestore(&id->lock, flags);
1433 }
1434
1435 /*
1436  * view function: flushes debug areas
1437  */
1438 static int debug_input_flush_fn(debug_info_t *id, struct debug_view *view,
1439                                 struct file *file, const char __user *user_buf,
1440                                 size_t user_len, loff_t *offset)
1441 {
1442         char input_buf[1];
1443         int rc = user_len;
1444
1445         if (user_len > 0x10000)
1446                 user_len = 0x10000;
1447         if (*offset != 0) {
1448                 rc = -EPIPE;
1449                 goto out;
1450         }
1451         if (copy_from_user(input_buf, user_buf, 1)) {
1452                 rc = -EFAULT;
1453                 goto out;
1454         }
1455         if (input_buf[0] == '-') {
1456                 debug_flush(id, DEBUG_FLUSH_ALL);
1457                 goto out;
1458         }
1459         if (isdigit(input_buf[0])) {
1460                 int area = ((int) input_buf[0] - (int) '0');
1461
1462                 debug_flush(id, area);
1463                 goto out;
1464         }
1465
1466         pr_info("Flushing debug data failed because %c is not a valid "
1467                  "area\n", input_buf[0]);
1468
1469 out:
1470         *offset += user_len;
1471         return rc;              /* number of input characters */
1472 }
1473
1474 /*
1475  * prints debug data in hex/ascii format
1476  */
1477 static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view,
1478                                      char *out_buf, size_t out_buf_size, const char *in_buf)
1479 {
1480         int i, rc = 0;
1481
1482         for (i = 0; i < id->buf_size; i++) {
1483                 rc += scnprintf(out_buf + rc, out_buf_size - rc,
1484                                 "%02x ", ((unsigned char *)in_buf)[i]);
1485         }
1486         rc += scnprintf(out_buf + rc, out_buf_size - rc, "| ");
1487         for (i = 0; i < id->buf_size; i++) {
1488                 unsigned char c = in_buf[i];
1489
1490                 if (isascii(c) && isprint(c))
1491                         rc += scnprintf(out_buf + rc, out_buf_size - rc, "%c", c);
1492                 else
1493                         rc += scnprintf(out_buf + rc, out_buf_size - rc, ".");
1494         }
1495         rc += scnprintf(out_buf + rc, out_buf_size - rc, "\n");
1496         return rc;
1497 }
1498
1499 /*
1500  * prints header for debug entry
1501  */
1502 int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view,
1503                          int area, debug_entry_t *entry, char *out_buf,
1504                          size_t out_buf_size)
1505 {
1506         unsigned long sec, usec;
1507         unsigned long caller;
1508         unsigned int level;
1509         char *except_str;
1510         int rc = 0;
1511
1512         level = entry->level;
1513         sec = entry->clock;
1514         usec = do_div(sec, USEC_PER_SEC);
1515
1516         if (entry->exception)
1517                 except_str = "*";
1518         else
1519                 except_str = "-";
1520         caller = (unsigned long) entry->caller;
1521         rc += scnprintf(out_buf, out_buf_size, "%02i %011ld:%06lu %1u %1s %04u %px  ",
1522                         area, sec, usec, level, except_str,
1523                         entry->cpu, (void *)caller);
1524         return rc;
1525 }
1526 EXPORT_SYMBOL(debug_dflt_header_fn);
1527
1528 /*
1529  * prints debug data sprintf-formatted:
1530  * debug_sprinf_event/exception calls must be used together with this view
1531  */
1532
1533 #define DEBUG_SPRINTF_MAX_ARGS 10
1534
1535 static int debug_sprintf_format_fn(debug_info_t *id, struct debug_view *view,
1536                                    char *out_buf, size_t out_buf_size, const char *inbuf)
1537 {
1538         debug_sprintf_entry_t *curr_event = (debug_sprintf_entry_t *)inbuf;
1539         int num_longs, num_used_args = 0, i, rc = 0;
1540         int index[DEBUG_SPRINTF_MAX_ARGS];
1541
1542         /* count of longs fit into one entry */
1543         num_longs = id->buf_size / sizeof(long);
1544
1545         if (num_longs < 1)
1546                 goto out; /* bufsize of entry too small */
1547         if (num_longs == 1) {
1548                 /* no args, we use only the string */
1549                 rc = strscpy(out_buf, curr_event->string, out_buf_size);
1550                 if (rc == -E2BIG)
1551                         rc = out_buf_size;
1552                 goto out;
1553         }
1554
1555         /* number of arguments used for sprintf (without the format string) */
1556         num_used_args = min(DEBUG_SPRINTF_MAX_ARGS, (num_longs - 1));
1557
1558         memset(index, 0, DEBUG_SPRINTF_MAX_ARGS * sizeof(int));
1559
1560         for (i = 0; i < num_used_args; i++)
1561                 index[i] = i;
1562
1563         rc = scnprintf(out_buf, out_buf_size,
1564                        curr_event->string, curr_event->args[index[0]],
1565                        curr_event->args[index[1]], curr_event->args[index[2]],
1566                        curr_event->args[index[3]], curr_event->args[index[4]],
1567                        curr_event->args[index[5]], curr_event->args[index[6]],
1568                        curr_event->args[index[7]], curr_event->args[index[8]],
1569                        curr_event->args[index[9]]);
1570 out:
1571         return rc;
1572 }
1573
1574 /*
1575  * debug_init:
1576  * - is called exactly once to initialize the debug feature
1577  */
1578 static int __init debug_init(void)
1579 {
1580         s390dbf_sysctl_header = register_sysctl("s390dbf", s390dbf_table);
1581         mutex_lock(&debug_mutex);
1582         debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT, NULL);
1583         initialized = 1;
1584         mutex_unlock(&debug_mutex);
1585         return 0;
1586 }
1587 postcore_initcall(debug_init);
This page took 0.113809 seconds and 4 git commands to generate.