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