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