|
|
1.1 root 1: /*
2: * db/i386/i386db.h
3: * A debugger.
4: * i386-specific header file.
5: * i386/mdb.h contains definitions used by machine-independent code.
6: * i386/mdbdefs.h defines externals referenced by machine-independent code.
7: * i386/i386db.h contains definitions used only by machine-dependent code.
8: */
9:
10: #include "db.h"
11:
12: /* Macros. */
13: #define rup(x) (((x) + 0xF) & ~0xF) /* round up to 16-byte boundary */
14: #define get_code(nbytes) getb(segn, ibp, (nbytes))
15:
16: /*
17: * Registers from the user area after a core dump.
18: * get_regs() reads data to one of these with one getb() call for :r,
19: * so the members must correspond to the offsets in <sys/ptrace.h>.
20: */
21: typedef struct ureg {
22: ADDR_T ur_gs;
23: ADDR_T ur_fs;
24: ADDR_T ur_es;
25: ADDR_T ur_ds;
26: ADDR_T ur_di;
27: ADDR_T ur_si;
28: ADDR_T ur_bp;
29: ADDR_T ur_fill; /* sp */
30: ADDR_T ur_bx;
31: ADDR_T ur_dx;
32: ADDR_T ur_cx;
33: ADDR_T ur_ax;
34: ADDR_T ur_trapno;
35: ADDR_T ur_err;
36: ADDR_T ur_ip;
37: ADDR_T ur_cs;
38: ADDR_T ur_fw; /* efl */
39: ADDR_T ur_sp; /* uesp */
40: ADDR_T ur_ss;
41: ADDR_T ur_sig;
42: struct _fpstate ur_fpstate;
43: } UREG;
44: #define UREG_BASE PTRACE_GS /* pseudo-offset of ureg base for ptrace() */
45: #define UREG_GEN_SIZE (sizeof(UREG)-sizeof(struct _fpstate))
46: #define UREG_ALL_SIZE (sizeof(UREG))
47:
48: /*
49: * Register names and corresponding ptrace() offsets.
50: * The flags are used in printing the register info for :r.
51: */
52: typedef struct regname {
53: int r_flag;
54: char *r_name;
55: int r_offset;
56: } REGNAME;
57: #define NGREGS 16 /* number of general registers */
58: #define NREGS 24 /* total number of registers */
59: #define RF_16 1 /* 16-bit value */
60: #define RF_1632 2 /* 16- or 32-bit value */
61: #define RF_NDP 3 /* NDP register */
62:
63: /*
64: * NDP miscellaneous opcode table.
65: */
66: typedef struct ndpmtab {
67: int ndpm_val; /* 2-byte value */
68: char *ndpm_op; /* name */
69: } NDPMTAB;
70:
71: /*
72: * i386 opcodes.
73: * Most are needed for the code which plants return breakpoints and
74: * prints tracebacks.
75: */
76: #define ADDSP1 0x83 /* add %esp, $imm byte 1 */
77: #define ADDSP2 0xC4 /* add %esp, $imm byte 2 */
78: #define CALL 0xE8 /* call */
79: #define ENTER 0xC8 /* enter */
80: #define ICALL1 0xFF /* icall byte 1 */
81: #define IC2MSK 0x38 /* icall byte 2 mask (reg) */
82: #define ICALL2 0x10 /* icall byte 2 (masked) */
83: #define INT 0xCD /* int (COH286 syscall) */
84: #define LCALL 0x9A /* lcall (COH386 syscall) */
85: #define LEAVE 0xC9 /* leave */
86: #define POPECX 0x59 /* pop %ecx */
87: #define PUSHEBP 0x55 /* push %ebp */
88: #define PUSHESI 0x56 /* push %esi */
89: #define TRAP 0xCC /* int 3 */
90:
91: /*
92: * Functions.
93: * i386/mdbdefs.h defines additional routines
94: * which are referenced by machine-independent code.
95: */
96: /* i386db1.c */
97: extern int get_fp_reg __((struct _fpreg *fpregp, double *dp));
98: extern int get_sized __((int s, ADDR_T *lp));
99: extern ADDR_T get_sp __((void));
100:
101: /* i386db2.c */
102: extern int ad_size __((void));
103: extern int adj_op_size __((int c2));
104: extern char *format __((char *isp, char *dest));
105: extern int genRegIndex __((int c2));
106: #if 0
107: extern int get_code __((int nbytes));
108: #endif
109: extern int get_modRM __((void));
110: extern int get_nbytes __((int mysize));
111: extern int get_sib __((void));
112: extern int getValData __((int is_signed, int mysize));
113: extern ADDR_T get_value __((int mysize, int is_signed, int flag));
114: extern int op_size __((void));
115: extern void out_addr __((ADDR_T v));
116: extern void out_disp __((int fmt, int is_signed, ADDR_T val));
117: extern void out_modRM __((int dispsize, int fmt, int addrsize, int is_signed));
118: extern void out_modRM16 __((int c2));
119: extern void out_modRM32 __((int c2));
120: extern void output __((char *src));
121: extern void out_segpre __((void));
122: extern void out_sib __((int dispsize, int m));
123:
124: /*
125: * Global symbols.
126: * i386/mdbdefs.h defines additional globals
127: * which are referenced by machine-independent code.
128: */
129: /* i386db0.c */
130: extern int NDP_flag; /* NDP instructions are usable */
131: extern ADDR_T sys_add; /* Address of op after syscall */
132: extern BIN sys_in; /* Instruction after sys call */
133: extern UREG ureg; /* Child program registers */
134:
135: /*
136: * Tables.
137: */
138: /* i386db0.c */
139: extern char *formtab[4][4]; /* Formats */
140: extern REGNAME reg_name[]; /* Register names */
141: #if 0
142: extern char *sysitab[]; /* System calls */
143: #endif
144: /* i386db3.c */
145: extern char *op_map_1[]; /* Instruction map 1 */
146: extern char *op_map_2[]; /* Instruction map 2 */
147: extern char *grp_map[9][8]; /* Instruction groups */
148: extern char *NDP_op[8][8]; /* NDP opcode table m!=3 */
149: extern char *NDP_op_3[8][8]; /* NDP opcode table m==3 */
150: extern NDPMTAB NDP_misc_op[]; /* NDP misc opcode table m==3 */
151: extern char *segReg[]; /* Segment registers */
152: extern char *genReg[3][8]; /* General registers */
153: extern char *ctrlReg[]; /* Control registers */
154: extern char *dbgReg[]; /* Debug registers */
155: extern char *tstReg[]; /* Test registers */
156: extern char *NDPReg[]; /* NDP registers */
157: extern char *modRMtab[2][8]; /* modR/M indirect addressing */
158: extern char *sibtab[4][8]; /* SIB indexed addressing */
159:
160: /* end of db/i386/i386db.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.