|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)kdb_sym.c 7.3 (Berkeley) 5/3/90 ! 7: */ ! 8: ! 9: /* ! 10: * adb - symbol table routines ! 11: */ ! 12: #include "../kdb/defs.h" ! 13: #include <stab.h> ! 14: ! 15: /* ! 16: * Initialize the symbol table. ! 17: */ ! 18: kdbsetsym(sym, esym, strtab, strsize) ! 19: char *sym, *esym, *strtab; ! 20: { ! 21: register struct nlist *sp; ! 22: ! 23: kdbsymtab = (struct nlist *)sym, kdbesymtab = (struct nlist *)esym; ! 24: for (sp = kdbsymtab; sp < kdbesymtab; sp++) ! 25: if (sp->n_un.n_strx) { ! 26: if (sp->n_un.n_strx > strsize) { ! 27: kdbprintf("setsym: Bad string table index (%d)\n", ! 28: sp->n_un.n_strx); ! 29: sp->n_un.n_strx = 0; /* XXX */ ! 30: continue; ! 31: } ! 32: sp->n_un.n_name = strtab + sp->n_un.n_strx; ! 33: } ! 34: } ! 35: ! 36: /* ! 37: * Lookup a symbol by name. ! 38: */ ! 39: struct nlist * ! 40: kdblookup(symstr) ! 41: char *symstr; ! 42: { ! 43: register struct nlist *sp; ! 44: ! 45: kdbcursym = 0; ! 46: if (kdbsymtab) ! 47: for (sp = kdbsymtab; sp < kdbesymtab; sp++) ! 48: /* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */ ! 49: if ((sp->n_type&N_STAB)==0 && kdbeqsym(sp->n_un.n_name, symstr, '_')) ! 50: return(kdbcursym = sp); ! 51: return (0); ! 52: } ! 53: ! 54: /* ! 55: * Find the closest symbol to val, and return ! 56: * the difference between val and the symbol found. ! 57: * Leave a pointer to the symbol found as cursym. ! 58: */ ! 59: kdbfindsym(val, type) ! 60: register long val; ! 61: int type; ! 62: { ! 63: register diff; ! 64: register struct nlist *sp; ! 65: ! 66: kdbcursym = 0; ! 67: diff = MAXINT; ! 68: if (type == NSYM || kdbsymtab == 0) ! 69: return (diff); ! 70: for (sp = kdbsymtab; sp < kdbesymtab; sp++) { ! 71: if (sp->n_type&N_STAB || (sp->n_type&N_EXT)==0) ! 72: continue; ! 73: if (val - sp->n_value < diff && val >= sp->n_value) { ! 74: diff = val - sp->n_value; ! 75: kdbcursym = sp; ! 76: if (diff == 0) ! 77: break; ! 78: } ! 79: } ! 80: return (diff); ! 81: } ! 82: ! 83: /* ! 84: * Advance cursym to the next local variable. ! 85: * Leave its value in localval as a side effect. ! 86: * Return 0 at end of file. ! 87: */ ! 88: kdblocalsym(cframe) ! 89: long cframe; ! 90: { ! 91: register int type; ! 92: register struct nlist *sp; ! 93: ! 94: if (kdbcursym) ! 95: for (sp = kdbcursym; ++sp < kdbesymtab; ) { ! 96: type = sp->n_type; ! 97: if (sp->n_un.n_name[0] =='_' || type == N_FN) ! 98: return (0); ! 99: switch (type) { ! 100: ! 101: case N_TEXT: ! 102: case N_TEXT|N_EXT: ! 103: case N_DATA: ! 104: case N_DATA|N_EXT: ! 105: case N_BSS: ! 106: case N_BSS|N_EXT: ! 107: kdblocalval = sp->n_value; ! 108: kdbcursym = sp; ! 109: return (1); ! 110: ! 111: case N_LSYM: ! 112: kdblocalval = cframe - sp->n_value; ! 113: kdbcursym = sp; ! 114: return (1); ! 115: ! 116: case N_PSYM: ! 117: case N_ABS: ! 118: kdblocalval = cframe + sp->n_value; ! 119: kdbcursym = sp; ! 120: return (1); ! 121: } ! 122: } ! 123: kdbcursym = 0; ! 124: return (0); ! 125: } ! 126: ! 127: /* ! 128: * Print value v and then the string s. ! 129: * If v is not zero, then we look for a nearby symbol ! 130: * and print name+offset if we find a symbol for which ! 131: * offset is small enough. ! 132: * ! 133: * For values which are just into kernel address space ! 134: * that they match exactly or that they be more than maxoff ! 135: * bytes into kernel space. ! 136: */ ! 137: kdbpsymoff(v, type, s) ! 138: register long v; ! 139: int type; ! 140: char *s; ! 141: { ! 142: register w; ! 143: ! 144: if (v) ! 145: w = kdbfindsym(v, type); ! 146: if (v==0 || w >= kdbmaxoff) ! 147: kdbprintf(LPRMODE, v); ! 148: else { ! 149: kdbprintf("%s", kdbcursym->n_un.n_name); ! 150: if (w) ! 151: kdbprintf(OFFMODE, w); ! 152: } ! 153: kdbprintf(s); ! 154: } ! 155: ! 156: /* ! 157: * Print value v symbolically if it has a reasonable ! 158: * interpretation as name+offset. If not, print nothing. ! 159: * Used in printing out registers $r. ! 160: */ ! 161: kdbvalpr(v, idsp) ! 162: long v; ! 163: { ! 164: register off_t d; ! 165: ! 166: d = kdbfindsym(v, idsp); ! 167: if (d >= kdbmaxoff) ! 168: return; ! 169: kdbprintf("%s", kdbcursym->n_un.n_name); ! 170: if (d) ! 171: kdbprintf(OFFMODE, d); ! 172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.