|
|
1.1 ! root 1: /* @(#)defs.h 5.4 (Berkeley) 2/20/90 */ ! 2: ! 3: /* ! 4: * adb: common definitions ! 5: */ ! 6: ! 7: #include <sys/param.h> ! 8: #include <sys/user.h> ! 9: ! 10: #include <a.out.h> ! 11: ! 12: /* machine dependent types and definitions */ ! 13: #include "machdep.h" ! 14: ! 15: /* ! 16: * Signals. Adb catches SIGINT and SIGQUIT; the variables sigint and ! 17: * sigquit hold the original state for adb's children. ! 18: */ ! 19: sig_t sigint; /* original SIGINT state */ ! 20: sig_t sigquit; /* original SIGQUIT state */ ! 21: sig_t intcatch; /* interrupt catch routine, or SIG_IGN */ ! 22: ! 23: /* ! 24: * Address spaces. We distinguish only between instruction & data. ! 25: * The spaces NONE, INSTR, and DATA (without the STAR flag) are also used ! 26: * to tag symbols. ! 27: */ ! 28: #define SP_NONE 0 /* not in any space, just a number */ ! 29: #define SP_INSTR 1 /* instruction space */ ! 30: #define SP_DATA 2 /* data space */ ! 31: #define SP_STAR 4 /* or'ed in; see below */ ! 32: ! 33: /* ! 34: * The symbol and core files. ! 35: */ ! 36: struct { ! 37: char *name; /* file name */ ! 38: int fd; /* and descriptor */ ! 39: } symfile, corefile; ! 40: ! 41: /* ! 42: * File address maps. ! 43: */ ! 44: struct m1 { ! 45: addr_t b; /* begins at b */ ! 46: addr_t e; /* ends at e */ ! 47: addr_t f; /* with offset f */ ! 48: }; ! 49: struct map { ! 50: struct m1 m1; /* regular map */ ! 51: struct m1 m2; /* `star' (alternate) map */ ! 52: int ufd; /* unix file descriptor */ ! 53: }; ! 54: ! 55: struct map txtmap; /* the `?' or text file */ ! 56: struct map datmap; /* the `/' or data/core file */ ! 57: ! 58: /* ! 59: * Program and file I/O. ! 60: */ ! 61: enum rwmode { RWMODE_READ, RWMODE_WRITE }; ! 62: #define adbread(space, rmtaddr, localaddr, nbytes) \ ! 63: adbio(RWMODE_READ, space, rmtaddr, (caddr_t)(localaddr), nbytes) ! 64: #define adbwrite(space, rmtaddr, localaddr, nbytes) \ ! 65: adbio(RWMODE_WRITE, space, rmtaddr, (caddr_t)(localaddr), nbytes) ! 66: ! 67: addr_t vtophys(); /* -k: kernel virtual addr to physical */ ! 68: ! 69: /* ! 70: * Errors. errflag should be set to point to the error message when ! 71: * an error occurs. error(s) sets errflag to s and jumps back ! 72: * to the main loop via longjmp(). In some places this is unsafe ! 73: * or undesirable, and instead errflag is set directly; checkerr() ! 74: * can be used to test (and jump on) for such errors later. ! 75: * ! 76: * mkfault creates a `generic' error after a keyboard interrupt. ! 77: * ! 78: * Various error strings are defined in message.c and referenced ! 79: * through names below. ! 80: */ ! 81: char *errflag; /* the error, or NULL */ ! 82: int mkfault; /* interrupted; pretend an error */ ! 83: ! 84: #define iserr() (errflag || mkfault) ! 85: #define checkerr() \ ! 86: if (!iserr()) \ ! 87: /* void */; \ ! 88: else \ ! 89: error(errflag) ! 90: /* if checkerr() above is undefined, a function version is used instead */ ! 91: ! 92: /* ! 93: * Locations. ! 94: * ! 95: * HSZ and FSZ are defined here as the sizes of `half' and `full' words ! 96: * respectively. While these are not `locations', they are commonly used ! 97: * to set the value of dotinc. ! 98: */ ! 99: int gavedot; /* true iff this command set dot */ ! 100: addr_t dot; /* current location; but see also edot */ ! 101: addr_t ditto; /* previous dot */ ! 102: int dotinc; /* size of last object examined */ ! 103: ! 104: extern char ADDRWRAP[]; /* "address wrap around" */ ! 105: ! 106: /* compute dot+offset, checking for overflow */ ! 107: #define inkdot(o) (ADDRESS_WRAP(dot, dot+(o)) ? error(ADDRWRAP), 0 : dot+(o)) ! 108: /* if inkdot() above is undefined, a function version is used instead */ ! 109: ! 110: /* ! 111: * Expressions. ! 112: * ! 113: * oexpr() evaluates an optional expression; rexpr() does a required ! 114: * expression, and returns expv as a convenience. ! 115: * ! 116: * N.B.: edot is valid only if gavedot. ! 117: */ ! 118: int oexpr(); /* returns 1 if found expr, else 0 */ ! 119: expr_t rexpr(); /* aborts if no expression found */ ! 120: ! 121: expr_t edot; /* dot as an expression (possibly more bits) */ ! 122: int gavecount; /* true iff this command gave a count */ ! 123: expr_t ecount; /* repeat count from addr,count format */ ! 124: expr_t expv; /* value from last expression */ ! 125: expr_t var[36]; /* adb's 36 variables (0..9 then a..z) */ ! 126: ! 127: /* ! 128: * Input. ! 129: * ! 130: * The global lp points to the current input line. The routine ! 131: * readchar() picks up the next character, incrementing lp, but ! 132: * can read more if appropriate. lastc retains the most recently ! 133: * read character. unreadc() in effect `puts back' lastc. rdc() ! 134: * is like readchar() but skips white space. ! 135: */ ! 136: char *lp; /* pointer into current line */ ! 137: int lastc; /* character most recently read */ ! 138: int readchar(); /* get the next char */ ! 139: int rdc(); /* get the next nonblank char */ ! 140: #ifndef lint ! 141: #define unreadc() (lastc ? lp-- : 0) ! 142: #else ! 143: #define unreadc() (lp--) ! 144: #endif ! 145: #ifndef lint ! 146: #define readchar() (((lastc = *lp) == 0 ? 0 : lp++), lastc) ! 147: #endif ! 148: /* if readchar() above is undefined, a function version is used instead */ ! 149: #define eol(c) ((c) == '\n' || (c) == ';') ! 150: ! 151: /* ! 152: * Miscellaneous globals, functions, and macros. ! 153: */ ! 154: int kernel; /* debugging kernel (-k flag) */ ! 155: int kcore; /* have a post-mortem dump (-k + core) */ ! 156: int wtflag; /* adb => 0, adb -w => 2 */ ! 157: int radix; /* current radix (input and %r/%R formats) */ ! 158: int pid; /* process id being debugged, or 0 */ ! 159: int signo; /* signal that stopped process pid */ ! 160: int sigcode; /* extension info (machine dependent) */ ! 161: ! 162: addr_t maxoff; /* max offset for symbol match ($s) */ ! 163: #define MAXOFF 1024 /* default value */ ! 164: ! 165: int maxcol; /* max output column ($w) */ ! 166: #define MAXCOL 80 /* default value */ ! 167: ! 168: #define LINELEN 1024 /* max input line length */ ! 169: #define SYMLEN 1024 /* max symbol length */ ! 170: ! 171: int errno; /* our old friend */ ! 172: ! 173: /* ! 174: * checkfloat() returns an error string if a float or double is ! 175: * some sort of reserved bit pattern, such that trying to print it ! 176: * would cause a fault. It is called with the address of the ! 177: * float or double, and a 0 or 1 to indicate float and double ! 178: * respectively. checkfloat() returns NULL if the number is printable. ! 179: */ ! 180: char *checkfloat(); /* check a float or double for correctness */ ! 181: ! 182: struct reglist *reglookup(); /* find a register by name */ ! 183: ! 184: struct nlist *lookup(); /* look up a symbol */ ! 185: struct nlist *findsym(); /* like lookup, but allows an offset */ ! 186: struct nlist *nextlocal(); /* given a sym, return the next local sym */ ! 187: ! 188: struct nlist *symtab; /* symbol table */ ! 189: struct nlist *esymtab; /* end of symtab */ ! 190: ! 191: expr_t getreg(); /* returns the value in a register */ ! 192: ! 193: addr_t eval_localsym(); /* compute the address of a local symbol */ ! 194: ! 195: /* ! 196: * eqstr(a, b) is true iff the given strings compare equal. ! 197: * eqsym(a, b, c) is true if symbols a and b match, but allowing ! 198: * the `a' symbol to begin with the character `c'. ! 199: */ ! 200: #define eqstr(a, b) (*(a) == *(b) && strcmp(a, b) == 0) ! 201: #define eqsym(a, b, c) (eqstr(a, b) || *(a) == (c) && eqstr((a) + 1, b)) ! 202: ! 203: /* ! 204: * The user structure. ! 205: */ ! 206: union { ! 207: struct user user; /* the actual user struct */ ! 208: char upages[ctob(UPAGES)]; /* u. + kernel stack */ ! 209: } uu; ! 210: #define u uu.user
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.