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