|
|
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.