1 /*
2 * lib/dynamic_debug.c
3 *
4 * make pr_debug()/dev_dbg() calls runtime configurable based upon their
5 * source module.
6 *
7 * Copyright (C) 2008 Jason Baron <jbaron@redhat.com>
8 * By Greg Banks <gnb@melbourne.sgi.com>
9 * Copyright (c) 2008 Silicon Graphics Inc. All Rights Reserved.
10 * Copyright (C) 2011 Bart Van Assche. All Rights Reserved.
11 * Copyright (C) 2013 Du, Changbin <changbin.du@gmail.com>
12 */
13
14 #define pr_fmt(fmt) "dyndbg: " fmt
15
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/kallsyms.h>
20 #include <linux/types.h>
21 #include <linux/mutex.h>
22 #include <linux/proc_fs.h>
23 #include <linux/seq_file.h>
24 #include <linux/list.h>
25 #include <linux/sysctl.h>
26 #include <linux/ctype.h>
27 #include <linux/string.h>
28 #include <linux/parser.h>
29 #include <linux/string_helpers.h>
30 #include <linux/uaccess.h>
31 #include <linux/dynamic_debug.h>
32 #include <linux/debugfs.h>
33 #include <linux/slab.h>
34 #include <linux/jump_label.h>
35 #include <linux/hardirq.h>
36 #include <linux/sched.h>
37 #include <linux/device.h>
38 #include <linux/netdevice.h>
39
40 #include <rdma/ib_verbs.h>
41
42 extern struct _ddebug __start___dyndbg[];
43 extern struct _ddebug __stop___dyndbg[];
44
45 struct ddebug_table {
46 struct list_head link;
47 const char *mod_name;
48 unsigned int num_ddebugs;
49 struct _ddebug *ddebugs;
50 };
51
52 struct ddebug_query {
53 const char *filename;
54 const char *module;
55 const char *function;
56 const char *format;
57 unsigned int first_lineno, last_lineno;
58 };
59
60 struct ddebug_iter {
61 struct ddebug_table *table;
62 unsigned int idx;
63 };
64
65 struct flag_settings {
66 unsigned int flags;
67 unsigned int mask;
68 };
69
70 static DEFINE_MUTEX(ddebug_lock);
71 static LIST_HEAD(ddebug_tables);
72 static int verbose;
73 module_param(verbose, int, 0644);
74
75 /* Return the path relative to source root */
trim_prefix(const char *path)76 static inline const char *trim_prefix(const char *path)
77 {
78 int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
79
80 if (strncmp(path, __FILE__, skip))
81 skip = 0; /* prefix mismatch, don't skip */
82
83 return path + skip;
84 }
85
86 static struct { unsigned flag:8; char opt_char; } opt_array[] = {
87 { _DPRINTK_FLAGS_PRINT, 'p' },
88 { _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
89 { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
90 { _DPRINTK_FLAGS_INCL_LINENO, 'l' },
91 { _DPRINTK_FLAGS_INCL_TID, 't' },
92 { _DPRINTK_FLAGS_NONE, '_' },
93 };
94
95 struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
96
97 /* format a string into buf[] which describes the _ddebug's flags */
ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)98 static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)
99 {
100 char *p = fb->buf;
101 int i;
102
103 for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
104 if (flags & opt_array[i].flag)
105 *p++ = opt_array[i].opt_char;
106 if (p == fb->buf)
107 *p++ = '_';
108 *p = '\0';
109
110 return fb->buf;
111 }
112
113 #define vnpr_info(lvl, fmt, ...) \
114 do { \
115 if (verbose >= lvl) \
116 pr_info(fmt, ##__VA_ARGS__); \
117 } while (0)
118
119 #define vpr_info(fmt, ...) vnpr_info(1, fmt, ##__VA_ARGS__)
120 #define v2pr_info(fmt, ...) vnpr_info(2, fmt, ##__VA_ARGS__)
121
vpr_info_dq(const struct ddebug_query *query, const char *msg)122 static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
123 {
124 /* trim any trailing newlines */
125 int fmtlen = 0;
126
127 if (query->format) {
128 fmtlen = strlen(query->format);
129 while (fmtlen && query->format[fmtlen - 1] == '\n')
130 fmtlen--;
131 }
132
133 vpr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u\n",
134 msg,
135 query->function ?: "",
136 query->filename ?: "",
137 query->module ?: "",
138 fmtlen, query->format ?: "",
139 query->first_lineno, query->last_lineno);
140 }
141
142 /*
143 * Search the tables for _ddebug's which match the given `query' and
144 * apply the `flags' and `mask' to them. Returns number of matching
145 * callsites, normally the same as number of changes. If verbose,
146 * logs the changes. Takes ddebug_lock.
147 */
ddebug_change(const struct ddebug_query *query, struct flag_settings *modifiers)148 static int ddebug_change(const struct ddebug_query *query,
149 struct flag_settings *modifiers)
150 {
151 int i;
152 struct ddebug_table *dt;
153 unsigned int newflags;
154 unsigned int nfound = 0;
155 struct flagsbuf fbuf;
156
157 /* search for matching ddebugs */
158 mutex_lock(&ddebug_lock);
159 list_for_each_entry(dt, &ddebug_tables, link) {
160
161 /* match against the module name */
162 if (query->module &&
163 !match_wildcard(query->module, dt->mod_name))
164 continue;
165
166 for (i = 0; i < dt->num_ddebugs; i++) {
167 struct _ddebug *dp = &dt->ddebugs[i];
168
169 /* match against the source filename */
170 if (query->filename &&
171 !match_wildcard(query->filename, dp->filename) &&
172 !match_wildcard(query->filename,
173 kbasename(dp->filename)) &&
174 !match_wildcard(query->filename,
175 trim_prefix(dp->filename)))
176 continue;
177
178 /* match against the function */
179 if (query->function &&
180 !match_wildcard(query->function, dp->function))
181 continue;
182
183 /* match against the format */
184 if (query->format) {
185 if (*query->format == '^') {
186 char *p;
187 /* anchored search. match must be at beginning */
188 p = strstr(dp->format, query->format+1);
189 if (p != dp->format)
190 continue;
191 } else if (!strstr(dp->format, query->format))
192 continue;
193 }
194
195 /* match against the line number range */
196 if (query->first_lineno &&
197 dp->lineno < query->first_lineno)
198 continue;
199 if (query->last_lineno &&
200 dp->lineno > query->last_lineno)
201 continue;
202
203 nfound++;
204
205 newflags = (dp->flags & modifiers->mask) | modifiers->flags;
206 if (newflags == dp->flags)
207 continue;
208 #ifdef CONFIG_JUMP_LABEL
209 if (dp->flags & _DPRINTK_FLAGS_PRINT) {
210 if (!(newflags & _DPRINTK_FLAGS_PRINT))
211 static_branch_disable(&dp->key.dd_key_true);
212 } else if (newflags & _DPRINTK_FLAGS_PRINT) {
213 static_branch_enable(&dp->key.dd_key_true);
214 }
215 #endif
216 dp->flags = newflags;
217 v2pr_info("changed %s:%d [%s]%s =%s\n",
218 trim_prefix(dp->filename), dp->lineno,
219 dt->mod_name, dp->function,
220 ddebug_describe_flags(dp->flags, &fbuf));
221 }
222 }
223 mutex_unlock(&ddebug_lock);
224
225 if (!nfound && verbose)
226 pr_info("no matches for query\n");
227
228 return nfound;
229 }
230
231 /*
232 * Split the buffer `buf' into space-separated words.
233 * Handles simple " and ' quoting, i.e. without nested,
234 * embedded or escaped \". Return the number of words
235 * or <0 on error.
236 */
ddebug_tokenize(char *buf, char *words[], int maxwords)237 static int ddebug_tokenize(char *buf, char *words[], int maxwords)
238 {
239 int nwords = 0;
240
241 while (*buf) {
242 char *end;
243
244 /* Skip leading whitespace */
245 buf = skip_spaces(buf);
246 if (!*buf)
247 break; /* oh, it was trailing whitespace */
248 if (*buf == '#')
249 break; /* token starts comment, skip rest of line */
250
251 /* find `end' of word, whitespace separated or quoted */
252 if (*buf == '"' || *buf == '\'') {
253 int quote = *buf++;
254 for (end = buf; *end && *end != quote; end++)
255 ;
256 if (!*end) {
257 pr_err("unclosed quote: %s\n", buf);
258 return -EINVAL; /* unclosed quote */
259 }
260 } else {
261 for (end = buf; *end && !isspace(*end); end++)
262 ;
263 if (end == buf) {
264 pr_err("parse err after word:%d=%s\n", nwords,
265 nwords ? words[nwords - 1] : "<none>");
266 return -EINVAL;
267 }
268 }
269
270 /* `buf' is start of word, `end' is one past its end */
271 if (nwords == maxwords) {
272 pr_err("too many words, legal max <=%d\n", maxwords);
273 return -EINVAL; /* ran out of words[] before bytes */
274 }
275 if (*end)
276 *end++ = '\0'; /* terminate the word */
277 words[nwords++] = buf;
278 buf = end;
279 }
280
281 if (verbose) {
282 int i;
283 pr_info("split into words:");
284 for (i = 0; i < nwords; i++)
285 pr_cont(" \"%s\"", words[i]);
286 pr_cont("\n");
287 }
288
289 return nwords;
290 }
291
292 /*
293 * Parse a single line number. Note that the empty string ""
294 * is treated as a special case and converted to zero, which
295 * is later treated as a "don't care" value.
296 */
parse_lineno(const char *str, unsigned int *val)297 static inline int parse_lineno(const char *str, unsigned int *val)
298 {
299 BUG_ON(str == NULL);
300 if (*str == '\0') {
301 *val = 0;
302 return 0;
303 }
304 if (kstrtouint(str, 10, val) < 0) {
305 pr_err("bad line-number: %s\n", str);
306 return -EINVAL;
307 }
308 return 0;
309 }
310
parse_linerange(struct ddebug_query *query, const char *first)311 static int parse_linerange(struct ddebug_query *query, const char *first)
312 {
313 char *last = strchr(first, '-');
314
315 if (query->first_lineno || query->last_lineno) {
316 pr_err("match-spec: line used 2x\n");
317 return -EINVAL;
318 }
319 if (last)
320 *last++ = '\0';
321 if (parse_lineno(first, &query->first_lineno) < 0)
322 return -EINVAL;
323 if (last) {
324 /* range <first>-<last> */
325 if (parse_lineno(last, &query->last_lineno) < 0)
326 return -EINVAL;
327
328 /* special case for last lineno not specified */
329 if (query->last_lineno == 0)
330 query->last_lineno = UINT_MAX;
331
332 if (query->last_lineno < query->first_lineno) {
333 pr_err("last-line:%d < 1st-line:%d\n",
334 query->last_lineno,
335 query->first_lineno);
336 return -EINVAL;
337 }
338 } else {
339 query->last_lineno = query->first_lineno;
340 }
341 vpr_info("parsed line %d-%d\n", query->first_lineno,
342 query->last_lineno);
343 return 0;
344 }
345
check_set(const char **dest, char *src, char *name)346 static int check_set(const char **dest, char *src, char *name)
347 {
348 int rc = 0;
349
350 if (*dest) {
351 rc = -EINVAL;
352 pr_err("match-spec:%s val:%s overridden by %s\n",
353 name, *dest, src);
354 }
355 *dest = src;
356 return rc;
357 }
358
359 /*
360 * Parse words[] as a ddebug query specification, which is a series
361 * of (keyword, value) pairs chosen from these possibilities:
362 *
363 * func <function-name>
364 * file <full-pathname>
365 * file <base-filename>
366 * module <module-name>
367 * format <escaped-string-to-find-in-format>
368 * line <lineno>
369 * line <first-lineno>-<last-lineno> // where either may be empty
370 *
371 * Only 1 of each type is allowed.
372 * Returns 0 on success, <0 on error.
373 */
ddebug_parse_query(char *words[], int nwords, struct ddebug_query *query, const char *modname)374 static int ddebug_parse_query(char *words[], int nwords,
375 struct ddebug_query *query, const char *modname)
376 {
377 unsigned int i;
378 int rc = 0;
379 char *fline;
380
381 /* check we have an even number of words */
382 if (nwords % 2 != 0) {
383 pr_err("expecting pairs of match-spec <value>\n");
384 return -EINVAL;
385 }
386
387 for (i = 0; i < nwords; i += 2) {
388 char *keyword = words[i];
389 char *arg = words[i+1];
390
391 if (!strcmp(keyword, "func")) {
392 rc = check_set(&query->function, arg, "func");
393 } else if (!strcmp(keyword, "file")) {
394 if (check_set(&query->filename, arg, "file"))
395 return -EINVAL;
396
397 /* tail :$info is function or line-range */
398 fline = strchr(query->filename, ':');
399 if (!fline)
400 continue;
401 *fline++ = '\0';
402 if (isalpha(*fline) || *fline == '*' || *fline == '?') {
403 /* take as function name */
404 if (check_set(&query->function, fline, "func"))
405 return -EINVAL;
406 } else {
407 if (parse_linerange(query, fline))
408 return -EINVAL;
409 }
410 } else if (!strcmp(keyword, "module")) {
411 rc = check_set(&query->module, arg, "module");
412 } else if (!strcmp(keyword, "format")) {
413 string_unescape_inplace(arg, UNESCAPE_SPACE |
414 UNESCAPE_OCTAL |
415 UNESCAPE_SPECIAL);
416 rc = check_set(&query->format, arg, "format");
417 } else if (!strcmp(keyword, "line")) {
418 if (parse_linerange(query, arg))
419 return -EINVAL;
420 } else {
421 pr_err("unknown keyword \"%s\"\n", keyword);
422 return -EINVAL;
423 }
424 if (rc)
425 return rc;
426 }
427 if (!query->module && modname)
428 /*
429 * support $modname.dyndbg=<multiple queries>, when
430 * not given in the query itself
431 */
432 query->module = modname;
433
434 vpr_info_dq(query, "parsed");
435 return 0;
436 }
437
438 /*
439 * Parse `str' as a flags specification, format [-+=][p]+.
440 * Sets up *maskp and *flagsp to be used when changing the
441 * flags fields of matched _ddebug's. Returns 0 on success
442 * or <0 on error.
443 */
ddebug_parse_flags(const char *str, struct flag_settings *modifiers)444 static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
445 {
446 int op, i;
447
448 switch (*str) {
449 case '+':
450 case '-':
451 case '=':
452 op = *str++;
453 break;
454 default:
455 pr_err("bad flag-op %c, at start of %s\n", *str, str);
456 return -EINVAL;
457 }
458 vpr_info("op='%c'\n", op);
459
460 for (; *str ; ++str) {
461 for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
462 if (*str == opt_array[i].opt_char) {
463 modifiers->flags |= opt_array[i].flag;
464 break;
465 }
466 }
467 if (i < 0) {
468 pr_err("unknown flag '%c'\n", *str);
469 return -EINVAL;
470 }
471 }
472 vpr_info("flags=0x%x\n", modifiers->flags);
473
474 /* calculate final flags, mask based upon op */
475 switch (op) {
476 case '=':
477 /* modifiers->flags already set */
478 modifiers->mask = 0;
479 break;
480 case '+':
481 modifiers->mask = ~0U;
482 break;
483 case '-':
484 modifiers->mask = ~modifiers->flags;
485 modifiers->flags = 0;
486 break;
487 }
488 vpr_info("*flagsp=0x%x *maskp=0x%x\n", modifiers->flags, modifiers->mask);
489
490 return 0;
491 }
492
ddebug_exec_query(char *query_string, const char *modname)493 static int ddebug_exec_query(char *query_string, const char *modname)
494 {
495 struct flag_settings modifiers = {};
496 struct ddebug_query query = {};
497 #define MAXWORDS 9
498 int nwords, nfound;
499 char *words[MAXWORDS];
500
501 nwords = ddebug_tokenize(query_string, words, MAXWORDS);
502 if (nwords <= 0) {
503 pr_err("tokenize failed\n");
504 return -EINVAL;
505 }
506 /* check flags 1st (last arg) so query is pairs of spec,val */
507 if (ddebug_parse_flags(words[nwords-1], &modifiers)) {
508 pr_err("flags parse failed\n");
509 return -EINVAL;
510 }
511 if (ddebug_parse_query(words, nwords-1, &query, modname)) {
512 pr_err("query parse failed\n");
513 return -EINVAL;
514 }
515 /* actually go and implement the change */
516 nfound = ddebug_change(&query, &modifiers);
517 vpr_info_dq(&query, nfound ? "applied" : "no-match");
518
519 return nfound;
520 }
521
522 /* handle multiple queries in query string, continue on error, return
523 last error or number of matching callsites. Module name is either
524 in param (for boot arg) or perhaps in query string.
525 */
ddebug_exec_queries(char *query, const char *modname)526 static int ddebug_exec_queries(char *query, const char *modname)
527 {
528 char *split;
529 int i, errs = 0, exitcode = 0, rc, nfound = 0;
530
531 for (i = 0; query; query = split) {
532 split = strpbrk(query, ";\n");
533 if (split)
534 *split++ = '\0';
535
536 query = skip_spaces(query);
537 if (!query || !*query || *query == '#')
538 continue;
539
540 vpr_info("query %d: \"%s\"\n", i, query);
541
542 rc = ddebug_exec_query(query, modname);
543 if (rc < 0) {
544 errs++;
545 exitcode = rc;
546 } else {
547 nfound += rc;
548 }
549 i++;
550 }
551 vpr_info("processed %d queries, with %d matches, %d errs\n",
552 i, nfound, errs);
553
554 if (exitcode)
555 return exitcode;
556 return nfound;
557 }
558
559 #define PREFIX_SIZE 64
560
remaining(int wrote)561 static int remaining(int wrote)
562 {
563 if (PREFIX_SIZE - wrote > 0)
564 return PREFIX_SIZE - wrote;
565 return 0;
566 }
567
dynamic_emit_prefix(const struct _ddebug *desc, char *buf)568 static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
569 {
570 int pos_after_tid;
571 int pos = 0;
572
573 *buf = '\0';
574
575 if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
576 if (in_interrupt())
577 pos += snprintf(buf + pos, remaining(pos), "<intr> ");
578 else
579 pos += snprintf(buf + pos, remaining(pos), "[%d] ",
580 task_pid_vnr(current));
581 }
582 pos_after_tid = pos;
583 if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
584 pos += snprintf(buf + pos, remaining(pos), "%s:",
585 desc->modname);
586 if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
587 pos += snprintf(buf + pos, remaining(pos), "%s:",
588 desc->function);
589 if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
590 pos += snprintf(buf + pos, remaining(pos), "%d:",
591 desc->lineno);
592 if (pos - pos_after_tid)
593 pos += snprintf(buf + pos, remaining(pos), " ");
594 if (pos >= PREFIX_SIZE)
595 buf[PREFIX_SIZE - 1] = '\0';
596
597 return buf;
598 }
599
__dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)600 void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
601 {
602 va_list args;
603 struct va_format vaf;
604 char buf[PREFIX_SIZE];
605
606 BUG_ON(!descriptor);
607 BUG_ON(!fmt);
608
609 va_start(args, fmt);
610
611 vaf.fmt = fmt;
612 vaf.va = &args;
613
614 printk(KERN_DEBUG "%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
615
616 va_end(args);
617 }
618 EXPORT_SYMBOL(__dynamic_pr_debug);
619
__dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev, const char *fmt, ...)620 void __dynamic_dev_dbg(struct _ddebug *descriptor,
621 const struct device *dev, const char *fmt, ...)
622 {
623 struct va_format vaf;
624 va_list args;
625
626 BUG_ON(!descriptor);
627 BUG_ON(!fmt);
628
629 va_start(args, fmt);
630
631 vaf.fmt = fmt;
632 vaf.va = &args;
633
634 if (!dev) {
635 printk(KERN_DEBUG "(NULL device *): %pV", &vaf);
636 } else {
637 char buf[PREFIX_SIZE];
638
639 dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV",
640 dynamic_emit_prefix(descriptor, buf),
641 dev_driver_string(dev), dev_name(dev),
642 &vaf);
643 }
644
645 va_end(args);
646 }
647 EXPORT_SYMBOL(__dynamic_dev_dbg);
648
649 #ifdef CONFIG_NET
650
__dynamic_netdev_dbg(struct _ddebug *descriptor, const struct net_device *dev, const char *fmt, ...)651 void __dynamic_netdev_dbg(struct _ddebug *descriptor,
652 const struct net_device *dev, const char *fmt, ...)
653 {
654 struct va_format vaf;
655 va_list args;
656
657 BUG_ON(!descriptor);
658 BUG_ON(!fmt);
659
660 va_start(args, fmt);
661
662 vaf.fmt = fmt;
663 vaf.va = &args;
664
665 if (dev && dev->dev.parent) {
666 char buf[PREFIX_SIZE];
667
668 dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent,
669 "%s%s %s %s%s: %pV",
670 dynamic_emit_prefix(descriptor, buf),
671 dev_driver_string(dev->dev.parent),
672 dev_name(dev->dev.parent),
673 netdev_name(dev), netdev_reg_state(dev),
674 &vaf);
675 } else if (dev) {
676 printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev),
677 netdev_reg_state(dev), &vaf);
678 } else {
679 printk(KERN_DEBUG "(NULL net_device): %pV", &vaf);
680 }
681
682 va_end(args);
683 }
684 EXPORT_SYMBOL(__dynamic_netdev_dbg);
685
686 #endif
687
688 #if IS_ENABLED(CONFIG_INFINIBAND)
689
__dynamic_ibdev_dbg(struct _ddebug *descriptor, const struct ib_device *ibdev, const char *fmt, ...)690 void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
691 const struct ib_device *ibdev, const char *fmt, ...)
692 {
693 struct va_format vaf;
694 va_list args;
695
696 va_start(args, fmt);
697
698 vaf.fmt = fmt;
699 vaf.va = &args;
700
701 if (ibdev && ibdev->dev.parent) {
702 char buf[PREFIX_SIZE];
703
704 dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent,
705 "%s%s %s %s: %pV",
706 dynamic_emit_prefix(descriptor, buf),
707 dev_driver_string(ibdev->dev.parent),
708 dev_name(ibdev->dev.parent),
709 dev_name(&ibdev->dev),
710 &vaf);
711 } else if (ibdev) {
712 printk(KERN_DEBUG "%s: %pV", dev_name(&ibdev->dev), &vaf);
713 } else {
714 printk(KERN_DEBUG "(NULL ib_device): %pV", &vaf);
715 }
716
717 va_end(args);
718 }
719 EXPORT_SYMBOL(__dynamic_ibdev_dbg);
720
721 #endif
722
723 #define DDEBUG_STRING_SIZE 1024
724 static __initdata char ddebug_setup_string[DDEBUG_STRING_SIZE];
725
ddebug_setup_query(char *str)726 static __init int ddebug_setup_query(char *str)
727 {
728 if (strlen(str) >= DDEBUG_STRING_SIZE) {
729 pr_warn("ddebug boot param string too large\n");
730 return 0;
731 }
732 strlcpy(ddebug_setup_string, str, DDEBUG_STRING_SIZE);
733 return 1;
734 }
735
736 __setup("ddebug_query=", ddebug_setup_query);
737
738 /*
739 * File_ops->write method for <debugfs>/dynamic_debug/control. Gathers the
740 * command text from userspace, parses and executes it.
741 */
742 #define USER_BUF_PAGE 4096
ddebug_proc_write(struct file *file, const char __user *ubuf, size_t len, loff_t *offp)743 static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
744 size_t len, loff_t *offp)
745 {
746 char *tmpbuf;
747 int ret;
748
749 if (len == 0)
750 return 0;
751 if (len > USER_BUF_PAGE - 1) {
752 pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
753 return -E2BIG;
754 }
755 tmpbuf = memdup_user_nul(ubuf, len);
756 if (IS_ERR(tmpbuf))
757 return PTR_ERR(tmpbuf);
758 vpr_info("read %d bytes from userspace\n", (int)len);
759
760 ret = ddebug_exec_queries(tmpbuf, NULL);
761 kfree(tmpbuf);
762 if (ret < 0)
763 return ret;
764
765 *offp += len;
766 return len;
767 }
768
769 /*
770 * Set the iterator to point to the first _ddebug object
771 * and return a pointer to that first object. Returns
772 * NULL if there are no _ddebugs at all.
773 */
ddebug_iter_first(struct ddebug_iter *iter)774 static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
775 {
776 if (list_empty(&ddebug_tables)) {
777 iter->table = NULL;
778 iter->idx = 0;
779 return NULL;
780 }
781 iter->table = list_entry(ddebug_tables.next,
782 struct ddebug_table, link);
783 iter->idx = 0;
784 return &iter->table->ddebugs[iter->idx];
785 }
786
787 /*
788 * Advance the iterator to point to the next _ddebug
789 * object from the one the iterator currently points at,
790 * and returns a pointer to the new _ddebug. Returns
791 * NULL if the iterator has seen all the _ddebugs.
792 */
ddebug_iter_next(struct ddebug_iter *iter)793 static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
794 {
795 if (iter->table == NULL)
796 return NULL;
797 if (++iter->idx == iter->table->num_ddebugs) {
798 /* iterate to next table */
799 iter->idx = 0;
800 if (list_is_last(&iter->table->link, &ddebug_tables)) {
801 iter->table = NULL;
802 return NULL;
803 }
804 iter->table = list_entry(iter->table->link.next,
805 struct ddebug_table, link);
806 }
807 return &iter->table->ddebugs[iter->idx];
808 }
809
810 /*
811 * Seq_ops start method. Called at the start of every
812 * read() call from userspace. Takes the ddebug_lock and
813 * seeks the seq_file's iterator to the given position.
814 */
ddebug_proc_start(struct seq_file *m, loff_t *pos)815 static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)
816 {
817 struct ddebug_iter *iter = m->private;
818 struct _ddebug *dp;
819 int n = *pos;
820
821 mutex_lock(&ddebug_lock);
822
823 if (!n)
824 return SEQ_START_TOKEN;
825 if (n < 0)
826 return NULL;
827 dp = ddebug_iter_first(iter);
828 while (dp != NULL && --n > 0)
829 dp = ddebug_iter_next(iter);
830 return dp;
831 }
832
833 /*
834 * Seq_ops next method. Called several times within a read()
835 * call from userspace, with ddebug_lock held. Walks to the
836 * next _ddebug object with a special case for the header line.
837 */
ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)838 static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
839 {
840 struct ddebug_iter *iter = m->private;
841 struct _ddebug *dp;
842
843 if (p == SEQ_START_TOKEN)
844 dp = ddebug_iter_first(iter);
845 else
846 dp = ddebug_iter_next(iter);
847 ++*pos;
848 return dp;
849 }
850
851 /*
852 * Seq_ops show method. Called several times within a read()
853 * call from userspace, with ddebug_lock held. Formats the
854 * current _ddebug as a single human-readable line, with a
855 * special case for the header line.
856 */
ddebug_proc_show(struct seq_file *m, void *p)857 static int ddebug_proc_show(struct seq_file *m, void *p)
858 {
859 struct ddebug_iter *iter = m->private;
860 struct _ddebug *dp = p;
861 struct flagsbuf flags;
862
863 if (p == SEQ_START_TOKEN) {
864 seq_puts(m,
865 "# filename:lineno [module]function flags format\n");
866 return 0;
867 }
868
869 seq_printf(m, "%s:%u [%s]%s =%s \"",
870 trim_prefix(dp->filename), dp->lineno,
871 iter->table->mod_name, dp->function,
872 ddebug_describe_flags(dp->flags, &flags));
873 seq_escape(m, dp->format, "\t\r\n\"");
874 seq_puts(m, "\"\n");
875
876 return 0;
877 }
878
879 /*
880 * Seq_ops stop method. Called at the end of each read()
881 * call from userspace. Drops ddebug_lock.
882 */
ddebug_proc_stop(struct seq_file *m, void *p)883 static void ddebug_proc_stop(struct seq_file *m, void *p)
884 {
885 mutex_unlock(&ddebug_lock);
886 }
887
888 static const struct seq_operations ddebug_proc_seqops = {
889 .start = ddebug_proc_start,
890 .next = ddebug_proc_next,
891 .show = ddebug_proc_show,
892 .stop = ddebug_proc_stop
893 };
894
ddebug_proc_open(struct inode *inode, struct file *file)895 static int ddebug_proc_open(struct inode *inode, struct file *file)
896 {
897 vpr_info("called\n");
898 return seq_open_private(file, &ddebug_proc_seqops,
899 sizeof(struct ddebug_iter));
900 }
901
902 static const struct file_operations ddebug_proc_fops = {
903 .owner = THIS_MODULE,
904 .open = ddebug_proc_open,
905 .read = seq_read,
906 .llseek = seq_lseek,
907 .release = seq_release_private,
908 .write = ddebug_proc_write
909 };
910
911 static const struct proc_ops proc_fops = {
912 .proc_open = ddebug_proc_open,
913 .proc_read = seq_read,
914 .proc_lseek = seq_lseek,
915 .proc_release = seq_release_private,
916 .proc_write = ddebug_proc_write
917 };
918
919 /*
920 * Allocate a new ddebug_table for the given module
921 * and add it to the global list.
922 */
ddebug_add_module(struct _ddebug *tab, unsigned int n, const char *name)923 int ddebug_add_module(struct _ddebug *tab, unsigned int n,
924 const char *name)
925 {
926 struct ddebug_table *dt;
927
928 dt = kzalloc(sizeof(*dt), GFP_KERNEL);
929 if (dt == NULL) {
930 pr_err("error adding module: %s\n", name);
931 return -ENOMEM;
932 }
933 /*
934 * For built-in modules, name lives in .rodata and is
935 * immortal. For loaded modules, name points at the name[]
936 * member of struct module, which lives at least as long as
937 * this struct ddebug_table.
938 */
939 dt->mod_name = name;
940 dt->num_ddebugs = n;
941 dt->ddebugs = tab;
942
943 mutex_lock(&ddebug_lock);
944 list_add(&dt->link, &ddebug_tables);
945 mutex_unlock(&ddebug_lock);
946
947 v2pr_info("%3u debug prints in module %s\n", n, dt->mod_name);
948 return 0;
949 }
950
951 /* helper for ddebug_dyndbg_(boot|module)_param_cb */
ddebug_dyndbg_param_cb(char *param, char *val, const char *modname, int on_err)952 static int ddebug_dyndbg_param_cb(char *param, char *val,
953 const char *modname, int on_err)
954 {
955 char *sep;
956
957 sep = strchr(param, '.');
958 if (sep) {
959 /* needed only for ddebug_dyndbg_boot_param_cb */
960 *sep = '\0';
961 modname = param;
962 param = sep + 1;
963 }
964 if (strcmp(param, "dyndbg"))
965 return on_err; /* determined by caller */
966
967 ddebug_exec_queries((val ? val : "+p"), modname);
968
969 return 0; /* query failure shouldnt stop module load */
970 }
971
972 /* handle both dyndbg and $module.dyndbg params at boot */
ddebug_dyndbg_boot_param_cb(char *param, char *val, const char *unused, void *arg)973 static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
974 const char *unused, void *arg)
975 {
976 vpr_info("%s=\"%s\"\n", param, val);
977 return ddebug_dyndbg_param_cb(param, val, NULL, 0);
978 }
979
980 /*
981 * modprobe foo finds foo.params in boot-args, strips "foo.", and
982 * passes them to load_module(). This callback gets unknown params,
983 * processes dyndbg params, rejects others.
984 */
ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)985 int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)
986 {
987 vpr_info("module: %s %s=\"%s\"\n", module, param, val);
988 return ddebug_dyndbg_param_cb(param, val, module, -ENOENT);
989 }
990
ddebug_table_free(struct ddebug_table *dt)991 static void ddebug_table_free(struct ddebug_table *dt)
992 {
993 list_del_init(&dt->link);
994 kfree(dt);
995 }
996
997 /*
998 * Called in response to a module being unloaded. Removes
999 * any ddebug_table's which point at the module.
1000 */
ddebug_remove_module(const char *mod_name)1001 int ddebug_remove_module(const char *mod_name)
1002 {
1003 struct ddebug_table *dt, *nextdt;
1004 int ret = -ENOENT;
1005
1006 v2pr_info("removing module \"%s\"\n", mod_name);
1007
1008 mutex_lock(&ddebug_lock);
1009 list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) {
1010 if (dt->mod_name == mod_name) {
1011 ddebug_table_free(dt);
1012 ret = 0;
1013 break;
1014 }
1015 }
1016 mutex_unlock(&ddebug_lock);
1017 return ret;
1018 }
1019
ddebug_remove_all_tables(void)1020 static void ddebug_remove_all_tables(void)
1021 {
1022 mutex_lock(&ddebug_lock);
1023 while (!list_empty(&ddebug_tables)) {
1024 struct ddebug_table *dt = list_entry(ddebug_tables.next,
1025 struct ddebug_table,
1026 link);
1027 ddebug_table_free(dt);
1028 }
1029 mutex_unlock(&ddebug_lock);
1030 }
1031
1032 static __initdata int ddebug_init_success;
1033
dynamic_debug_init_control(void)1034 static int __init dynamic_debug_init_control(void)
1035 {
1036 struct proc_dir_entry *procfs_dir;
1037 struct dentry *debugfs_dir;
1038
1039 if (!ddebug_init_success)
1040 return -ENODEV;
1041
1042 /* Create the control file in debugfs if it is enabled */
1043 if (debugfs_initialized()) {
1044 debugfs_dir = debugfs_create_dir("dynamic_debug", NULL);
1045 debugfs_create_file("control", 0644, debugfs_dir, NULL,
1046 &ddebug_proc_fops);
1047 }
1048
1049 /* Also create the control file in procfs */
1050 procfs_dir = proc_mkdir("dynamic_debug", NULL);
1051 if (procfs_dir)
1052 proc_create("control", 0644, procfs_dir, &proc_fops);
1053
1054 return 0;
1055 }
1056
dynamic_debug_init(void)1057 static int __init dynamic_debug_init(void)
1058 {
1059 struct _ddebug *iter, *iter_start;
1060 const char *modname = NULL;
1061 char *cmdline;
1062 int ret = 0;
1063 int n = 0, entries = 0, modct = 0;
1064
1065 if (&__start___dyndbg == &__stop___dyndbg) {
1066 if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
1067 pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n");
1068 return 1;
1069 }
1070 pr_info("Ignore empty _ddebug table in a CONFIG_DYNAMIC_DEBUG_CORE build\n");
1071 ddebug_init_success = 1;
1072 return 0;
1073 }
1074 iter = __start___dyndbg;
1075 modname = iter->modname;
1076 iter_start = iter;
1077 for (; iter < __stop___dyndbg; iter++) {
1078 entries++;
1079 if (strcmp(modname, iter->modname)) {
1080 modct++;
1081 ret = ddebug_add_module(iter_start, n, modname);
1082 if (ret)
1083 goto out_err;
1084 n = 0;
1085 modname = iter->modname;
1086 iter_start = iter;
1087 }
1088 n++;
1089 }
1090 ret = ddebug_add_module(iter_start, n, modname);
1091 if (ret)
1092 goto out_err;
1093
1094 ddebug_init_success = 1;
1095 vpr_info("%d modules, %d entries and %d bytes in ddebug tables, %d bytes in __dyndbg section\n",
1096 modct, entries, (int)(modct * sizeof(struct ddebug_table)),
1097 (int)(entries * sizeof(struct _ddebug)));
1098
1099 /* apply ddebug_query boot param, dont unload tables on err */
1100 if (ddebug_setup_string[0] != '\0') {
1101 pr_warn("ddebug_query param name is deprecated, change it to dyndbg\n");
1102 ret = ddebug_exec_queries(ddebug_setup_string, NULL);
1103 if (ret < 0)
1104 pr_warn("Invalid ddebug boot param %s\n",
1105 ddebug_setup_string);
1106 else
1107 pr_info("%d changes by ddebug_query\n", ret);
1108 }
1109 /* now that ddebug tables are loaded, process all boot args
1110 * again to find and activate queries given in dyndbg params.
1111 * While this has already been done for known boot params, it
1112 * ignored the unknown ones (dyndbg in particular). Reusing
1113 * parse_args avoids ad-hoc parsing. This will also attempt
1114 * to activate queries for not-yet-loaded modules, which is
1115 * slightly noisy if verbose, but harmless.
1116 */
1117 cmdline = kstrdup(saved_command_line, GFP_KERNEL);
1118 parse_args("dyndbg params", cmdline, NULL,
1119 0, 0, 0, NULL, &ddebug_dyndbg_boot_param_cb);
1120 kfree(cmdline);
1121 return 0;
1122
1123 out_err:
1124 ddebug_remove_all_tables();
1125 return 0;
1126 }
1127 /* Allow early initialization for boot messages via boot param */
1128 early_initcall(dynamic_debug_init);
1129
1130 /* Debugfs setup must be done later */
1131 fs_initcall(dynamic_debug_init_control);
1132