I'd like to be able to iterate over all the kernel symbols.  I could
do like some of the functions below and abuse ``db_last_symtab'' but
we since only have a single symbol table there's no point in keeping
a complex interface. 

Ok?

Index: ddb/db_hangman.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_hangman.c,v
retrieving revision 1.33
diff -u -p -r1.33 db_hangman.c
--- ddb/db_hangman.c    27 Jan 2016 10:37:12 -0000      1.33
+++ ddb/db_hangman.c    25 Feb 2016 14:01:39 -0000
@@ -88,20 +88,15 @@ db_hang_forall(db_symtab_t *stab, db_sym
 static __inline char *
 db_randomsym(size_t *lenp)
 {
-       extern db_symtab_t db_symtabs[];
-       db_symtab_t *stab;
-       int nsymtabs, nsyms;
+       extern db_symtab_t db_symtab;
+       db_symtab_t *stab = &db_symtab;
+       int nsyms;
        char    *p, *q;
        struct db_hang_forall_arg dfa;
 
-       for (nsymtabs = 0; db_symtabs[nsymtabs].name != NULL; nsymtabs++)
-               ;
-
-       if (nsymtabs == 0)
+       if (stab->start == 0)
                return (NULL);
 
-       stab = &db_symtabs[arc4random_uniform(nsymtabs)];
-
        dfa.cnt = 0;
        db_elf_sym_forall(stab, db_hang_forall, &dfa);
        nsyms = -dfa.cnt;
@@ -114,9 +109,9 @@ db_randomsym(size_t *lenp)
 
        q = db_qualify(dfa.sym, stab->name);
 
-       /* don't show symtab name if there are less than 3 of 'em */
-       if (nsymtabs < 3)
-               while (*q++ != ':');
+       /* don't show symtab name */
+       while (*q++ != ':')
+               ;
 
        /* strlen(q) && ignoring underscores and colons */
        for ((*lenp) = 0, p = q; *p; p++)
Index: ddb/db_sym.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_sym.c,v
retrieving revision 1.44
diff -u -p -r1.44 db_sym.c
--- ddb/db_sym.c        12 Feb 2016 10:58:41 -0000      1.44
+++ ddb/db_sym.c        25 Feb 2016 14:01:39 -0000
@@ -48,9 +48,7 @@
 #define        MAXNOSYMTABS    MAXLKMS+1       /* Room for kernel + LKM's */
 #endif
 
-db_symtab_t    db_symtabs[MAXNOSYMTABS] = {{0,},};
-
-db_symtab_t    *db_last_symtab;
+db_symtab_t    db_symtab;
 
 extern char end[];
 
@@ -102,23 +100,12 @@ ddb_init(void)
 int
 db_add_symbol_table(char *start, char *end, const char *name, char *ref)
 {
-       int slot;
-
-       for (slot = 0; slot < MAXNOSYMTABS; slot++) {
-               if (db_symtabs[slot].name == NULL)
-                       break;
-       }
-       if (slot >= MAXNOSYMTABS) {
-               db_printf("No slots left for %s symbol table", name);
-               return(-1);
-       }
-
-       db_symtabs[slot].start = start;
-       db_symtabs[slot].end = end;
-       db_symtabs[slot].name = name;
-       db_symtabs[slot].private = ref;
+       db_symtab.start = start;
+       db_symtab.end = end;
+       db_symtab.name = name;
+       db_symtab.private = ref;
 
-       return(slot);
+       return 0;
 }
 
 /*
@@ -127,22 +114,10 @@ db_add_symbol_table(char *start, char *e
 void
 db_del_symbol_table(char *name)
 {
-       int slot;
-
-       for (slot = 0; slot < MAXNOSYMTABS; slot++) {
-               if (db_symtabs[slot].name &&
-                   ! strcmp(db_symtabs[slot].name, name))
-                       break;
-       }
-       if (slot >= MAXNOSYMTABS) {
-               db_printf("Unable to find symbol table slot for %s.", name);
-               return;
-       }
-
-       db_symtabs[slot].start = 0;
-       db_symtabs[slot].end = 0;
-       db_symtabs[slot].name = 0;
-       db_symtabs[slot].private = 0;
+       db_symtab.start = 0;
+       db_symtab.end = 0;
+       db_symtab.name = 0;
+       db_symtab.private = 0;
 }
 
 /*
@@ -194,54 +169,11 @@ db_value_of_name(char *name, db_expr_t *
 
 /*
  * Lookup a symbol.
- * If the symbol has a qualifier (e.g., ux:vm_map),
- * then only the specified symbol table will be searched;
- * otherwise, all symbol tables will be searched.
  */
 db_sym_t
 db_lookup(char *symstr)
 {
-       db_sym_t sp;
-       int i;
-       int symtab_start = 0;
-       int symtab_end = MAXNOSYMTABS;
-       char *cp;
-
-       /*
-        * Look for, remove, and remember any symbol table specifier.
-        */
-       for (cp = symstr; *cp; cp++) {
-               if (*cp == ':') {
-                       *cp = '\0';
-                       for (i = 0; i < MAXNOSYMTABS; i++) {
-                               if (db_symtabs[i].name &&
-                                   ! strcmp(symstr, db_symtabs[i].name)) {
-                                       symtab_start = i;
-                                       symtab_end = i + 1;
-                                       break;
-                               }
-                       }
-                       *cp = ':';
-                       if (i == MAXNOSYMTABS) {
-                               db_error("invalid symbol table name");
-                               /*NOTREACHED*/
-                       }
-                       symstr = cp+1;
-               }
-       }
-
-       /*
-        * Look in the specified set of symbol tables.
-        * Return on first match.
-        */
-       for (i = symtab_start; i < symtab_end; i++) {
-               if (db_symtabs[i].name &&
-                   (sp = db_elf_sym_lookup(&db_symtabs[i], symstr))) {
-                       db_last_symtab = &db_symtabs[i];
-                       return sp;
-               }
-       }
-       return 0;
+       return db_elf_sym_lookup(&db_symtab, symstr);
 }
 
 /*
@@ -253,20 +185,13 @@ db_search_symbol(db_addr_t val, db_strat
 {
        unsigned int    diff;
        db_expr_t       newdiff;
-       int             i;
        db_sym_t        ret = DB_SYM_NULL, sym;
 
        newdiff = diff = ~0;
-       db_last_symtab = NULL;
-       for (i = 0; i < MAXNOSYMTABS; i++) {
-           if (!db_symtabs[i].name)
-               continue;
-           sym = db_elf_sym_search(&db_symtabs[i], val, strategy, &newdiff);
-           if (newdiff < diff) {
-               db_last_symtab = &db_symtabs[i];
+       sym = db_elf_sym_search(&db_symtab, val, strategy, &newdiff);
+       if (newdiff < diff) {
                diff = newdiff;
                ret = sym;
-           }
        }
        *offp = diff;
        return ret;
@@ -285,7 +210,7 @@ db_symbol_values(db_sym_t sym, char **na
                return;
        }
 
-       db_elf_sym_values(db_last_symtab, sym, namep, &value);
+       db_elf_sym_values(&db_symtab, sym, namep, &value);
 
        if (valuep)
                *valuep = value;
@@ -336,7 +261,7 @@ db_printsym(db_expr_t off, db_strategy_t
                                    d, DB_FORMAT_R, 1, 0));
                        }
                        if (strategy != DB_STGY_PROC) {
-                               if (db_elf_line_at_pc(db_last_symtab, cursym,
+                               if (db_elf_line_at_pc(&db_symtab, cursym,
                                    &filename, &linenum, off))
                                        (*pr)(" [%s:%d]", filename, linenum);
                        }

Reply via email to