linux/lib/dynamic_debug.c
<<
>>
Prefs
   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 */
  12
  13#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  14
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/moduleparam.h>
  18#include <linux/kallsyms.h>
  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>
  26#include <linux/string.h>
  27#include <linux/uaccess.h>
  28#include <linux/dynamic_debug.h>
  29#include <linux/debugfs.h>
  30#include <linux/slab.h>
  31#include <linux/jump_label.h>
  32#include <linux/hardirq.h>
  33#include <linux/sched.h>
  34#include <linux/device.h>
  35#include <linux/netdevice.h>
  36
  37extern struct _ddebug __start___verbose[];
  38extern struct _ddebug __stop___verbose[];
  39
  40struct ddebug_table {
  41        struct list_head link;
  42        char *mod_name;
  43        unsigned int num_ddebugs;
  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;
  63module_param(verbose, int, 0644);
  64
  65/* Return the path relative to source root */
  66static inline const char *trim_prefix(const char *path)
  67{
  68        int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
  69
  70        if (strncmp(path, __FILE__, skip))
  71                skip = 0; /* prefix mismatch, don't skip */
  72
  73        return path + skip;
  74}
  75
  76static struct { unsigned flag:8; char opt_char; } opt_array[] = {
  77        { _DPRINTK_FLAGS_PRINT, 'p' },
  78        { _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
  79        { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
  80        { _DPRINTK_FLAGS_INCL_LINENO, 'l' },
  81        { _DPRINTK_FLAGS_INCL_TID, 't' },
  82        { _DPRINTK_FLAGS_NONE, '_' },
  83};
  84
  85/* format a string into buf[] which describes the _ddebug's flags */
  86static char *ddebug_describe_flags(struct _ddebug *dp, char *buf,
  87                                    size_t maxlen)
  88{
  89        char *p = buf;
  90        int i;
  91
  92        BUG_ON(maxlen < 6);
  93        for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
  94                if (dp->flags & opt_array[i].flag)
  95                        *p++ = opt_array[i].opt_char;
  96        if (p == buf)
  97                *p++ = '_';
  98        *p = '\0';
  99
 100        return buf;
 101}
 102
 103#define vpr_info(fmt, ...)                                      \
 104do {                                                            \
 105        if (verbose)                                            \
 106                pr_info(fmt, ##__VA_ARGS__);                    \
 107} while (0)
 108
 109static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 110{
 111        /* trim any trailing newlines */
 112        int fmtlen = 0;
 113
 114        if (query->format) {
 115                fmtlen = strlen(query->format);
 116                while (fmtlen && query->format[fmtlen - 1] == '\n')
 117                        fmtlen--;
 118        }
 119
 120        vpr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u\n",
 121                 msg,
 122                 query->function ? query->function : "",
 123                 query->filename ? query->filename : "",
 124                 query->module ? query->module : "",
 125                 fmtlen, query->format ? query->format : "",
 126                 query->first_lineno, query->last_lineno);
 127}
 128
 129/*
 130 * Search the tables for _ddebug's which match the given `query' and
 131 * apply the `flags' and `mask' to them.  Returns number of matching
 132 * callsites, normally the same as number of changes.  If verbose,
 133 * logs the changes.  Takes ddebug_lock.
 134 */
 135static int ddebug_change(const struct ddebug_query *query,
 136                        unsigned int flags, unsigned int mask)
 137{
 138        int i;
 139        struct ddebug_table *dt;
 140        unsigned int newflags;
 141        unsigned int nfound = 0;
 142        char flagbuf[10];
 143
 144        /* search for matching ddebugs */
 145        mutex_lock(&ddebug_lock);
 146        list_for_each_entry(dt, &ddebug_tables, link) {
 147
 148                /* match against the module name */
 149                if (query->module && strcmp(query->module, dt->mod_name))
 150                        continue;
 151
 152                for (i = 0; i < dt->num_ddebugs; i++) {
 153                        struct _ddebug *dp = &dt->ddebugs[i];
 154
 155                        /* match against the source filename */
 156                        if (query->filename &&
 157                            strcmp(query->filename, dp->filename) &&
 158                            strcmp(query->filename, kbasename(dp->filename)) &&
 159                            strcmp(query->filename, trim_prefix(dp->filename)))
 160                                continue;
 161
 162                        /* match against the function */
 163                        if (query->function &&
 164                            strcmp(query->function, dp->function))
 165                                continue;
 166
 167                        /* match against the format */
 168                        if (query->format &&
 169                            !strstr(dp->format, query->format))
 170                                continue;
 171
 172                        /* match against the line number range */
 173                        if (query->first_lineno &&
 174                            dp->lineno < query->first_lineno)
 175                                continue;
 176                        if (query->last_lineno &&
 177                            dp->lineno > query->last_lineno)
 178                                continue;
 179
 180                        nfound++;
 181
 182                        newflags = (dp->flags & mask) | flags;
 183                        if (newflags == dp->flags)
 184                                continue;
 185                        dp->flags = newflags;
 186                        vpr_info("changed %s:%d [%s]%s =%s\n",
 187                                 trim_prefix(dp->filename), dp->lineno,
 188                                 dt->mod_name, dp->function,
 189                                 ddebug_describe_flags(dp, flagbuf,
 190                                                       sizeof(flagbuf)));
 191                }
 192        }
 193        mutex_unlock(&ddebug_lock);
 194
 195        if (!nfound && verbose)
 196                pr_info("no matches for query\n");
 197
 198        return nfound;
 199}
 200
 201/*
 202 * Split the buffer `buf' into space-separated words.
 203 * Handles simple " and ' quoting, i.e. without nested,
 204 * embedded or escaped \".  Return the number of words
 205 * or <0 on error.
 206 */
 207static int ddebug_tokenize(char *buf, char *words[], int maxwords)
 208{
 209        int nwords = 0;
 210
 211        while (*buf) {
 212                char *end;
 213
 214                /* Skip leading whitespace */
 215                buf = skip_spaces(buf);
 216                if (!*buf)
 217                        break;  /* oh, it was trailing whitespace */
 218                if (*buf == '#')
 219                        break;  /* token starts comment, skip rest of line */
 220
 221                /* find `end' of word, whitespace separated or quoted */
 222                if (*buf == '"' || *buf == '\'') {
 223                        int quote = *buf++;
 224                        for (end = buf; *end && *end != quote; end++)
 225                                ;
 226                        if (!*end) {
 227                                pr_err("unclosed quote: %s\n", buf);
 228                                return -EINVAL; /* unclosed quote */
 229                        }
 230                } else {
 231                        for (end = buf; *end && !isspace(*end); end++)
 232                                ;
 233                        BUG_ON(end == buf);
 234                }
 235
 236                /* `buf' is start of word, `end' is one past its end */
 237                if (nwords == maxwords) {
 238                        pr_err("too many words, legal max <=%d\n", maxwords);
 239                        return -EINVAL; /* ran out of words[] before bytes */
 240                }
 241                if (*end)
 242                        *end++ = '\0';  /* terminate the word */
 243                words[nwords++] = buf;
 244                buf = end;
 245        }
 246
 247        if (verbose) {
 248                int i;
 249                pr_info("split into words:");
 2                  e=newflags" class="sref">newflags;
buf;
i++)
 251                        pr_cont(" \"%s\"", words[i]);
 252                pr_cont("\n");
 253        }
 254
 255        return buf;
 256}
 257
 258/*
 259 * Parse a single line number.  Note that the empty string ""
 260 * is treated as a special case and converted to zero, which
 261 * is later treated as a "don't care" value.
 262 */
 263static inline int parse_lineno(const char *str, unsigned int *val)
 264{
 265        char *end = NULL/dyn;
 266        BUG_ON(str == NULL/dyn);
 267        if (*str == '\0') {
 268                *val = 0;
 269                return 0;
 270        }
 271        *val = simple_strtoul(str, &end, 10);
 272        if (end == NULL/dyn || end == str || *end != '\0') {
 273                pr_err("bad line-number: %s\n", str);
 274                return -EINVAL;
 275        }
 276        return 0;
 277}
 278
 279/*
 280 * Undo octal escaping in a string, inplace.  This is useful to
 281 * allow the user to express a query which matches a format
 282 * containing embedded spaces.
 283 */
 284#define isodigit(c)             ((c) >= '0' && (c) <= '7')
 285static char *unescape(char *str)
 286{
 287        char *in = str;
 288        char *out = str;
 289
 290        while (*in) {
 291                if (*in == '\\') {
 292                        if (in[1] == '\\') {
 293                                *out++ = '\\';
 294                                in += 2;
 295                                continue;
 296                        } else if (in[1] == 't') {
 297                                *out++ = '\t';
 298                                in += 2;
 299                                continue;
 300                        } else if (in[1] == 'n') {
 301                                *out++ = '\n';
 302                                in += 2;
 303                                continue;
 304                        } else if (isodigit(in[1]) &&
 305                                   isodigit(in[2]) &&
 306                                   isodigit(in[3])) {
 307                                *out++ = (((in[1] - '0') <class6) |
 308                                          ((in[2] - '0') <class3) |
 309                                          (in[3] - '0'));
 310                                in += 4;
 311                                continue;
 312                        }
 313                }
 314                *out++ = *in++;
 315        }
 316        *out = '\0';
 317
 318        return str;
 319}
 320
 321static int check_set(const char **dest, char *src, char *name)
 322{
 323        int rc = 0;
 324
 325        if (*dest) {
 326                rc = -EINVAL;
 327                pr_err("match-spec:%s val:%s overridden by %s\n",
 328                       name, *dest, src);
 329        }
 330        *dest = src;
 331        return rc;
 332}
 333
 334/*
 335 * Parse words[] as a ddebug query specification, which is a series
 336 * of (keyword, value) pairs chosen from these possibilities:
 337 *
 338 * func <function-name>
 339 * file <full-pathname>
 340 * file <base-filename>
 341 * module <module-name>
 342 * format <escaped-string-to-find-in-format>
 343 * line <lineno>
 344 * line <first-lineno>-<last-lineno> // where either may be empty
 345 *
 346 * Only 1 of each type is allowed.
 347 * Returns 0 on success, <0 on error.
 348 */
 349static int ddebug_parse_query(char *words[], int buf;
 3                          struct ddebug_query *query, const char *modname)
 351{
 352        unsigned int i;
 353        int rc;
 354
 355        /* check we have an even number of words */
 356        if (nwords % 2 != 0) {
 357                pr_err("expecting pairs of match-spec <value>\n");
 358                return -EINVAL;
 359        }
 36/a>          memset(query, 0, sizeof(*query));
 361
 362        if (modname)
 363                /* support $modname.dyndbg=<multiple queries> */
 364                query->module = modname;
 365
 366        e=newflags" class="sref">newflags;
buf;
i += 2) {
 367                if (!strcmp(words[i], "func")) {
 368                        rc = check_set(&query->function, words[i+1], "func");
 369                } else if (!strcmp(words[i], "file")) {
 370                        rc = check_set(&query->filename, words[i+1], "file");
 371                } else if (!strcmp(words[i], "module")) {
 372                        rc = check_set(&query->module, words[i+1], "module");
 373                } else if (!strcmp(words[i], "format")) {
 374                        rc = check_set(&query->format, unescape(words[i+1]),
 375                                       "format");
 376                } else if (!strcmp(words[i], "line")) {
 377                        char *first = words[i+1];
 378                        char *last = strchr(first, '-');
 379                        if (query->first_lineno || query->last_lineno) {
 380                                pr_err("match-spec: line used 2x\n");
 381                                return -EINVAL;
 382                        }
 383                        if (last)
 384                                *last++ = '\0';
 385                        if (parse_lineno(first, &query->first_lineno) < 0) {
 386                                pr_err("line-number is <0\n");
 387                                return -EINVAL;
 388                        }
 389                        if (last) {
 390                                /* range <first>-<last> */
 391                                if (parse_lineno(last, &query->last_lineno)
 392                                    class="line" name="Lquery" class="sref">query->first_lineno) {
 393                                        pr_err("last-line:%d class1st-line:%d\n",
 394                                                query->last_lineno,
 395                                                query->first_lineno);
 396                                        return -EINVAL;
 397                                }
 398                        } else {
 399                                query->last_lineno = query->first_lineno;
 400                        }
 401                } else {
 402                        pr_err("unknown keyword \"%s\"\n", words[i]);
 403                        return -EINVAL;
 404                }
 405                if (rc)
 406                        return rc;
 407        }
 408        vpr_info_dq(query, "parsed");
 409        return 0;
 410}
 411
 412/*
 413 * Parse `str' as a flags specification, format [-+=][p]+.
 414 * Sets up *maskp and *flagsp to be used when changing the
 415 * flags fields of matched _ddebug's.  Returns 0 on success
 416 * or <0 on error.
 417 */
 418static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
 419                               unsigned int *maskp)
 420{
 421        unsigned flags = 0;
 422        int op = '=', i;
 423
 424        switch (*str) {
 425        case '+':
 426        case '-':
 427        case '=':
 428                op = *str++;
 429                break;
 430        default:
 431                pr_err("bad flag-op %c, at start of %s\n", *str, str);
 432                return -EINVAL;
 433        }
 434        vpr_info("op='%c'\n", op);
 435
 436        e=new; *str ; ++str) {
 437                e=newflags" class="sref">newflags;
newflags(opt_array) - 1f="lib/dynamic_debug.c#L141" id="L141" cgt;= ef="lib/dynamic_debug.c#L141" id="L141"--) {
 438                        if (*str == opt_array[i].opt_char) {
 439                                flags |= opt_array[i].flag;
 440                                break;
 441                        }
 442                }
 443                if ( 444                        pr_err("unknown flag '%c' in \"%s\"\n", *str, str);
 445                        return -EINVAL;
 446                }
 447        }
 448        vpr_info("flags=0x%x\n", flags);
 449
 4          /* calculate final *flagsp, *maskp according to mask and op */
 451        switch (op) {
 452        case '=':
 453                *maskp = 0;
 454                *flagsp hrflags" class="sflags" class="sref">flags;
 455                break;
 456        case '+':
 457                *maskp = ~0U;
 458                *flagsp hrflags" class="sflags" class="sref">flags;
 459                break;
 46/a>          case '-':
 461                *maskp = ~flags" class="sflags" class="sref">flags;
 462                *flagsp hr0;
 463                break;
 464        }
 465        vpr_info("*flagsp=0x%x *maskp=0x%x\n", *flagsp, *maskp);
 466        return 0;
 467}
 468
 469static int ddebug_exec_query(char *query_string, const char *modname)
 470{
 471        unsigned int flags = 0, mask hr0;
 472        struct ddebug_query query;
 473#define MAXWORDS 9
 474        int buf;
;
;
 475        char *words[MAXWORDS];
 476
 477        buf;
ddebug_tokenize(query_string, words, MAXWORDS);
 478        if (nwords <= e) {
 479                pr_err("tokenize failed\n");
 480                return -EINVAL;
 481        }
 482        /* check flags 1st (last arg) so query is pairs of spec,val */
 483        if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) {
 484                pr_err("flags parse failed\n");
 485                return -EINVAL;
 486        }
 487        if (ddebug_parse_query(words, nwords-1, &query, modname)) {
 488                pr_err("query parse failed\n");
 489                return -EINVAL;
 490        }
 491        /* actually go and implement the change */
 492        ddebug_change(&query, flags, mask);
 493        vpr_info_dq(&query, "applied" : "no-match");
 494
 495        return  496}
 497
 498/* handle multiple queries in query string, continue on error, return
 499   last error or number of matching callsites.  Module name is either
 500   in param (e=neboot arg) =neperhaps in query string.
 405 class=ef">quee" class="sref">ddebug_change(&am2 de=first" clas  href="lib/dyn2f="+code=i" class= s="line" name5an tatic int ddebug>vpr_info_dq(&query_string, const char *m5">i])5
modn5INVAL5
ddebug_paffo"sref">parse_linaffo" 352        unsigne href="+code=quer99" tatic int query, ma5f">rc5
rc5
 366        e=newflags" class="sss="sref">ddebug_query ddebug_query parse_linaffo"modn5>        5
parse_linaffo"flat" pbrcbug_tokenize" class="sref>vpr_info_dq(&"applied&expecting pairs of match-spec <value>\n&quo5;)5
parse_linaffo"ddebug_paffo"sref">parse_linaffo"last++ = '\0> 4105
 411ddebug_query  376 ss="sref">ddebug_query ddebug>vpr_info_dq(&ddebug>vpr_info_dq(&first match-spec <value>\n&quo5>NVAL5
        5
 465        &:"unknown keyword \"Š        unsigne href="+code=quer"sref>vpr_info_dq(&">rc5
 469static int nwords-1, &query, )5
 405                  if ( 370<99" tatic int  4205
 405                > 411 401             5ef">i5
query,  405                NVAL5
 404      5str) 5
ss 4865
 465        &a>&a>&a99" quot;last-line:%d class1st-line:%d\n&qu59;5
query, ++5
 exitgs" tatic int  match-spec <value>\n&quo5  default5
str)5
 495        return  486        5
op)5
newflags;
ne2" id64d="L494" class="line" name="L495"ss(remaineburef="n2f="+code=i" classwrot tatic int  match-spec <value>\n&quo5 ;5
 401             5har) 5
 PREFIXf">newflags;
ne2" id-="+code=i" classwrot tatic int  401             5>flag5
newflags;
ne2" id-="+code=i" classwrot tatic int  466      5         5
 486ddebug_p="line" emit_pf">ixtatic int ixbuec_qy_str class="line" name="L4lass="ctatic int ddebug_p=es05          =es0p;ddebug_pbuf5          buft  match-spec <value>\n&quo5>str)5
 401             5INVAL5
        rpos_after_ti4t ;
) 5
        rposma5>        5
ddebug_pbuf5          buft last++ = '\0"> 449'\0"   break5
        unsigned int modn5>op) 5
 4n parse_lin4n  match-spec <value>\n&quo59;5
        rpos snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied& if cltr- 1f(ecting pairs of match-spec <value>\n&quo5p = 05
)5
        rpos snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied&[ ng">&] ot;last-line:%d class1st-line:%d\n&qu5    break5
 396          task_pid_vn8ref="word \"currine"          currine) 5
 447 = ~0U5
        rpos_after_ti4t  pos95        rpos)5
 "es05          =es0p;        unsigned int  snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied& ss="s:ot;last-line:%d class1st-line:%d\n&qu59;5
          =es0p;query, 5
 "es05          =es0p;        unsigned int  snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied& ss="s:ot;last-line:%d class1st-line:%d\n&qu59 = 05
          =es0p; >        unsigneunct">  hreff match-spec <value>\n&quo5fstr)5
 "es05          =es0p;        unsigned int         rpos snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied& ss="d:ot;last-line:%d class1st-line:%d\n&qu59tr) 5
 "es05          =es0p;query->i"+code=first_lineno" class="sref">first_l5> 4675
        rpos        rpos_after_ti4t  match-spec <value>\n&quo5 ags)5
 snp cltf5          snp cltfexec_e=nwords" classbuf5          buft         rpos(remaineburef="word \"pos95        rpos"applied&(ecting pairs of match-spec <value>\n&quo5dname5
 9os95        rposnewflags;
ne2" i> match-spec <value>\n&quo5> 4705
newflags;
ne2" id-=1] href="+code=last" class="sref">last++ = '\0k hr05
'\0k;5
'\0k = 05
 4475
ddebug_p=es0ripto88          =es0ripto8p;quefme"          fmep; match-spec <value>\n&quo5>tr) 5
modn5ORDS)5
parse_linaa_li="8" id class="line" nar/a>        unsignar/at '\0kags)5
        unsignreat '\0)5
parse_linaa_Parse 8" id class="line" nvaf5          vaft '\0 4705
newflags;
ne2" i"+code=MAXWORDS" class="sref">MAX5>        5
'\0 */ 376 =es0ripto88          =es0ripto8p;)) 5
 376 fme"          fmep;5
parse_linaa_ass="ref="word \"ar/a>        unsignar/at           fmep;) 5
          vaft [          fmep;          fmep;)5
          vaft ['\0INVAL5
'\0>        5
        unsignreat  p cltclass="sref">flap cltcref="word \"KERN_DEBUGlass="sref">flaKERN_DEBUG8" id ss="string">"applied& ss="s ss="pVot;last-line:%d class1st-line:%d\n&qu5 */ ""line" emit_pf">ixtatic int ixbuec_"sref">ddebug_p=es0ripto88          =es0ripto8p;          vaft )5
        raa_e 4ref="word \"ar/a>        unsignar/at 5
        unsignreat '\0> 4965
 497ddebug_p=es0ripto88          =es0ripto8p;queryddebug_p=evs="sref">queryquefme"          fmep; match-spec <value>\n&quo6f">ddebug6change(&am2 de=first6 clas6 href=+code=modname" class="sref">modn6">i])6
parse_linaa_Parse 8" id class="line" nvaf5          vaft '\0INVAL6
parse_linaa_li="8" id class="line" nar/a>        unsignar/at '\0         6
 3rea>        unsignreat '\0f">rc6
rc6
;
 376 =es0ripto88          =es0ripto8p;        6
;
 376 fme"          fmep;)6
parse_linaa_ass="ref="word \"ar/a>        unsignar/at           fmep; 4106
 411          vaft [          fmep;          fmep;/*          vap;'\0>NVAL6
 376 =evs="sref">querymodn6ess        unsignreat  p cltclass="sref">flap cltcref="word \"KERN_DEBUGlass="sref">flaKERN_DEBUG8" id ss="string">"applied&(NULL devics *):  ss="pVot;last-line:&="+code=nwords" classaaf5          vaft ">rc6
 401             6 */newflags;
ne2" i"+code=MAXWORDS" class="sref">MAX6>)6
        unsignreat  dev_p cltc emits="sref">queryquery"applied& ss="s ss="s  ss="s:  ss="pVot;last-line:&d="L449" class="line" name="L446m 4106
ixtatic int ixbuec_"sref">ddebug_p=es0ripto88          =es0ripto8p;ddebug_tokenize("ev_driver">ddebubuec_"sref">ddebug_p=evs="sref">queryquery<=ev_nlasbuec_"sref">ddebug_p=evs="sref">query          vaft NVAL6
        unsignar/at 6
        unsignreat '\0str++6
ddebug_p=es0ripto88          =es0ripto8p;op)6
queryddebug_p=evs="sref">queryquefme"          fmep; match-spec <value>\n&quo6"ss 401             6str) 6
parse_linaa_Parse 8" id class="line" nvaf5          vaft '\0 ;6
parse_linaa_li="8" id class="line" nar/a>        unsignar/at '\0har) 6
        unsignreat '\0>flag6
'\0    break6
;
 376 =es0ripto88          =es0ripto8p;;
 376 fme"          fmep;parse_linaa_ass="ref="word \"ar/a>        unsignar/at           fmep;str)6
          fmep;          fmep;) 6
          vaft ['\0>        6
 "evs="sref">queryqueryquery[          parinep;modn6"> 449newflags;
ne2" i"+code=MAXWORDS" class="sref">MAX6"   break6
        unsignreat  dev_p cltc emits="sref">queryqueryquery[          parinep;"applied& ss="s ss="s  ss="s  ss="s:  ss="pVot;last-line:&d="L449" class="line" name="L446p = 06
ixtatic int ixbuec_"sref">ddebug_p=es0ripto88          =es0ripto8p;ddebug_tokenize("ev_driver">ddebubuec_"sref">ddebug_p=evs="sref">queryquery[          parinep; 396ref="+code=quer=ev_nlass="sref">query<=ev_nlasbuec_"sref">ddebug_p=evs="sref">queryquery[          parinep; 396ref="+code=quernetdev_nlass="sref">queryddebug_p=evs="sref">query          vaft  = ~0U6
 "evs="sref">querymodn6"ags)6
 p cltclass="sref">flap cltcref="word \"KERN_DEBUGlass="sref">flaKERN_DEBUG8" id ss="string">"applied& ss="s:  ss="pVot;last-line:&6ref="+code=quernetdev_nlass="sref">queryddebug_p=evs="sref">query          vaft  401             69;6
 p cltclass="sref">flap cltcref="word \"KERN_DEBUGlass="sref">flaKERN_DEBUG8" id ss="string">"applied&(NULL net_devics):  ss="pVot;last-line:&="+code=nwords" classaaf5          vaft 6
        raa_e 4ref="word \"ar/a>        unsignar/at )6
        unsignreat '\0Etr) 6
)6
newflags;
ne6" id1024d="L494" class="line" name="L496k;6
          __initdata6" iding" line" name="L43ef="+cosclap">ddebug_tokenize("f="+cosclap">ddebut newflags;
ne6" i"+code=MAXWORDS" class="sref">MAX6k = 06
          __init6" idn2f="+code=i" class= s="lisclap"static int sref="class="sref">ddebug_pat88          at8ref=od="L494" class="line" name="L496f   break6
 401             6>tr) 6
        unsignttrle ref="word \"at88          at8ref=or- 1f=""line" name="L4DDEBUG_STRINGf">newflags;
ne6" i="+code=modname" class="sref">modn6ORDS)6
"applied&ef="+c" too lar/expecting pairs of match-spec <value>\n&quo6kags)6
 466      6;)6
ddebug_p=f="+cosclap">ddebug_tokenize("f="+cosclap">ddebut           at8ref=&6ref="+code=querDDEBUG_STRINGf">newflags;
ne6" i=line" name="L466"> 466      6; hr06
 466      6;;6
 486)) 6
          __sclapref="wss="string">"applied&ef="+c"s=ot;last-line:&6ref="+code=quer= s="lisclap"static int sref==line" name="L466"> 466      6;   break6
commine">/*t-line:d="L476" class="line" name="L476sRDS)6
commine"> * File_ops hrefwrite method" cla if name=fshrefs="line" name=/conrol.  Gathers thet-line:d="L476" class="line" name="L476sags)6
commine"> * command text from users>+cn,sL50ses and de=dutes it.t-line:d="L476" class="line" name="L476INVAL6
commine"> */t-line:d="L476" class="line" name="L476I 4706
;
parse_linasize_"8" id ef="+code=quer= s="liprof_writetatic int           file8" idclass="sref">quefile"          file8" i hry_string" word \"__user5          __user8" idclass="sref">queubuf5          ubuft parse_linaize_"8" id ef="+code=querle >        unsignle ref=&6ref="+code=querloff_"sref">parse_linloff_"8" idclass="sref">queoffp5          offpref=od="L494" class="line" name="L496;)6
modn6mound6
ddebug_ptmpbuf5          tmpbuft '\0found6
parse_linre"t '\0ftr) 6
 497        unsignle ref=<=hr 401             6mags)6
 466      7her le >        unsignle ref=<- 1f( class="line" nUSER_BUF_PAGewflags;
modn7h1r"applied&expectednild& ss="d bytes intoa hanrol"unknown keyword \"USER_BUF_PAGewflags;
 466      7f">ddebug7change(&am2 de=first7 clas7042" id="L442" class=" class=-d+code=i" classE2BIGlass="sref">flaE2BIGt '\0">i])7
 4867
          tmpbuft  kmallo05          kmallo0buec_"sref">ddebug_ple >        unsignle ref=<+ 1eyword \"GFP_KERNE              reGFP_KERNE 2" i=line" name="L466"> 466      7f5VAL7
 376 tmpbuf5          tmpbuft  401             7f">rc7
flaENOMEMt '\0"7>rc7
          copy_from_userbuec_"sref">ddebug_ptmpbuf5          tmpbuft           ubuft modn7h8>rc7
          kfreebuec_"sref">ddebug_ptmpbuf5          tmpbuft  466      7f9>rc7
'\0 return 07
          tmpbuft last++ = '\0"> 411 465        &abytes from users>+cn"unknown key"n2f) ef="+code=querle >        unsignle ref=)= '\0">i])7
parse_linre"t  df="+code=d"iea>        unsigndf="+code=d"ieabuec_"sref">ddebug_ptmpbuf5          tmpbuft           NULLref=)= '\0"5VAL7
          kfreebuec_"sref">ddebug_ptmpbuf5          tmpbuft  466      7essparse_linre"t  401             7>">rc7
parse_linre"t '\0 */ddebug_poffp5          offpref=r+hr" name="L405"> le >        unsignle ref== '\0maskp7
        unsignle ref== '\0m 4107
'\0m/*commine">/*t-line:d="L476" class="line" name="L477>NVAL7
commine"> * Set the iterator toapon2f=toathe first lass="c objectt-line:d="L476" class="line" name="L477>5VAL7
commine"> * and  class=aapon2fer=toathat first object.  Rclassst-line:d="L476" class="line" name="L477>sscommine"> * NULL nclthere are no lass="cs at all.t-line:d="L476" class="line" name="L4779;7
commine"> */t-line:d="L476" class="line" name="L4779;7
ddebug_p=f="+coiter_first>        unsigndf="+coiter_firstref=" class="line" name="L4df="+coiter>        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" iame="L401"> 401             7str++7
modn7    break7
 list_emptstatic int modn7  default7
          tablet  NULL5          NULLref== '\0>str)7
        unsigniter1" i href="+code=query" idxtatic int  466      7>/*          NULLref== '\0>NVAL7
op)7
          tablet  list_ent>static int sbuec_"sref">ddebug_p=f="+cotablea>        unsigndf="+cotablearef=[          df="+cotablet flalinct  466      7str) 7
        unsigniter1" i href="+code=query" idxtatic int  466      7>;7
        unsigniter1" i href="+code=query" table5          tablet MAX7har) 7
'\0    break7
commine">/*t-line:d="L476" class="line" name="L477         7
commine"> * Advance the iterator toapon2f=toathe next lass="c1"line:d="L476" class="line" name="L477 /*commine"> * object from the one the iterator currinelyapon2fs at,1"line:d="L476" class="line" name="L477 NVAL7
commine"> * and  classs=aapon2fer=toathe new lass="c.  Rclassst-line:d="L476" class="line" name="L477>str)7
commine"> * NULL nclthe iterator has seen alllthe lass="cs.t-line:d="L476" class="line" name="L477INVAL7
commine"> */t-line:d="L476" class="line" name="L477 tr) 7
ddebug_p=f="+coiter_next>        unsign=f="+coiter_nextref=" class="line" name="L4df="+coiter>        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" iame="L401"> 401             7>        7
modn7lags)7
 iter>        unsigniter1" i href="+code=query" table5          tablet  NULL5          NULLref=ame="L401"> 401             7"> 449          NULLref== '\0"   break7
        unsigniter1" i href="+code=query" idxtatic int  iter>        unsigniter1" i href="+code=query" table5          tablet modn7>op) 7
commine">/* iterate=toanext table */t-line:d="L476" class="line" name="L4779;7
        unsigniter1" i href="+code=query" idxtatic int  466      7p = 07
 list_is_ref"sref">parse_linlist_is_ref"ref=""+code=nwords" classiter>        unsigniter1" i href="+code=query" table5          tablet flalinct modn7pstr)7
          tablet  NULL5          NULLref== '\0pNVAL7
          NULLref== '\0"tr) 7
          tablet  list_ent>static int sbuec_"sref">ddebug_piter>        unsigniter1" i href="+code=query" table5          tablet flalinct [)7
          df="+cotablet flalinct  466      7    break7
        unsigniter1" i href="+code=query" table5          tablet commine">/*t-line:d="L476" class="line" name="L477fstr)7
commine"> * Seq_ops ass=" method.  Called at the ass=" of eva>sreline:d="L476" class="line" name="L477fNVAL7
commine"> * read() calllfrom users>+cn.  Takes the df="+colock andreline:d="L476" class="line" name="L477ftr) 7
commine"> * seeks the seq_file>lasts iterator toathe given position.t-line:d="L476" class="line" name="L477> 4677
commine"> */t-line:d="L476" class="line" name="L477fags)7
ddebug_p=f="+coprof_ass="sref">parse_lin=f="+coprof_ass="ref=" class="line" name="L4seq_filesref">parse_linseq_file1" id="sref">ddebug_pmsref">parse_linmt parse_linloff_"8" idclass="sref">quepossref">parse_linposref=ame="L401"> 401             7dname7
modn7d;7
        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" i hr" name="L405"> msref">parse_linmt '\0k hr07
ddebug_p=p5          dpref== '\0k;7
        unsign ref=<=dclass="sref">quepossref">parse_linposref== '\0k = 07
 465        parse_linmt quepossref">parse_linposref=a= '\0kNVAL7
parse_linmutexolockref=""+code=nwords" classdf="+colocksref">parse_lindf="+colockref=a= '\0k 4677
 376  >        unsign ref=ame="L401"> 401             7;)7
;
'\0 4707
        unsign ref= 401             7; hr07
          NULLref== '\0;7
 df="+coiter_first>        unsigndf="+coiter_firstref=""sref">ddebug_piter>        unsigniter1" ia= '\0 = 07
 "p5          dpref= !hr" name="L405"> NULL5          NULLref=fvpr_ivpr_i=--d+code=i" class >        unsign ref= 401             7;ound7
          dpref= hr" name="L405"> df="+coiter_next>        unsign=f="+coiter_nextref=""sref">ddebug_piter>        unsigniter1" ia= '\0NVAL7
          dpref== '\0str) 7
commine">/*t-line:d="L476" class="line" name="L477INVAL7
commine"> * Seq_ops next method.  Called seva>al times withis=aaread()t-line:d="L476" class="line" name="L477I 4707
commine"> * calllfrom users>+cn, with df="+colock held.  Walks to thet-line:d="L476" class="line" name="L477I hr07
commine"> * next lass="c object with a special case" clathe header ib/d.t-line:d="L476" class="line" name="L477mask)7
commine"> */t-line:d="L476" class="line" name="L477;)7
ddebug_p=f="+coprof_next>        unsign=f="+coprof_nextref=" class="line" name="L4seq_filesref">parse_linseq_file1" id="sref">ddebug_pmsref">parse_linmt ddebug_pp5          pt parse_linloff_"8" idclass="sref">quepossref">parse_linposref=ame="L401"> 401             7mound7
modn7found7
        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" i hr" name="L405"> msref">parse_linmt '\0ftr) 7
ddebug_p=p5          dpref== '\0"> 497 465        parse_linmt ddebug_pp5          pt quepossref">parse_linposref=a= '\0h1rddebug8change(&am2 de=first8 clas8042" id="L442"line"+code=i" classp5          pt  SEQ_START_TOKENwflags;
 401             8">i])8
          dpref= hr" name="L405"> df="+coiter_first>        unsigndf="+coiter_firstref=""sref">ddebug_piter>        unsigniter1" ia= '\0INVAL8
'\0I5VAL8
          dpref= hr" name="L405"> df="+coiter_next>        unsign=f="+coiter_nextref=""sref">ddebug_piter>        unsigniter1" ia= '\0f">rc8
quepossref">parse_linposref== '\0"7>rc8
          dpref== '\0h8>rc8
commine">/*t-line:d="L476" class="line" name="L478> 4108
commine"> * Seq_ops ahow method.  Called seva>al times withis=aaread()t-line:d="L476" class="line" name="L478"> 411commine"> * calllfrom users>+cn, with df="+colock held.  Farse s thet-line:d="L476" class="line" name="L478">i])8
commine"> * currine lass="c as=aasclale human-readable ib/d, with at-line:d="L476" class="line" name="L478"NVAL8
commine"> * special case" clathe header ib/d.t-line:d="L476" class="line" name="L478"5VAL8
commine"> */t-line:d="L476" class="line" name="L478essparse_lin=f="+coprof_ahowref=" class="line" name="L4seq_filesref">parse_linseq_file1" id="sref">ddebug_pmsref">parse_linmt ddebug_pp5          pt  401             8>">rc8
modn8 */        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" i hr" name="L405"> msref">parse_linmt '\0>)8
ddebug_p=p5          dpref= hr" name="L405"> p5          pt '\0maskp8
          flagsbuf0" i[10"+code=MAXWORDs="line" name="L4678m 4108
 465        parse_linmt ddebug_pp5          pt           pt  SEQ_START_TOKENwflags;
modn8>5VAL8
parse_linseq_putsref=""sref">ddebug_pmsref">parse_linmt modn8>ss8
 466      89;8
 466      89)8
ddebug_pmsref">parse_linmt "applied& ss="s: ss="u [ ss="s] ss="s = ss="s \plied& ot;unknown ked="L468" class="line" name="L468  default8
ixtatic int ixref=""sref">ddebug_p=p5          dpref= href="+code=query" fileamic5          fileamicref=a&6ref="+code=quer=p5          dpref= href="+code=query" ib/dnosref">parse_linlb/dnot modn8>str)8
          tablet queryddebug_p=p5          dpref= href="+code=query" function5          functiont modn8>>i])8
        unsigndf="+co=es0ribe_flagsref=""sref">ddebug_p=p5          dpref=fd"sref">ddebug_pflagsbuf5          flagsbuf0" i, aizeof""sref">ddebug_pflagsbuf5          flagsbuf0" i))of match-spec <value>\n&quo8>NVAL8
parse_linseq_es0aperef=""sref">ddebug_pmsref">parse_linmt ddebug_p=p5          dpref= href="+code=query" fclse 5          fclse t "applied&\t\r\n\plied& ot;unknown kof match-spec <value>\n&quo8>5VAL8
parse_linseq_putsref=""sref">ddebug_pmsref">parse_linmt "applied&\plied&\pecting pairs of match-spec <value>\n&quo8"ss 466      8>;8
commine">/*t-line:d="L476" class="line" name="L478    break8
commine"> * Seq_ops asop method.  Called at the end of eacharead()t-line:d="L476" class="line" name="L478         8
commine"> * calllfrom users>+cn.  Drops df="+colock.t-line:d="L476" class="line" name="L478 /*commine"> */t-line:d="L476" class="line" name="L478 NVAL8
parse_lin=f="+coprof_asopref=" class="line" name="L4seq_filesref">parse_linseq_file1" id="sref">ddebug_pmsref">parse_linmt ddebug_pp5          pt  401             8>str)8
modn8INVAL8
 465        parse_linmt ddebug_pp5          pt parse_linmutexounlockref=""+code=nwords" classdf="+colocksref">parse_lindf="+colockref=a= '\0>        8
 449parse_linseq_operations7" id"+code=i" class= s="liprof_aeqopssref">parse_lin=f="+coprof_aeqopsref= hr+code=modname" class="sref">modn8"   break8
[parse_linass="ref= hr" name="L405"> df="+coprof_ass="sref">parse_lin=f="+coprof_ass="ref=fcode=modname" class="sref">modn8>op) 8
[ df="+coprof_next>        unsign=f="+coprof_nextref=fcode=modname" class="sref">modn8>/*[parse_linahowref= hr" name="L405"> df="+coprof_ahowsref">parse_lin=f="+coprof_ahowref=fcode=modname" class="sref">modn8>NVAL8
[parse_linasopref= hr" name="L405"> df="+coprof_asopsref">parse_lin=f="+coprof_asopref=code=modname" class="sref">modn8>str)8
'\0pNVAL8
) 8
commine">/*t-line:d="L476" class="line" name="L478/a> = ~0U8
commine"> * File_ops hrefopen method" cla if name=fshrefs="line" name=/control.  Doest-line:d="L476" class="line" name="L478"ags)8
commine"> * the seq_file sclap dance, and also creates an iterator toawalk thet-line:d="L476" class="line" name="L478    break8
commine"> * lass="cs.  Note=that we create=aaseq_file always, evan" claO_WRONLYt-line:d="L476" class="line" name="L478    break8
commine"> * files where it>lasts not needed, as=doot; so simplifies the  hrefreleaset-line:d="L476" class="line" name="L478 op) 8
commine"> * method.t-line:d="L476" class="line" name="L478 /*commine"> */t-line:d="L476" class="line" name="L4789 = 08
parse_lin=f="+coprof_openref=" class="line" name="L4in="L>        unsignin="L1" id="sref">ddebug_pin="L>        unsignin="L1" i,r class="line" name="L4file"          file8" idclass="sref">quefile"          file8" iame="L401"> 401             8fstr)8
modn8fNVAL8
        unsigndf="+coiter1" id="sref">ddebug_piter>        unsigniter1" i= '\0ftr) 8
        unsignerr1" i= '\0fa> = ~0U8
 465        '\0d;8
        unsigniter1" i hr" name="L405"> kzallo05          kzallo0buec_aizeof"="sref">ddebug_piter>        unsigniter1" ia&6ref="+code=querGFP_KERNE              reGFP_KERNE 2" i=line" name="L466"> 466      8k hr08
        unsigniter1" i hhr" name="L405"> NULL5          NULLref=ame="L401"> 401             8k;8
flaENOMEMt '\0k = 08
 seq_opensref">parse_linseq_openref=""sref">ddebug_pfile"          file8" i h"+code=nwords" classdf="+coprof_aeqopssref">parse_lin=f="+coprof_aeqopsref==line" name="L466"> 466      8kNVAL8
        unsignerr1" ia"+code=modname" class="sref">modn8>tr) 8
 kfree"          kfreebuec_"sref">ddebug_piter>        unsigniter1" ia= '\0k 4678
        unsignerr1" i= '\0kags)8
parse_linseq_file1" id=) ef="+code=querfile"          file8" i href="+code=query" private_data5          private_data1" ia href="+code=query" privatetatic int  iter>        unsigniter1" i= '\0 4708
 466      8; hr08
parse_linfile_operations7" id"+code=i" class= s="liprof_fopssref">parse_lin=f="+coprof_fopsref= hr+code=modname" class="sref">modn8;ound8
[ THIS_MODULE>        unsignTHIS_MODULEref=fcode=modname" class="sref">modn8;NVAL8
[parse_linopenref= hr" name="L405"> df="+coprof_opensref">parse_lin=f="+coprof_openref=fcode=modname" class="sref">modn8;tr) 8
[parse_linread1" i hr" name="L405"> seq_readsref">parse_linseq_readref=fcode=modname" class="sref">modn8; 4678
[parse_linllseek1" i hr" name="L405"> seq_lseeksref">parse_linseq_lseekref=fcode=modname" class="sref">modn8;ags)8
[parse_linreleaset- i hr" name="L405"> seq_release_privatetatic int modn8INVAL8
[ df="+coprof_writetatic int '\0I hr08
'\0mask)8
commine">/*t-line:d="L476" class="line" name="L478;)8
commine"> * Allo0ate=aanew df="+cotable" clathe given modulet-line:d="L476" class="line" name="L478;ound8
commine"> * and add if=toathe global list.t-line:d="L476" class="line" name="L478found8
commine"> */t-line:d="L476" class="line" name="L478ftr) 8
ddebug_ptabtatic int         unsign ref=fcode=modname" class="sref">modn8I 4678
ddebug_pnlass="sref">querymodn8Iags)8
modn9her          df="+cotablet ddebug_p=t>        unsign="t '\0	h1rddebug_pnew_nlass="sref">query'\0	h2r'\0	">i])9
 kzallo05          kzallo0buec_aizeof"="sref">ddebug_p=t>        unsign="t  466      9INVAL9
        unsign="t  NULL5          NULLref=ame="L401"> 401             9I5VAL9
flaENOMEMt '\0	f">rc9
query k cldupsref">parse_link cldupbuec_"sref">ddebug_pnlass="sref">query 466      9I7>rc9
query NULL5          NULLref=ar+code=modname" class="sref">modn9h8>rc9
          kfreebuec_"sref">ddebug_p=t>        unsign="t  466      9I9>rc9
flaENOMEMt '\0	 return 09
        unsign="t query new_nlass="sref">query'\0	"> 411        unsign="t  n>        unsign ref== '\0	">i])9
 tabtatic int '\0	"NVAL9
9
parse_linmutexolockref=""+code=nwords" classdf="+colocksref">parse_lindf="+colockref=a= '\0	essparse_linlist_add_tailref=""+code=nwords" classdt>        unsign="t flalinct '\0	e7>rc9
parse_linmutexounlockref=""+code=nwords" classdf="+colocksref">parse_lindf="+colockref=a= '\0	 */ 465                unsign="t query'\0	maskp9
 466      9m 4109
          EXPORT_SYMBOL_GPLbuec_"sref">ddebug_p= s="liadd_moduletatic int '\0	m>i])9
commine">/* helper" cladf="+co=yndbg_(boot|module)_param_cb */t-line:d="L476" class="line" name="L479>5VAL9
ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=fcode=modname" class="sref">modn9>ssddebug_pmodnlass="sref">query        unsignon_errref=ame="L401"> 401             99;9
modn99;9
ddebug_psepsref">parse_linaept '\0c)9
parse_linaept  strchr>        unsignstrchrbuec_"sref">ddebug_pparamtatic int parse_linaept modn9>str)9
commine">/* needed only" cladf="+co=yndbg_boot_param_cb */t-line:d="L476" class="line" name="L479>>i])9
ddebug_psepsref">parse_linaept 9
query paramtatic int 9
 paramtatic int  sepsref">parse_linaept parse_linasrcmpbuec_"sref">ddebug_pparamtatic int  401             9>;9
        unsignon_errref=;"wss="string">commine">/* determined by caller"*/t-line:d="L476" class="line" name="L479>)9
        unsigndf="+coexec_querieabuec__"sref">ddebug_pvalsref">parse_linvalref= ?"line" name="L48aalsref">parse_linvalref= :"+code=vpr_info" class=ot;un+pecting pairs oeyword \"modnlass="sref">querycommine">/* query" ailure ahouldnt asop module load"*/t-line:d="L476" class="line" name="L479 /*commine">/* handle both dyndbg and $module.dyndbg params at boot"*/t-line:d="L476" class="line" name="L479 ssddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=fcode=modname" class="sref">modn9 tr) 9
ddebug_punusedsref">parse_linunusedref=ame="L401"> 401             9>        9
modn9lags)9
 465        ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=of match-spec <value>\n&quo9"> 449ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=f"+sref">ddebug_pNULL5          NULLref=, 0of match-spec <value>\n&quo9"   break9
'\0	>/*commine">/*t-line:d="L476" class="line" name="L479>NVAL9
commine"> * modprobe" co finds" co.params in boot-args,r clips ecting co.ecting, andreline:d="L476" class="line" name="L479>str)9
commine"> * pinges them=toaload_module().  This callback gets unknown params,reline:d="L476" class="line" name="L479>sscommine"> * profenges dyndbg params," cjects others.t-line:d="L476" class="line" name="L479"tr) 9
commine">"*/t-line:d="L476" class="line" name="L479/a> = ~0U9
ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=fmry_string" ="sref">ddebug_pmoduletatic int modn9    break9
 465        ddebug_pmoduletatic int ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=of match-spec <value>\n&quo9    break9
ddebug_pparamtatic int ddebug_pvalsref">parse_linvalref=f"+sref">ddebug_pmoduletatic int flaENOENTref=of match-spec <value>\n&quo9 op) 9
          = s="litable_freebuec_ class="line" name="L4df="+cotable5          df="+cotablet ddebug_p=t>        unsign="t modn9fNVAL9
parse_linlist_del         unsign="t flalinct ) 9
          kfreebuec_"sref">ddebug_p=t>        unsign="t query'\0	fa> = ~0U9
          kfreebuec_"sref">ddebug_p=t>        unsign="t '\0	fags)9
'\0	d;9
commine">/*t-line:d="L476" class="line" name="L479k hr09
commine"> * Called in respy_se=toaa module beot; unloaded.  Removest-line:d="L476" class="line" name="L479k;9
commine"> * any df="+cotable>lasts which pon2f=at the module.t-line:d="L476" class="line" name="L479k = 09
commine"> */t-line:d="L476" class="line" name="L479found9
ddebug_pmod_nlass="sref">querymodn9>tr) 9
          df="+cotablet ddebug_p=t>        unsign="t ddebug_pnext=t>        unsignnext=tref=f match-spec <value>\n&quo9k 4679
        unsign clref= hr-d+code=i" classENOENTlass="sref">flaENOENTref=f match-spec <value>\n&quo9kags)9
 465        ddebug_pmod_nlass="sref">query'\0	 4709
parse_linmutexolockref=""+code=nwords" classdf="+colocksref">parse_lindf="+colockref=a= '\0	;9
queryddebug_p=t>        unsign="t         unsignnext=tref=&="+code=nwords" classdf="+cotablea>        unsigndf="+cotablearef=fd ef="+code=querlinclass="sref">flalinct  z         NULLref=,sref">pars,ef="+code=vpr_info" class="srefremovot; module \="sretablea>        unsigndf="+cotablearec_de9ug.cssref">parse_lin=f="+cop9of_fo98ramref=f match-spec &=a=  = 09
          "L405"> T9IS_MODULE>        unsign9HIS_M98valref=fcode=modname" class="ec <value>\n&quo9k 4679
'\0	maskp9
parse_lin=f="+9oprof98valref=fcode=modname"aa= '\0& name="L495"> seq_readsref">parse_9inseq98class="line" name="L466"> 466      89; seq_lseeksref">parse_l9nseq_989488" i+code=modname" class=">'\0	e7>rc9
parse_linmutexounlockref=""+code=nwordsase_priva9etatic int 9
ddeburitetatic int 9
co9mine"99#9623" id="L423" class="line" name="L42namic_dame="t  hr09
parse_linmutexolockref=""+code=nwordsic_de8ug.9#8986" iwss="string">com9ine">99valref=fcode= hrde=9;)9
    9   un9ign ref=fcode=modname"modname" class="sref">modn9>tr) 9
modn8>op) 8
ddebug_pnlass="sref"9query99="t modn9>tr) 9
10n8"t parse_linlist_del g_pparamtatic int  = 09
         10n2Iags10nckref=a= '\0	e7>rc9
parse_linmutexounlockref=""+code=nword10n4Iagsco10n#8>10n4f=, 0of match-spec <value>\n&q10n5Iags10n5662" id="L467" class="line" name="L10n6Iags10n/t-line:d="L.c#9177" id="L4_dynam_file1" id=) ef="+c_dynam_filkref=ne:d="L476" class="line" nynam_suce="Lline" nmutexounlocksreynam_suce="L hrelinmutexounlockref=""+code=nword10n7Iagscom10n89>10n7662" id="L467" class="line" name="L10n8Iags    10nf=>10n8t-line:d="Lne:d="L476" class="_odn9fNVAL9
ddebug_pnlass="sref"10nf">10nuleref=ad="L476" class="line" name="L1018Iags10i"746" i+code=modname" class="sref">me83" a href="lib/dynde83" ic_dc#9747" id="L447" i8
10iast '\10i2Iags new_nlass="sref">que105">>10iE 2" i=line" name;)9
 n>    10 hr>10iULLref=ame="L401"> 401             8k; tabtatic i10 na>10i9403" id="L467" class="line" name="L10i5Iags9
8
parse_lind10"+c>10ipsref==line" name;)9
8
        unsigndf=10tab>10ipairs of match-spec <valu6      9I9>rc9
parse_lind10"+c>10iast ddebug_"lib/dynamic_de8ug namfL_cref="_ignin="L1" id="srefg namfL_cref="_igni"lib/dynamic_de9ug.c#9830" id="Ls="stri        8
parse_linseq_opee="L4file_operationssref">parse_linfileslinmutexounlockref=""+code=nword1028Iagsquer10y" >10y"sref==line" name;)9
10yknown ked="L468" clasn class="stringm namfL_namic_n="L1" id="srefg namfL_namic_634" ="lib/dynamic_dei8
9
      9I9>rc9
10yULLref=ame="L0of match-spec <value>\n&q1024Iags'\0	maskp9
10y5f=, 0of match-spec <value>\n&q1026Iagsddebug_pvalsref">p10sre>10y455" i}= '\10y7Iags        u10i" >10y7t-line:d="Lne:d="L476" class="_odn9fNVAL9
9
 401           10y9Iagsddebug_psepsref">p10sre>10y="t   coded="L439"[)9>10>)"t ss10>n="t 'cmdfo" cl47"line"+codecmdfo" clasug.c#9079" id="L479" class=" cla1032Iagspar10ode>10>E 2" i=line" n-spec <value>\n&quo9k 4679
'\0	maskp9
9
9id=cn href="="string">'\0	maskp9
10>4 2" i=line" n-spec <value>verbose_byt9
'\0	maskp9
 paramtatic int10e=">10>5662" id="L467" class="line" name="L1036Iags sepsref">parse10e=">10>psref==line" name="L466"> 4669
___verboseNVAL9
___verbose"lineablea>        unsigndf="+cotablea1037Iags10>r1" ia"+code=modname" class="sref">mpr_waro" class="sref spr_waro"lib/dynamic_de9ug.c#9830" id="Letatic  a hrefis emptyL479a CONFIG_DYNAMIC_DEBUG builine" name="L48ame="L465"> 465        8Iags10>pairs oame="L401"> 401  L405"> paramtatic int 9Iags/* determined by 10mmi>10>err1" i= '\0kags<1048Iags)9
'\0d;8
9
 paramtatic int que10t;&>10>="L480"d="L467" class="line"dynamic_de9ug.c#9296" id="L396" c_"lib/dynamic_de8u">'\0d;8
 paramtatic int [          private_data1" ia href="+code=query" privatetatic int 3Iags10>3 2" i=line" ="li(;an class="string">'\0d;8
___verboseNVAL9
___verbose"lin;an class="string">'\0d;8
        unsigndf="+cotablea1044Iags9
5Iags9
'\0d;8
'\0d;8
10>valref=fcode=modname" class="+ref="lib/dynamic_del.c#8765" id="L465"del.c634" ="lib/dynamic_d">'\0d;8
'\0d;8
[ddebug_pvalsref">p10sre>10>7662" id="L467" class="line" name="L1048Iagspars10dde>10>pairs oame="L401"> 407" class="line" name="L4679str) 9
'\0d;8
        unsigndf="+cotablea1049Iags9id=cn hre++ry" privatetatic int ddebug_pvalsref">pa10ref>10re"t 9
parse_linseame="L478ftr) 8
[parse_linvalref= :"+code=vpr_info" class=ot;un+pecting pairs oe10r1Iags       10dde>10rknown ked="L468" clas401"> 407" class="line" nam;\n&quo9k 4679
;9
 4044444444="+code=vpr_info" class="sref ss="u f="=ry" privatetatic int co10c#9>10r pairs f match-spec &44444444="+code=vpr_infid=amic_de9ug.c#9296" id="L396" c_"lib/dynamic_de8u">'\0d;8
 paramtatic int 10rramref=f match-spec &=a= [          private_data1" ia href="+code=query" privatetatic int 10rvalref=fcode=modname"n class="string">'\0kags<1057Iags10rr1" ia"+code=modname" class="sref">mo" class="sref ss="u ++ry" privatetatic int com10#95>10rclass="line" name="L466"> 466      89;10r9488" i+code=modname" class=;\n&quo9k 4679
parse_linseame="L478ftr) 8
[parse_linvalref= :"+code=vpr_info" class=ot;un+pea>      89; 4669
ddebug_pvalsref">pa10ref>10)known ked="L468" clasgoto            9>;9
10)9511" id="L467" class="line" name="L10)3Iags paramtatic int modn9lags)9
         paramtatic int ddebug_p=t>     10="s>10)ramref=f match-spec &=="+code=vpr_infid=cn&quo9k 4679id=cn href=="+code=vpr_infe83"g9
9id=cn href* ode=wormodname" class="sref">modn9>tr) 9
 paramtatic int 9
___verboseNVAL9
___verbose"lin -f="lib/dynamic_d_d="L43___verboseNVAL9
      89;quer10y" >10)ast ddebug_p=t>      10"sr>10)9sref==line" name="L466"> 466        unsigndf="+cotablea1078Iagsmpr_waro" class="sref spr_waro"lib/dynamic_de9ug.c#9830" id="L="L479k 9
 465        9
parse_linse"L449>flag9
 466co10c#9>10)pt  4669
10)ULLref=ame="L401"> 4044444444="+code=vpr_infpr_waro" class="sref spr_waro"lib/dynamic_de9ug.c#9830" id="LInvalid9tatic  c#943am_cb> 465        lasts which pon2f=at th10>la>10) pairs f match-spec &4444444444444444="+code=vpr_inf="L479ksetup_.c#9479 9
com10#97>10)ramref=f match-spec &elseinmutexounlockref=""+code=nword1076Iagsque10ug_>10)valref=fcode=modname" class="ec <value>sref">modn9lags)9
a href="lib/dynamic_de9ug.c#9479" id="L479"ld=+conges+cod="L479k 9
        9
 466      89;        u10dde>10)ast 10)9srefne:d="L476" class="lineeeeeeeee" aga479tNVALcommine"> * any d1088Iags)9
commine"> * any d1081Iagsquer10g_p>10>#9750" i commine"> * any d1082Iags9
commine"> * any d1083Iagsparse_lind10"+c>10>st-line:d="L476" class="lineeeeeeeee" 9
 = 09
10>.t-line:d="L476" class="lineeeeeeeee" slightlmenoisy"namverbose, butyharmdesac#9703" iwss="string">commine"> * any d1085Iagsparse_lin=f="+cop10ssr>10>dreline:d="L476" class="lineeeeeeeee" name="L479k = 09
quesaved_lass9
<_fo" cl47"line"+codesaved_lass9
<_fo" srefef="+code=vpr_inf">parse_link cldupbuec_"sref">ddebug_pnlass="sref">query7Iagsparse_lin=f="+10ope>10>nct )9
as=se_mic_"lib/dynamic_de9ug.c#9830" id="L=ss seq_readsref">parse_105">>10>pairs oame="L401"> 400000,00,00,0> seq_opensref">parse_linsed9 ssquery9Iags seq_lseeksref">parse_l10> s>10>9488" i+code=modname" class=">'\0	fa> = ~0U9
query10et488" i+code=n class="string">'\0	maskp9
'\1092Iags9
'\1093Iagsqueryco10c#8>10ect '\0	maskp9
10e5f=, 0of match-spec <value>\n&q1096Iags10e,reline:d="L476" class="line" Allow earlyL47itializa8834 ="lic#943mesaages+via c#943am_cb>" name="L479k = 09
com10#89>10e7211" id="L467" clasearlyeynamnamia>9
 466query    102f=>10eckref=a= '\10e9Iagsddebug_pnlass="sref"10ef">10e9srefne:d="L476" class="line" D namfL setup must ceLdola l"L4>e" name="L479k = 09
11n8"t <;value>\n&qufseynamnamia>9
 466query
Tic_original LXR softwar44byamic_s="sref">http://source="lge.net/prof="li/lxr">LXR lassunamyclasf=tb/dyexpg.cs="lal vers834 byas="sref">mailto:lxr@nt ux.no">lxr@nt ux.noclas.
lxr.nt ux.no kLhttp://www.redpill-nt pro.no">Redpill Lt pro ASclasf=provid4>eof Lt ux dn9>ultref=9