|
|
1.1 ! root 1: /* ! 2: * db/db.h ! 3: * A debugger. ! 4: * Header file. ! 5: */ ! 6: ! 7: #define VERSION "4.1.9" /* Version number */ ! 8: ! 9: /* Use or ignore function prototypes. */ ! 10: #ifdef PROTO_OK ! 11: #define __(args) args /* Use prototype info */ ! 12: #else ! 13: #define __(args) () /* Prototype info disappears */ ! 14: #endif ! 15: ! 16: #include <stdio.h> ! 17: #include <stdlib.h> ! 18: #include <string.h> ! 19: #include <ctype.h> ! 20: #include <l.out.h> ! 21: #include <coff.h> /* header bug: must follow l.out.h */ ! 22: #include <sys/reg.h> ! 23: #include <ieeefp.h> /* header bug: must follow <sys/reg.h> */ ! 24: #include <sys/types.h> ! 25: #include "mdb.h" ! 26: /* #include "mdbdefs.h" #included below, after type definitions */ ! 27: ! 28: /* ! 29: * Print much too much debug output if DEBUG. ! 30: * Turning the "dbprintf((...));" calls into "printf();" as needed ! 31: * is more useful in practice. ! 32: */ ! 33: #if DEBUG ! 34: #define dbprintf(args) printf args ! 35: #else ! 36: #define dbprintf(args) ! 37: #endif ! 38: ! 39: /* Print ptrace calls if DBPTRACE. */ ! 40: #if DBPTRACE ! 41: #define ptrace(cmd, id, loc, val) dbptrace((cmd), (id), (loc), (val)) ! 42: #endif ! 43: ! 44: #define OLD_CORE 1 /* Support both core formats, just for now */ ! 45: ! 46: #define PROMPT "db: " /* default interactive prompt */ ! 47: ! 48: /* Values for file_type. */ ! 49: #define LOUT_FILE 1 ! 50: #define COFF_FILE 2 ! 51: #define IS_LOUT (file_type == LOUT_FILE) ! 52: #define IS_COFF (file_type == COFF_FILE) ! 53: #define IS_OBJ (file_type == LOUT_FILE || file_type == COFF_FILE) ! 54: ! 55: /* Adjustible manifest constants. */ ! 56: #define ARGSIZE 20 /* Max number of args for ':e' */ ! 57: #define CCSSIZE 8 /* C compiler symbol size */ ! 58: #define COMSIZE 128 /* Command sequence size */ ! 59: #define DISSIZE 64 /* Terminal display size */ ! 60: #define FORSIZE 64 /* Segment format size */ ! 61: #define MISSIZE 256 /* Miscellaneous buffer size */ ! 62: #define NHASH 64 /* Number of SYM hash buckets */ ! 63: #define NBPT 16 /* Number of breakpoints */ ! 64: #define VALSIZE 10 /* Number of expressions allowed */ ! 65: ! 66: /* Single step modes. */ ! 67: #define SNULL 0 /* Do nothing, :e */ ! 68: #define SSTEP 1 /* Single step, :s */ ! 69: #define SCONT 2 /* Continuous step, :sc */ ! 70: #define SCALL 3 /* Continuous step at call */ ! 71: #define SWAIT 4 /* Step to function return */ ! 72: ! 73: /* Values for reg_flag; larger values must be superset of smaller. */ ! 74: #define R_INVALID 0 /* Registers not read yet */ ! 75: #define R_SOME 1 /* Registers PC, FP, SP, signo read */ ! 76: #define R_GEN 2 /* General registers read */ ! 77: #define R_ALL 3 /* Registers all read */ ! 78: ! 79: /* Breakpoint table. */ ! 80: typedef struct b_st { ! 81: int b_flag; /* Flag word */ ! 82: ADDR_T b_badd; /* Breakpoint address */ ! 83: ADDR_T b_rfpt; /* Return frame pointer */ ! 84: ADDR_T b_sfpt; /* Single continue frame pointer */ ! 85: char *b_bcom; /* Breakpoint command */ ! 86: char *b_rcom; /* Return command */ ! 87: BIN b_bins; /* Replaced instruction */ ! 88: } BPT; ! 89: /* Breakpoint flags. */ ! 90: #define BBPT 0x01 /* Ordinary (:b) */ ! 91: #define BRET 0x02 /* Return (:br) */ ! 92: #define BSIN 0x04 /* Single step at call (:sc) */ ! 93: ! 94: /* ! 95: * Segment definitions. ! 96: * This is a vestige of PDP-11 architecture ! 97: * which has no business living in the machine-independent code. ! 98: */ ! 99: #define NSEGS 3 /* Number of segments */ ! 100: #define DSEG 0 /* Data */ ! 101: #define ISEG 1 /* Instructions */ ! 102: #define USEG 2 /* User */ ! 103: #define DSPACE seg_map[DSEG] /* Data space */ ! 104: #define ISPACE seg_map[ISEG] /* Instruction space */ ! 105: #define USPACE seg_map[USEG] /* User area */ ! 106: #define SEG_NONE -1 /* None of the above */ ! 107: ! 108: /* ! 109: * Segmentation map. ! 110: * This tells db how to map an address in a given segment ! 111: * into an offset in the program file, in the core file, ! 112: * or in the child process. ! 113: */ ! 114: typedef struct map { ! 115: struct map *m_next; /* Pointer to next */ ! 116: ADDR_T m_base; /* Segment base */ ! 117: ADDR_T m_bend; /* Segment end */ ! 118: off_t m_offt; /* Offset */ ! 119: int m_segi; /* Segment index */ ! 120: int m_flag; /* Flag: program, core, child */ ! 121: } MAP; ! 122: /* Map flags. */ ! 123: #define MAP_PROG 0 /* Segment in program file */ ! 124: #define MAP_CORE 1 /* Segment in core file */ ! 125: #define MAP_CHILD 2 /* Segment in child process */ ! 126: ! 127: /* ! 128: * Symbol. ! 129: */ ! 130: typedef struct sym { ! 131: struct sym *s_next; /* Hash chain link */ ! 132: ADDR_T s_addr; /* Value */ ! 133: char s_segn; /* Segment */ ! 134: char s_id[1]; /* Name */ ! 135: } SYM; ! 136: ! 137: /* ! 138: * Default file names. ! 139: */ ! 140: #define DEFLT_OBJ "l.out" /* object file */ ! 141: #define DEFLT_OBJ2 "a.out" /* object file if l.out not found */ ! 142: #define DEFLT_AUX "core" /* auxiliary file */ ! 143: ! 144: /* ! 145: * Value descriptor. ! 146: * A VAL can represent no value (flag==VNULL); ! 147: * an lvalue (flag==VSEGN), i.e. a segment and an ADDR_T address; or ! 148: * a long rvalue (flag==0). ! 149: * In a few places (e.g. "*<number>?"), an rvalue gets coerced to an lvalue, ! 150: * with the segment either implied or invented. ! 151: */ ! 152: typedef struct val { ! 153: unsigned char v_flag; /* Flag word */ ! 154: unsigned char v_segn; /* Segment number */ ! 155: long v_nval; /* Value */ ! 156: } VAL; ! 157: /* Value flags. */ ! 158: #define VNULL 1 /* Value is null */ ! 159: #define VSEGN 2 /* Value has known segment */ ! 160: ! 161: /* ! 162: * Input stack. ! 163: */ ! 164: typedef struct inp { ! 165: struct inp *i_next; /* Pointer to next */ ! 166: int i_type; /* Type of input */ ! 167: union { ! 168: FILE *i_filp; /* File pointer */ ! 169: char *i_strp; /* String pointer */ ! 170: } i_u; ! 171: } INP; ! 172: /* Input types. */ ! 173: #define IFILE 1 /* File I/O */ ! 174: #define ICORE 2 /* Core I/O */ ! 175: ! 176: /* Simple routines implemented as macros. */ ! 177: #ifdef NOCANON ! 178: #define getb(segn, bp, n) getputb((segn), (bp), (n), 0) ! 179: #define putb(segn, bp, n) getputb((segn), (bp), (n), 1) ! 180: #endif ! 181: #define nfree(cp) free(cp) ! 182: #define nvalue(vp) ((vp)->v_flag & VNULL) ! 183: #define printx printf ! 184: #define putx(c) putchar(c) ! 185: #define ungetn(c) ungotc = (c) ! 186: ! 187: /* ! 188: * Function prototypes. ! 189: */ ! 190: /* db1.c */ ! 191: extern int main __((int argc, char *argv[])); ! 192: extern void arm_sigint __((void)); ! 193: extern void canlout __((void)); ! 194: extern void initialize __((void)); ! 195: extern void leave __((void)); ! 196: extern FILE *openfile __((char *name, int rflag)); ! 197: extern void set_core __((char *name)); ! 198: extern void set_file __((char *name)); ! 199: extern void set_prog __((char *name, int flag)); ! 200: extern void setup __((int argc, char *argv[])); ! 201: extern int testint __((void)); ! 202: extern void usage __((void)); ! 203: ! 204: /* db2.c */ ! 205: extern MAP *map_addr __((int s, ADDR_T addr)); ! 206: extern void map_clear __((int s, MAP *endp)); ! 207: extern void map_init __((void)); ! 208: extern void map_print __((void)); ! 209: extern void map_set __((int s, ADDR_T base, ADDR_T size, \ ! 210: off_t offt, int flag)); ! 211: ! 212: /* db3.c */ ! 213: extern int command __((VAL *vp)); ! 214: extern char *conform __((char *sp, int s, int t1, int t2)); ! 215: extern int display __((int s, int n)); ! 216: extern void execute __((char *cmd)); ! 217: extern void flushb __((ADDR_T addr)); ! 218: extern void helpinfo __((int flag)); ! 219: extern char *gettime __((char *sp, int s)); ! 220: extern char *printable __((char *sp, int c)); ! 221: extern void process __((void)); ! 222: extern void request __((void)); ! 223: extern int runfile __((void)); ! 224: extern char *save_cmd __((char *buf, char *s)); ! 225: extern int setdata __((int segn, ADDR_T a)); ! 226: extern int syscall __((void)); ! 227: ! 228: /* db4.c */ ! 229: extern int bpt_del __((int t, ADDR_T addr)); ! 230: extern void bpt_init __((void)); ! 231: extern void bpt_display __((void)); ! 232: extern void bpt_print __((int t, ADDR_T a, char *cmd)); ! 233: extern int bpt_set __((int f, ADDR_T addr, ADDR_T fp, char *cmd)); ! 234: ! 235: /* db5.c */ ! 236: extern int expr __((VAL *left, int wall)); ! 237: extern int expr_list __((VAL vlist[])); ! 238: extern int lextoken __((VAL *vp)); ! 239: extern ADDR_T lvalue __((VAL *vp, ADDR_T v)); ! 240: #if 0 ! 241: extern int nvalue __((VAL *vp)); ! 242: #endif ! 243: extern int readval __((VAL *vp, int c)); ! 244: extern int readvar __((VAL *vp, int c)); ! 245: extern long rvalue __((VAL *vp, long v)); ! 246: extern void unlex __((int c)); ! 247: extern int val_segn __((VAL *vp)); ! 248: ! 249: /* db6.c */ ! 250: extern SYM *findsym __((int s, ADDR_T addr)); ! 251: extern int hash __((char *id)); ! 252: extern int is_special __((SYM *sp)); ! 253: extern int is_symbol __((SYM *sp)); ! 254: extern void new_sym __((char *id, ADDR_T addr, int s)); ! 255: extern int read_coff_sym __((void)); ! 256: extern int read_lout_sym __((long symseek)); ! 257: extern char *read_strtab __((void)); ! 258: extern char *symName __((SYMENT *sym, char *strtab)); ! 259: extern int symval __((VAL *vp)); ! 260: ! 261: /* db7.c */ ! 262: extern void add_input __((int type, char *cp)); ! 263: #ifndef NOCANON ! 264: extern void canon __((char *bp, unsigned int n)); ! 265: #endif ! 266: extern char *cvt_addr __((char *buf, int s, ADDR_T addr)); ! 267: #ifndef NOCANON ! 268: extern int getb __((int segn, char *bp, unsigned int n)); ! 269: #endif ! 270: extern int getf __((FILE *fp, char *bp, int n)); ! 271: extern void getline __((char *cp)); ! 272: extern int getn __((void)); ! 273: extern int getputb __((int segn, char *bp, unsigned int n, int d)); ! 274: extern char *nalloc __((int n, char *msg)); ! 275: #if 0 ! 276: extern void nfree __((char *cp)); ! 277: #endif ! 278: extern void panic __((char *arg1, ...)); ! 279: extern void printb __((ADDR_T addr)); ! 280: extern int printe __((char *msg)); ! 281: extern int printr __((char *arg1, ...)); ! 282: #if 0 ! 283: extern void printx __((char *arg1, ...)); ! 284: #endif ! 285: extern void putaddr __((int s, ADDR_T addr)); ! 286: #ifndef NOCANON ! 287: extern int putb __((int segn, char *bp, unsigned int n)); ! 288: #endif ! 289: extern int putf __((FILE *fp, char *bp, int n)); ! 290: #if 0 ! 291: extern void putx __((int c)); ! 292: #endif ! 293: #if 0 ! 294: extern void ungetn __((int c)); ! 295: #endif ! 296: ! 297: /* db8.c */ ! 298: extern int getp __((int f, ADDR_T a, char *bp, int n)); ! 299: extern void killc __((void)); ! 300: extern int putp __((int f, ADDR_T a, char *bp, int n)); ! 301: extern int runc __((void)); ! 302: extern int startc __((char **argv, char *ifn, char *ofn, int aflag)); ! 303: extern int waitc __((void)); ! 304: #if DBPTRACE ! 305: extern int dbptrace __((int cmd, int pid, int loc, int val)); ! 306: #endif ! 307: ! 308: /* ! 309: * Global variables, defined in db0.c. ! 310: */ ! 311: extern ADDR_T add; /* Address used by getb */ ! 312: extern char *addr_fmt; /* ADDR_T format for printf */ ! 313: extern int aop_size; /* Default address/operand size */ ! 314: extern BPT bpt[NBPT]; /* Breakpoint table */ ! 315: #ifndef NOCANON ! 316: extern int cantype; /* Canonization type */ ! 317: #endif ! 318: extern char *cfn; /* Core file name */ ! 319: extern FILE *cfp; /* Core file pointer */ ! 320: extern FILEHDR coff_hdr; /* COFF file header */ ! 321: extern int cseg; /* Current segment */ ! 322: extern ADDR_T dot; /* Current address */ ! 323: extern MAP *endpure; /* End of pure area */ ! 324: extern int execflag; /* Program is in execution */ ! 325: extern int file_type; /* LOUT_FILE or COFF_FILE */ ! 326: extern INP *inpp; /* Input pointer */ ! 327: extern int intflag; /* Interrupt count */ ! 328: extern char *lasterr; /* Last error */ ! 329: extern struct ldheader ldh; /* l.out header */ ! 330: extern char *lfn; /* l.out file name */ ! 331: extern FILE *lfp; /* l.out file pointer */ ! 332: extern char miscbuf[MISSIZE]; /* Miscellaneous buffer */ ! 333: extern int modsize; /* Size of last display mode */ ! 334: extern long nsyms; /* Number of symbols */ ! 335: extern ADDR_T old_add; /* Previous address */ ! 336: extern int pid; /* Current process id */ ! 337: extern char *prompt; /* Interactive command prompt */ ! 338: extern int reg_flag; /* R_INVALID, R_SOME, R_GEN, R_ALL */ ! 339: extern int rflag; /* Read only flag */ ! 340: extern char seg_format[NSEGS][FORSIZE]; /* Segment formats */ ! 341: extern MAP *seg_map[NSEGS]; /* Segment descriptors */ ! 342: extern char *seg_name[NSEGS]; /* Segment names */ ! 343: extern int sflag; /* Don't read symbol table */ ! 344: extern FILE *sfp; /* Symbol table file pointer */ ! 345: extern char *step_cmd; /* Command for single step */ ! 346: extern int step_count; /* Single step count */ ! 347: extern int step_mode; /* Single step mode */ ! 348: extern int step_prev; /* Last mode run (if single) */ ! 349: extern SYM *symhash[NHASH]; /* SYM table hash buckets */ ! 350: extern int ungotc; /* Ungot character */ ! 351: ! 352: /* ! 353: * Define functions and globals defined in machine-dependent code. ! 354: * This must follow the type definitions above. ! 355: */ ! 356: #include "mdbdefs.h" ! 357: ! 358: /* ! 359: * Functions and variables in /lib/libc.a. ! 360: */ ! 361: extern char *ctime(); ! 362: extern char *signame[]; /* Signal names */ ! 363: ! 364: /* end of db/db.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.