Blame


1 6f4d7598 2009-08-15 rsc // See ../src/libmach/LICENSE
2 6f4d7598 2009-08-15 rsc
3 1a0954ab 2005-01-04 devnull #ifndef _MACH_H_
4 1a0954ab 2005-01-04 devnull #define _MACH_H_ 1
5 1a0954ab 2005-01-04 devnull #if defined(__cplusplus)
6 1a0954ab 2005-01-04 devnull extern "C" {
7 1a0954ab 2005-01-04 devnull #endif
8 1a0954ab 2005-01-04 devnull
9 1a0954ab 2005-01-04 devnull AUTOLIB(mach)
10 1a0954ab 2005-01-04 devnull
11 0e3cc9f4 2004-04-19 devnull /*
12 0e3cc9f4 2004-04-19 devnull * Architecture-dependent application data.
13 0e3cc9f4 2004-04-19 devnull *
14 0e3cc9f4 2004-04-19 devnull * The code assumes that ulong is big enough to hold
15 0e3cc9f4 2004-04-19 devnull * an address on any system of interest as well as any
16 0e3cc9f4 2004-04-19 devnull * register. Debugging 64-bit code on 32-bit machines
17 0e3cc9f4 2004-04-19 devnull * will be interesting.
18 0e3cc9f4 2004-04-19 devnull *
19 0e3cc9f4 2004-04-19 devnull * Supported architectures:
20 0e3cc9f4 2004-04-19 devnull *
21 0e3cc9f4 2004-04-19 devnull * MIPS R3000
22 0e3cc9f4 2004-04-19 devnull * Motorola 68020
23 0e3cc9f4 2004-04-19 devnull * Intel 386
24 0e3cc9f4 2004-04-19 devnull * SPARC
25 0e3cc9f4 2004-04-19 devnull * PowerPC (limited)
26 0e3cc9f4 2004-04-19 devnull * ARM (limited)
27 0e3cc9f4 2004-04-19 devnull * Intel 960 (limited)
28 0e3cc9f4 2004-04-19 devnull * AT&T 3210 DSP (limited)
29 0e3cc9f4 2004-04-19 devnull * MIPS2 (R4000)
30 0e3cc9f4 2004-04-19 devnull */
31 0e3cc9f4 2004-04-19 devnull
32 0e3cc9f4 2004-04-19 devnull typedef struct Fhdr Fhdr;
33 0e3cc9f4 2004-04-19 devnull typedef struct Loc Loc;
34 0e3cc9f4 2004-04-19 devnull typedef struct Mach Mach;
35 0e3cc9f4 2004-04-19 devnull typedef struct Map Map;
36 0e3cc9f4 2004-04-19 devnull typedef struct Regdesc Regdesc;
37 0e3cc9f4 2004-04-19 devnull typedef struct Regs Regs;
38 0e3cc9f4 2004-04-19 devnull typedef struct Seg Seg;
39 0e3cc9f4 2004-04-19 devnull typedef struct Symbol Symbol;
40 0e3cc9f4 2004-04-19 devnull typedef struct Symtype Symtype;
41 0e3cc9f4 2004-04-19 devnull
42 0e3cc9f4 2004-04-19 devnull typedef int (*Tracer)(Map*, Regs*, ulong, ulong, Symbol*, int);
43 0e3cc9f4 2004-04-19 devnull
44 0e3cc9f4 2004-04-19 devnull extern Mach *mach;
45 0e3cc9f4 2004-04-19 devnull extern Mach *machcpu;
46 0e3cc9f4 2004-04-19 devnull
47 0e3cc9f4 2004-04-19 devnull /*
48 0e3cc9f4 2004-04-19 devnull * Byte-order data layout manipulation.
49 0e3cc9f4 2004-04-19 devnull * swap.c ieee.c
50 0e3cc9f4 2004-04-19 devnull */
51 0e3cc9f4 2004-04-19 devnull u16int beswap2(u16int u);
52 0e3cc9f4 2004-04-19 devnull u32int beswap4(u32int u);
53 0e3cc9f4 2004-04-19 devnull u64int beswap8(u64int u);
54 0e3cc9f4 2004-04-19 devnull int beieeeftoa32(char*, uint, void*);
55 0e3cc9f4 2004-04-19 devnull int beieeeftoa64(char*, uint, void*);
56 0e3cc9f4 2004-04-19 devnull int beieeeftoa80(char*, uint, void*);
57 0e3cc9f4 2004-04-19 devnull
58 0e3cc9f4 2004-04-19 devnull u16int leswap2(u16int u);
59 0e3cc9f4 2004-04-19 devnull u32int leswap4(u32int u);
60 0e3cc9f4 2004-04-19 devnull u64int leswap8(u64int u);
61 0e3cc9f4 2004-04-19 devnull int leieeeftoa32(char *a, uint n, void *v);
62 0e3cc9f4 2004-04-19 devnull int leieeeftoa64(char *a, uint n, void *v);
63 0e3cc9f4 2004-04-19 devnull int leieeeftoa80(char *a, uint n, void *v);
64 0e3cc9f4 2004-04-19 devnull
65 0e3cc9f4 2004-04-19 devnull u16int beload2(uchar*);
66 0e3cc9f4 2004-04-19 devnull u32int beload4(uchar*);
67 0e3cc9f4 2004-04-19 devnull u64int beload8(uchar*);
68 0e3cc9f4 2004-04-19 devnull
69 0e3cc9f4 2004-04-19 devnull u16int leload2(uchar*);
70 0e3cc9f4 2004-04-19 devnull u32int leload4(uchar*);
71 0e3cc9f4 2004-04-19 devnull u64int leload8(uchar*);
72 0e3cc9f4 2004-04-19 devnull
73 0e3cc9f4 2004-04-19 devnull int ieeeftoa32(char *a, uint n, u32int u);
74 0e3cc9f4 2004-04-19 devnull int ieeeftoa64(char *a, uint n, u32int h, u32int u);
75 0e3cc9f4 2004-04-19 devnull
76 0e3cc9f4 2004-04-19 devnull /*
77 0e3cc9f4 2004-04-19 devnull * Machine-independent access to an executable image.
78 0e3cc9f4 2004-04-19 devnull * map.c
79 0e3cc9f4 2004-04-19 devnull */
80 0e3cc9f4 2004-04-19 devnull struct Seg
81 0e3cc9f4 2004-04-19 devnull {
82 0e3cc9f4 2004-04-19 devnull char *name;
83 0e3cc9f4 2004-04-19 devnull char *file;
84 0e3cc9f4 2004-04-19 devnull uchar *p;
85 0e3cc9f4 2004-04-19 devnull int fd;
86 0e3cc9f4 2004-04-19 devnull int pid;
87 0e3cc9f4 2004-04-19 devnull ulong base;
88 0e3cc9f4 2004-04-19 devnull ulong size;
89 0e3cc9f4 2004-04-19 devnull ulong offset;
90 0e3cc9f4 2004-04-19 devnull int (*rw)(Map*, Seg*, ulong, void*, uint, int);
91 0e3cc9f4 2004-04-19 devnull };
92 0e3cc9f4 2004-04-19 devnull
93 0e3cc9f4 2004-04-19 devnull struct Map
94 0e3cc9f4 2004-04-19 devnull {
95 0e3cc9f4 2004-04-19 devnull int nseg;
96 0e3cc9f4 2004-04-19 devnull Seg *seg;
97 0e3cc9f4 2004-04-19 devnull };
98 0e3cc9f4 2004-04-19 devnull
99 0e3cc9f4 2004-04-19 devnull struct Regs
100 0e3cc9f4 2004-04-19 devnull {
101 0e3cc9f4 2004-04-19 devnull int (*rw)(Regs*, char*, ulong*, int);
102 0e3cc9f4 2004-04-19 devnull };
103 0e3cc9f4 2004-04-19 devnull
104 0e3cc9f4 2004-04-19 devnull typedef struct UregRegs UregRegs;
105 0e3cc9f4 2004-04-19 devnull struct UregRegs
106 0e3cc9f4 2004-04-19 devnull {
107 0e3cc9f4 2004-04-19 devnull Regs r;
108 0e3cc9f4 2004-04-19 devnull uchar *ureg;
109 0e3cc9f4 2004-04-19 devnull };
110 0e3cc9f4 2004-04-19 devnull int _uregrw(Regs*, char*, ulong*, int);
111 0e3cc9f4 2004-04-19 devnull
112 0e3cc9f4 2004-04-19 devnull typedef struct PidRegs PidRegs;
113 0e3cc9f4 2004-04-19 devnull struct PidRegs
114 0e3cc9f4 2004-04-19 devnull {
115 0e3cc9f4 2004-04-19 devnull Regs r;
116 0e3cc9f4 2004-04-19 devnull int pid;
117 0e3cc9f4 2004-04-19 devnull };
118 0e3cc9f4 2004-04-19 devnull
119 0e3cc9f4 2004-04-19 devnull Map* allocmap(void);
120 0e3cc9f4 2004-04-19 devnull int addseg(Map *map, Seg seg);
121 0e3cc9f4 2004-04-19 devnull int findseg(Map *map, char *name, char *file);
122 0e3cc9f4 2004-04-19 devnull int addrtoseg(Map *map, ulong addr, Seg *seg);
123 0e3cc9f4 2004-04-19 devnull int addrtosegafter(Map *map, ulong addr, Seg *seg);
124 0e3cc9f4 2004-04-19 devnull void removeseg(Map *map, int i);
125 0e3cc9f4 2004-04-19 devnull void freemap(Map*);
126 0e3cc9f4 2004-04-19 devnull
127 0e3cc9f4 2004-04-19 devnull int get1(Map *map, ulong addr, uchar *a, uint n);
128 0e3cc9f4 2004-04-19 devnull int get2(Map *map, ulong addr, u16int *u);
129 0e3cc9f4 2004-04-19 devnull int get4(Map *map, ulong addr, u32int *u);
130 0e3cc9f4 2004-04-19 devnull int get8(Map *map, ulong addr, u64int *u);
131 0e3cc9f4 2004-04-19 devnull
132 0e3cc9f4 2004-04-19 devnull int put1(Map *map, ulong addr, uchar *a, uint n);
133 0e3cc9f4 2004-04-19 devnull int put2(Map *map, ulong addr, u16int u);
134 0e3cc9f4 2004-04-19 devnull int put4(Map *map, ulong addr, u32int u);
135 0e3cc9f4 2004-04-19 devnull int put8(Map *map, ulong addr, u64int u);
136 0e3cc9f4 2004-04-19 devnull
137 0e3cc9f4 2004-04-19 devnull int rget(Regs*, char*, ulong*);
138 0e3cc9f4 2004-04-19 devnull int rput(Regs*, char*, ulong);
139 0e3cc9f4 2004-04-19 devnull
140 0e3cc9f4 2004-04-19 devnull /*
141 0e3cc9f4 2004-04-19 devnull * A location is either a memory address or a register.
142 0e3cc9f4 2004-04-19 devnull * It is useful to be able to specify constant values that
143 0e3cc9f4 2004-04-19 devnull * originate from outside the register set and memory,
144 0e3cc9f4 2004-04-19 devnull * hence LCONST. If the register values are known, then
145 0e3cc9f4 2004-04-19 devnull * we can dispense with LOFFSET, but it's useful to be able
146 0e3cc9f4 2004-04-19 devnull * to look up local symbols (via findlsym) with locations
147 0e3cc9f4 2004-04-19 devnull * like 8(BP).
148 0e3cc9f4 2004-04-19 devnull *
149 0e3cc9f4 2004-04-19 devnull * loc.c
150 0e3cc9f4 2004-04-19 devnull */
151 0e3cc9f4 2004-04-19 devnull
152 0e3cc9f4 2004-04-19 devnull enum
153 0e3cc9f4 2004-04-19 devnull {
154 0e3cc9f4 2004-04-19 devnull /* location type */
155 0e3cc9f4 2004-04-19 devnull LNONE,
156 0e3cc9f4 2004-04-19 devnull LREG, /* register */
157 0e3cc9f4 2004-04-19 devnull LADDR, /* absolute address */
158 0e3cc9f4 2004-04-19 devnull LCONST, /* constant (an anonymous readonly location) */
159 cbeb0b26 2006-04-01 devnull LOFFSET /* dereference offset + register ptr */
160 0e3cc9f4 2004-04-19 devnull };
161 0e3cc9f4 2004-04-19 devnull
162 0e3cc9f4 2004-04-19 devnull struct Loc
163 0e3cc9f4 2004-04-19 devnull {
164 0e3cc9f4 2004-04-19 devnull uint type; /* LNONE, ... */
165 0e3cc9f4 2004-04-19 devnull char *reg; /* LREG */
166 0e3cc9f4 2004-04-19 devnull ulong addr; /* LADDR, CONST */
167 0e3cc9f4 2004-04-19 devnull long offset; /* LOFFSET */
168 0e3cc9f4 2004-04-19 devnull };
169 0e3cc9f4 2004-04-19 devnull
170 0e3cc9f4 2004-04-19 devnull int lget1(Map *map, Regs *regs, Loc loc, uchar *a, uint n);
171 0e3cc9f4 2004-04-19 devnull int lget2(Map *map, Regs *regs, Loc loc, u16int *v);
172 0e3cc9f4 2004-04-19 devnull int lget4(Map *map, Regs *regs, Loc loc, u32int *v);
173 0e3cc9f4 2004-04-19 devnull int lget8(Map *map, Regs *regs, Loc loc, u64int *v);
174 0e3cc9f4 2004-04-19 devnull
175 0e3cc9f4 2004-04-19 devnull int lput1(Map *map, Regs *regs, Loc loc, uchar *a, uint n);
176 0e3cc9f4 2004-04-19 devnull int lput2(Map *map, Regs *regs, Loc loc, u16int v);
177 0e3cc9f4 2004-04-19 devnull int lput4(Map *map, Regs *regs, Loc loc, u32int v);
178 0e3cc9f4 2004-04-19 devnull int lput8(Map *map, Regs *regs, Loc loc, u64int v);
179 0e3cc9f4 2004-04-19 devnull
180 0e3cc9f4 2004-04-19 devnull Loc locnone(void);
181 0e3cc9f4 2004-04-19 devnull Loc locaddr(ulong addr);
182 0e3cc9f4 2004-04-19 devnull Loc locconst(ulong con);
183 0e3cc9f4 2004-04-19 devnull Loc locreg(char*);
184 0e3cc9f4 2004-04-19 devnull Loc locindir(char*, long);
185 0e3cc9f4 2004-04-19 devnull
186 0e3cc9f4 2004-04-19 devnull /*
187 0e3cc9f4 2004-04-19 devnull * Executable file parsing.
188 0e3cc9f4 2004-04-19 devnull *
189 0e3cc9f4 2004-04-19 devnull * An Fhdr represents an open file image.
190 0e3cc9f4 2004-04-19 devnull * The contents are a grab bag of constants used for the
191 0e3cc9f4 2004-04-19 devnull * various file types. Not all elements are used by all
192 0e3cc9f4 2004-04-19 devnull * file types.
193 0e3cc9f4 2004-04-19 devnull *
194 0e3cc9f4 2004-04-19 devnull * crackadotplan9.c crackadotunix.c
195 0e3cc9f4 2004-04-19 devnull * crackelf.c crackdwarf.c
196 0e3cc9f4 2004-04-19 devnull */
197 0e3cc9f4 2004-04-19 devnull enum
198 0e3cc9f4 2004-04-19 devnull {
199 0e3cc9f4 2004-04-19 devnull /* file types */
200 0e3cc9f4 2004-04-19 devnull FNONE,
201 0e3cc9f4 2004-04-19 devnull FEXEC, /* executable image */
202 0e3cc9f4 2004-04-19 devnull FLIB, /* library */
203 0e3cc9f4 2004-04-19 devnull FOBJ, /* object file */
204 0e3cc9f4 2004-04-19 devnull FRELOC, /* relocatable executable */
205 0e3cc9f4 2004-04-19 devnull FSHLIB, /* shared library */
206 0e3cc9f4 2004-04-19 devnull FSHOBJ, /* shared object */
207 0e3cc9f4 2004-04-19 devnull FCORE, /* core dump */
208 0e3cc9f4 2004-04-19 devnull FBOOT, /* bootable image */
209 0e3cc9f4 2004-04-19 devnull FKERNEL, /* kernel image */
210 0e3cc9f4 2004-04-19 devnull NFTYPE,
211 0e3cc9f4 2004-04-19 devnull
212 0e3cc9f4 2004-04-19 devnull /* abi types */
213 0e3cc9f4 2004-04-19 devnull ANONE = 0,
214 0e3cc9f4 2004-04-19 devnull APLAN9,
215 0e3cc9f4 2004-04-19 devnull ALINUX,
216 0e3cc9f4 2004-04-19 devnull AFREEBSD,
217 0e3cc9f4 2004-04-19 devnull AMACH,
218 0e3cc9f4 2004-04-19 devnull NATYPE
219 0e3cc9f4 2004-04-19 devnull };
220 0e3cc9f4 2004-04-19 devnull
221 0e3cc9f4 2004-04-19 devnull /* I wish this could be kept in stabs.h */
222 0e3cc9f4 2004-04-19 devnull struct Stab
223 0e3cc9f4 2004-04-19 devnull {
224 0e3cc9f4 2004-04-19 devnull uchar *stabbase;
225 0e3cc9f4 2004-04-19 devnull uint stabsize;
226 0e3cc9f4 2004-04-19 devnull char *strbase;
227 0e3cc9f4 2004-04-19 devnull uint strsize;
228 0e3cc9f4 2004-04-19 devnull u16int (*e2)(uchar*);
229 0e3cc9f4 2004-04-19 devnull u32int (*e4)(uchar*);
230 0e3cc9f4 2004-04-19 devnull };
231 0e3cc9f4 2004-04-19 devnull
232 0e3cc9f4 2004-04-19 devnull struct Fhdr
233 0e3cc9f4 2004-04-19 devnull {
234 0e3cc9f4 2004-04-19 devnull int fd; /* file descriptor */
235 0e3cc9f4 2004-04-19 devnull char *filename; /* file name */
236 0e3cc9f4 2004-04-19 devnull Mach *mach; /* machine */
237 0e3cc9f4 2004-04-19 devnull char *mname; /* 386, power, ... */
238 0e3cc9f4 2004-04-19 devnull uint mtype; /* machine type M386, ... */
239 0e3cc9f4 2004-04-19 devnull char *fname; /* core, executable, boot image, ... */
240 0e3cc9f4 2004-04-19 devnull uint ftype; /* file type FCORE, ... */
241 0e3cc9f4 2004-04-19 devnull char *aname; /* abi name */
242 0e3cc9f4 2004-04-19 devnull uint atype; /* abi type ALINUX, ... */
243 0e3cc9f4 2004-04-19 devnull
244 0e3cc9f4 2004-04-19 devnull ulong magic; /* magic number */
245 0e3cc9f4 2004-04-19 devnull ulong txtaddr; /* text address */
246 0e3cc9f4 2004-04-19 devnull ulong entry; /* entry point */
247 0e3cc9f4 2004-04-19 devnull ulong txtsz; /* text size */
248 0e3cc9f4 2004-04-19 devnull ulong txtoff; /* text offset in file */
249 0e3cc9f4 2004-04-19 devnull ulong dataddr; /* data address */
250 0e3cc9f4 2004-04-19 devnull ulong datsz; /* data size */
251 0e3cc9f4 2004-04-19 devnull ulong datoff; /* data offset in file */
252 0e3cc9f4 2004-04-19 devnull ulong bsssz; /* bss size */
253 0e3cc9f4 2004-04-19 devnull ulong symsz; /* symbol table size */
254 0e3cc9f4 2004-04-19 devnull ulong symoff; /* symbol table offset in file */
255 0e3cc9f4 2004-04-19 devnull ulong sppcsz; /* size of sp-pc table */
256 0e3cc9f4 2004-04-19 devnull ulong sppcoff; /* offset of sp-pc table in file */
257 0e3cc9f4 2004-04-19 devnull ulong lnpcsz; /* size of line number-pc table */
258 0e3cc9f4 2004-04-19 devnull ulong lnpcoff; /* size of line number-pc table */
259 0e3cc9f4 2004-04-19 devnull void *elf; /* handle to elf image */
260 0e3cc9f4 2004-04-19 devnull void *dwarf; /* handle to dwarf image */
261 0e3cc9f4 2004-04-19 devnull void *macho; /* handle to mach-o image */
262 0e3cc9f4 2004-04-19 devnull struct Stab stabs;
263 28125cbd 2005-01-23 devnull uint pid; /* for core files */
264 28125cbd 2005-01-23 devnull char *prog; /* program name, for core files */
265 28125cbd 2005-01-23 devnull char *cmdline; /* command-line that produced core */
266 28125cbd 2005-01-23 devnull struct { /* thread state for core files */
267 28125cbd 2005-01-23 devnull uint id;
268 28125cbd 2005-01-23 devnull void *ureg;
269 28125cbd 2005-01-23 devnull } *thread;
270 28125cbd 2005-01-23 devnull uint nthread;
271 0e3cc9f4 2004-04-19 devnull
272 0e3cc9f4 2004-04-19 devnull /* private */
273 0e3cc9f4 2004-04-19 devnull Symbol *sym; /* cached list of symbols */
274 0e3cc9f4 2004-04-19 devnull Symbol **byname;
275 72dd4491 2005-11-29 devnull Symbol **byxname;
276 0e3cc9f4 2004-04-19 devnull uint nsym;
277 0e3cc9f4 2004-04-19 devnull Symbol *esym; /* elf symbols */
278 0e3cc9f4 2004-04-19 devnull uint nesym;
279 0e3cc9f4 2004-04-19 devnull ulong base; /* base address for relocatables */
280 0e3cc9f4 2004-04-19 devnull Fhdr *next; /* link to next fhdr (internal) */
281 0e3cc9f4 2004-04-19 devnull
282 0e3cc9f4 2004-04-19 devnull /* file mapping */
283 0e3cc9f4 2004-04-19 devnull int (*map)(Fhdr*, ulong, Map*, Regs**);
284 0e3cc9f4 2004-04-19 devnull
285 0e3cc9f4 2004-04-19 devnull /* debugging symbol access; see below */
286 0e3cc9f4 2004-04-19 devnull int (*syminit)(Fhdr*);
287 0e3cc9f4 2004-04-19 devnull void (*symclose)(Fhdr*);
288 0e3cc9f4 2004-04-19 devnull
289 0e3cc9f4 2004-04-19 devnull int (*pc2file)(Fhdr*, ulong, char*, uint, ulong*);
290 0e3cc9f4 2004-04-19 devnull int (*file2pc)(Fhdr*, char*, ulong, ulong*);
291 0e3cc9f4 2004-04-19 devnull int (*line2pc)(Fhdr*, ulong, ulong, ulong*);
292 0e3cc9f4 2004-04-19 devnull
293 0e3cc9f4 2004-04-19 devnull int (*lookuplsym)(Fhdr*, Symbol*, char*, Symbol*);
294 0e3cc9f4 2004-04-19 devnull int (*indexlsym)(Fhdr*, Symbol*, uint, Symbol*);
295 0e3cc9f4 2004-04-19 devnull int (*findlsym)(Fhdr*, Symbol*, Loc, Symbol*);
296 0e3cc9f4 2004-04-19 devnull
297 cdf18051 2004-12-25 devnull int (*unwind)(Fhdr*, Map*, Regs*, ulong*, Symbol*);
298 0e3cc9f4 2004-04-19 devnull };
299 0e3cc9f4 2004-04-19 devnull
300 0e3cc9f4 2004-04-19 devnull Fhdr* crackhdr(char *file, int mode);
301 0e3cc9f4 2004-04-19 devnull void uncrackhdr(Fhdr *hdr);
302 0e3cc9f4 2004-04-19 devnull int crackelf(int fd, Fhdr *hdr);
303 0e3cc9f4 2004-04-19 devnull int crackmacho(int fd, Fhdr *hdr);
304 28125cbd 2005-01-23 devnull Regs* coreregs(Fhdr*, uint);
305 0e3cc9f4 2004-04-19 devnull
306 8b549a62 2005-01-07 devnull int symopen(Fhdr*);
307 0e3cc9f4 2004-04-19 devnull int symdwarf(Fhdr*);
308 0e3cc9f4 2004-04-19 devnull int symelf(Fhdr*);
309 0e3cc9f4 2004-04-19 devnull int symstabs(Fhdr*);
310 0e3cc9f4 2004-04-19 devnull int symmacho(Fhdr*);
311 8b549a62 2005-01-07 devnull void symclose(Fhdr*);
312 0e3cc9f4 2004-04-19 devnull
313 0e3cc9f4 2004-04-19 devnull int mapfile(Fhdr *fp, ulong base, Map *map, Regs **regs);
314 0e3cc9f4 2004-04-19 devnull void unmapfile(Fhdr *fp, Map *map);
315 0e3cc9f4 2004-04-19 devnull
316 0e3cc9f4 2004-04-19 devnull /*
317 0e3cc9f4 2004-04-19 devnull * Process manipulation.
318 0e3cc9f4 2004-04-19 devnull */
319 0e3cc9f4 2004-04-19 devnull int mapproc(int pid, Map *map, Regs **regs);
320 0e3cc9f4 2004-04-19 devnull void unmapproc(Map *map);
321 0e3cc9f4 2004-04-19 devnull int detachproc(int pid);
322 0e3cc9f4 2004-04-19 devnull int ctlproc(int pid, char *msg);
323 0e3cc9f4 2004-04-19 devnull int procnotes(int pid, char ***notes);
324 0e3cc9f4 2004-04-19 devnull char* proctextfile(int pid);
325 0e3cc9f4 2004-04-19 devnull
326 0e3cc9f4 2004-04-19 devnull /*
327 cdf18051 2004-12-25 devnull * Command-line debugger help
328 cdf18051 2004-12-25 devnull */
329 cdf18051 2004-12-25 devnull extern Fhdr *symhdr;
330 cdf18051 2004-12-25 devnull extern Fhdr *corhdr;
331 cdf18051 2004-12-25 devnull extern char *symfil;
332 cdf18051 2004-12-25 devnull extern char *corfil;
333 cdf18051 2004-12-25 devnull extern int corpid;
334 cdf18051 2004-12-25 devnull extern Regs *correg;
335 cdf18051 2004-12-25 devnull extern Map *symmap;
336 cdf18051 2004-12-25 devnull extern Map *cormap;
337 cdf18051 2004-12-25 devnull
338 cdf18051 2004-12-25 devnull int attachproc(int pid);
339 cdf18051 2004-12-25 devnull int attachcore(Fhdr *hdr);
340 28125cbd 2005-01-23 devnull int attachargs(int argc, char **argv, int omode, int);
341 28125cbd 2005-01-23 devnull int attachdynamic(int);
342 cdf18051 2004-12-25 devnull /*
343 0e3cc9f4 2004-04-19 devnull * Machine descriptions.
344 0e3cc9f4 2004-04-19 devnull *
345 0e3cc9f4 2004-04-19 devnull * mach.c
346 0e3cc9f4 2004-04-19 devnull * mach386.c dis386.c
347 0e3cc9f4 2004-04-19 devnull * machsparc.c dissparc.c
348 0e3cc9f4 2004-04-19 devnull * ...
349 0e3cc9f4 2004-04-19 devnull */
350 0e3cc9f4 2004-04-19 devnull
351 0e3cc9f4 2004-04-19 devnull /*
352 0e3cc9f4 2004-04-19 devnull * Register sets. The Regs are opaque, accessed by using
353 0e3cc9f4 2004-04-19 devnull * the reglist (and really the accessor functions).
354 0e3cc9f4 2004-04-19 devnull */
355 0e3cc9f4 2004-04-19 devnull enum
356 0e3cc9f4 2004-04-19 devnull {
357 0e3cc9f4 2004-04-19 devnull /* must be big enough for all machine register sets */
358 0e3cc9f4 2004-04-19 devnull REGSIZE = 256,
359 0e3cc9f4 2004-04-19 devnull
360 0e3cc9f4 2004-04-19 devnull RINT = 0<<0,
361 0e3cc9f4 2004-04-19 devnull RFLT = 1<<0,
362 cbeb0b26 2006-04-01 devnull RRDONLY = 1<<1
363 0e3cc9f4 2004-04-19 devnull };
364 0e3cc9f4 2004-04-19 devnull
365 0e3cc9f4 2004-04-19 devnull struct Regdesc
366 0e3cc9f4 2004-04-19 devnull {
367 0e3cc9f4 2004-04-19 devnull char *name; /* register name */
368 0e3cc9f4 2004-04-19 devnull uint offset; /* offset in b */
369 0e3cc9f4 2004-04-19 devnull uint flags; /* RINT/RFLT/RRDONLY */
370 0e3cc9f4 2004-04-19 devnull uint format; /* print format: 'x', 'X', 'f', 'z', 'Z' */
371 0e3cc9f4 2004-04-19 devnull };
372 0e3cc9f4 2004-04-19 devnull
373 0e3cc9f4 2004-04-19 devnull enum
374 0e3cc9f4 2004-04-19 devnull {
375 0e3cc9f4 2004-04-19 devnull /* machine types */
376 0e3cc9f4 2004-04-19 devnull MNONE,
377 0e3cc9f4 2004-04-19 devnull MMIPS, /* MIPS R3000 */
378 0e3cc9f4 2004-04-19 devnull MSPARC, /* SUN SPARC */
379 0e3cc9f4 2004-04-19 devnull M68000, /* Motorola 68000 */
380 0e3cc9f4 2004-04-19 devnull M386, /* Intel 32-bit x86*/
381 0e3cc9f4 2004-04-19 devnull M960, /* Intel 960 */
382 0e3cc9f4 2004-04-19 devnull M3210, /* AT&T 3210 DSP */
383 0e3cc9f4 2004-04-19 devnull MMIPS2, /* MIPS R4000 */
384 0e3cc9f4 2004-04-19 devnull M29000, /* AMD 29000 */
385 0e3cc9f4 2004-04-19 devnull MARM, /* ARM */
386 0e3cc9f4 2004-04-19 devnull MPOWER, /* PowerPC */
387 0e3cc9f4 2004-04-19 devnull MALPHA, /* DEC/Compaq Alpha */
388 0e3cc9f4 2004-04-19 devnull NMTYPE
389 0e3cc9f4 2004-04-19 devnull };
390 0e3cc9f4 2004-04-19 devnull
391 0e3cc9f4 2004-04-19 devnull struct Mach
392 0e3cc9f4 2004-04-19 devnull {
393 0e3cc9f4 2004-04-19 devnull char *name; /* "386", ... */
394 0e3cc9f4 2004-04-19 devnull uint type; /* M386, ... */
395 0e3cc9f4 2004-04-19 devnull Regdesc *reglist; /* register set */
396 0e3cc9f4 2004-04-19 devnull uint regsize; /* size of register set in bytes */
397 0e3cc9f4 2004-04-19 devnull uint fpregsize; /* size of fp register set in bytes */
398 0e3cc9f4 2004-04-19 devnull char *pc; /* name of program counter */
399 0e3cc9f4 2004-04-19 devnull char *sp; /* name of stack pointer */
400 0e3cc9f4 2004-04-19 devnull char *fp; /* name of frame pointer */
401 0e3cc9f4 2004-04-19 devnull char *link; /* name of link register */
402 0e3cc9f4 2004-04-19 devnull char *sbreg; /* name of static base */
403 0e3cc9f4 2004-04-19 devnull ulong sb; /* value of static base */
404 0e3cc9f4 2004-04-19 devnull uint pgsize; /* page size */
405 0e3cc9f4 2004-04-19 devnull ulong kbase; /* kernel base address for Plan 9 */
406 0e3cc9f4 2004-04-19 devnull ulong ktmask; /* ktzero = kbase & ~ktmask */
407 0e3cc9f4 2004-04-19 devnull uint pcquant; /* pc quantum */
408 0e3cc9f4 2004-04-19 devnull uint szaddr; /* size of pointer in bytes */
409 0e3cc9f4 2004-04-19 devnull uint szreg; /* size of integer register */
410 0e3cc9f4 2004-04-19 devnull uint szfloat; /* size of float */
411 0e3cc9f4 2004-04-19 devnull uint szdouble; /* size of double */
412 0e3cc9f4 2004-04-19 devnull char** windreg; /* unwinding registers */
413 0e3cc9f4 2004-04-19 devnull uint nwindreg;
414 0e3cc9f4 2004-04-19 devnull
415 0e3cc9f4 2004-04-19 devnull uchar bpinst[4]; /* break point instruction */
416 0e3cc9f4 2004-04-19 devnull uint bpsize; /* size of bp instruction */
417 0e3cc9f4 2004-04-19 devnull
418 0e3cc9f4 2004-04-19 devnull int (*foll)(Map*, Regs*, ulong, ulong*); /* follow set */
419 0e3cc9f4 2004-04-19 devnull char* (*exc)(Map*, Regs*); /* last exception */
420 cdf18051 2004-12-25 devnull int (*unwind)(Map*, Regs*, ulong*, Symbol*);
421 0e3cc9f4 2004-04-19 devnull
422 0e3cc9f4 2004-04-19 devnull /* cvt to local byte order */
423 0e3cc9f4 2004-04-19 devnull u16int (*swap2)(u16int);
424 0e3cc9f4 2004-04-19 devnull u32int (*swap4)(u32int);
425 0e3cc9f4 2004-04-19 devnull u64int (*swap8)(u64int);
426 0e3cc9f4 2004-04-19 devnull int (*ftoa32)(char*, uint, void*);
427 0e3cc9f4 2004-04-19 devnull int (*ftoa64)(char*, uint, void*);
428 0e3cc9f4 2004-04-19 devnull int (*ftoa80)(char*, uint, void*);
429 0e3cc9f4 2004-04-19 devnull
430 0e3cc9f4 2004-04-19 devnull /* disassembly */
431 0e3cc9f4 2004-04-19 devnull int (*das)(Map*, ulong, char, char*, int); /* symbolic */
432 0e3cc9f4 2004-04-19 devnull int (*kendas)(Map*, ulong, char, char*, int); /* symbolic */
433 0e3cc9f4 2004-04-19 devnull int (*codas)(Map*, ulong, char, char*, int);
434 0e3cc9f4 2004-04-19 devnull int (*hexinst)(Map*, ulong, char*, int); /* hex */
435 0e3cc9f4 2004-04-19 devnull int (*instsize)(Map*, ulong); /* instruction size */
436 0e3cc9f4 2004-04-19 devnull };
437 0e3cc9f4 2004-04-19 devnull
438 0e3cc9f4 2004-04-19 devnull Mach *machbyname(char*);
439 0e3cc9f4 2004-04-19 devnull Mach *machbytype(uint);
440 0e3cc9f4 2004-04-19 devnull
441 0e3cc9f4 2004-04-19 devnull extern Mach mach386;
442 0e3cc9f4 2004-04-19 devnull extern Mach machsparc;
443 0e3cc9f4 2004-04-19 devnull extern Mach machmips;
444 0e3cc9f4 2004-04-19 devnull extern Mach machpower;
445 0e3cc9f4 2004-04-19 devnull
446 0e3cc9f4 2004-04-19 devnull /*
447 0e3cc9f4 2004-04-19 devnull * Debugging symbols and type information.
448 0e3cc9f4 2004-04-19 devnull * (Not all objects include type information.)
449 0e3cc9f4 2004-04-19 devnull *
450 0e3cc9f4 2004-04-19 devnull * sym.c
451 0e3cc9f4 2004-04-19 devnull */
452 0e3cc9f4 2004-04-19 devnull
453 0e3cc9f4 2004-04-19 devnull enum
454 0e3cc9f4 2004-04-19 devnull {
455 0e3cc9f4 2004-04-19 devnull /* symbol table classes */
456 0e3cc9f4 2004-04-19 devnull CNONE,
457 0e3cc9f4 2004-04-19 devnull CAUTO, /* stack variable */
458 0e3cc9f4 2004-04-19 devnull CPARAM, /* function parameter */
459 0e3cc9f4 2004-04-19 devnull CTEXT, /* text segment */
460 0e3cc9f4 2004-04-19 devnull CDATA, /* data segment */
461 cbeb0b26 2006-04-01 devnull CANY
462 0e3cc9f4 2004-04-19 devnull };
463 0e3cc9f4 2004-04-19 devnull
464 0e3cc9f4 2004-04-19 devnull struct Symbol
465 0e3cc9f4 2004-04-19 devnull {
466 0e3cc9f4 2004-04-19 devnull char *name; /* name of symbol */
467 72dd4491 2005-11-29 devnull char *xname; /* demangled name */
468 72dd4491 2005-11-29 devnull
469 0e3cc9f4 2004-04-19 devnull /* Symtype *typedesc; /* type info, if any */
470 0e3cc9f4 2004-04-19 devnull Loc loc; /* location of symbol */
471 0e3cc9f4 2004-04-19 devnull Loc hiloc; /* location of end of symbol */
472 0e3cc9f4 2004-04-19 devnull char class; /* CAUTO, ... */
473 0e3cc9f4 2004-04-19 devnull char type; /* type letter from a.out.h */
474 0e3cc9f4 2004-04-19 devnull Fhdr *fhdr; /* where did this come from? */
475 0e3cc9f4 2004-04-19 devnull uint index; /* in by-address list */
476 0e3cc9f4 2004-04-19 devnull
477 0e3cc9f4 2004-04-19 devnull /* private use by various symbol implementations */
478 0e3cc9f4 2004-04-19 devnull union {
479 0e3cc9f4 2004-04-19 devnull struct {
480 0e3cc9f4 2004-04-19 devnull uint unit;
481 0e3cc9f4 2004-04-19 devnull uint uoff;
482 0e3cc9f4 2004-04-19 devnull } dwarf;
483 0e3cc9f4 2004-04-19 devnull struct {
484 0e3cc9f4 2004-04-19 devnull uint i;
485 0e3cc9f4 2004-04-19 devnull uint locals;
486 0e3cc9f4 2004-04-19 devnull char *dir;
487 0e3cc9f4 2004-04-19 devnull char *file;
488 1c171e3a 2005-07-19 devnull schar frameptr;
489 0e3cc9f4 2004-04-19 devnull uint framesize;
490 0e3cc9f4 2004-04-19 devnull } stabs;
491 0e3cc9f4 2004-04-19 devnull } u;
492 72dd4491 2005-11-29 devnull
493 72dd4491 2005-11-29 devnull void *aux; /* for use by client */
494 0e3cc9f4 2004-04-19 devnull };
495 0e3cc9f4 2004-04-19 devnull
496 0e3cc9f4 2004-04-19 devnull /* look through all currently cracked Fhdrs calling their fns */
497 0e3cc9f4 2004-04-19 devnull int pc2file(ulong pc, char *file, uint nfile, ulong *line);
498 0e3cc9f4 2004-04-19 devnull int file2pc(char *file, ulong line, ulong *addr);
499 0e3cc9f4 2004-04-19 devnull int line2pc(ulong basepc, ulong line, ulong *pc);
500 0e3cc9f4 2004-04-19 devnull int fnbound(ulong pc, ulong *bounds);
501 0e3cc9f4 2004-04-19 devnull int fileline(ulong pc, char *a, uint n);
502 0e3cc9f4 2004-04-19 devnull int pc2line(ulong pc, ulong *line);
503 0e3cc9f4 2004-04-19 devnull
504 0e3cc9f4 2004-04-19 devnull int lookupsym(char *fn, char *var, Symbol *s);
505 0e3cc9f4 2004-04-19 devnull int indexsym(uint ndx, Symbol *s);
506 0e3cc9f4 2004-04-19 devnull int findsym(Loc loc, uint class, Symbol *s);
507 0e3cc9f4 2004-04-19 devnull int findexsym(Fhdr*, uint, Symbol*);
508 0e3cc9f4 2004-04-19 devnull
509 0e3cc9f4 2004-04-19 devnull int lookuplsym(Symbol *s1, char *name, Symbol *s2);
510 0e3cc9f4 2004-04-19 devnull int indexlsym(Symbol *s1, uint ndx, Symbol *s2);
511 0e3cc9f4 2004-04-19 devnull int findlsym(Symbol *s1, Loc loc, Symbol *s);
512 0e3cc9f4 2004-04-19 devnull int symoff(char *a, uint n, ulong addr, uint class);
513 cdf18051 2004-12-25 devnull int unwindframe(Map *map, Regs *regs, ulong *next, Symbol*);
514 0e3cc9f4 2004-04-19 devnull
515 0e3cc9f4 2004-04-19 devnull void _addhdr(Fhdr*);
516 0e3cc9f4 2004-04-19 devnull void _delhdr(Fhdr*);
517 67e4fce4 2004-04-19 devnull extern Fhdr* fhdrlist;
518 cdf18051 2004-12-25 devnull Fhdr* findhdr(char*);
519 0e3cc9f4 2004-04-19 devnull
520 0e3cc9f4 2004-04-19 devnull Symbol* flookupsym(Fhdr*, char*);
521 0e3cc9f4 2004-04-19 devnull Symbol* ffindsym(Fhdr*, Loc, uint);
522 1a0954ab 2005-01-04 devnull Symbol* _addsym(Fhdr*, Symbol*);
523 0e3cc9f4 2004-04-19 devnull
524 88c60622 2005-11-28 devnull char* demangle(char*, char*, int);
525 88c60622 2005-11-28 devnull char* demanglegcc3(char*, char*);
526 88c60622 2005-11-28 devnull char* demanglegcc2(char*, char*);
527 0e3cc9f4 2004-04-19 devnull /*
528 0e3cc9f4 2004-04-19 devnull * Stack frame walking.
529 0e3cc9f4 2004-04-19 devnull *
530 0e3cc9f4 2004-04-19 devnull * frame.c
531 0e3cc9f4 2004-04-19 devnull */
532 0e3cc9f4 2004-04-19 devnull int stacktrace(Map*, Regs*, Tracer);
533 0e3cc9f4 2004-04-19 devnull int windindex(char*);
534 0e3cc9f4 2004-04-19 devnull Loc* windreglocs(void);
535 0e3cc9f4 2004-04-19 devnull
536 0e3cc9f4 2004-04-19 devnull /*
537 0e3cc9f4 2004-04-19 devnull * Debugger help.
538 0e3cc9f4 2004-04-19 devnull */
539 0e3cc9f4 2004-04-19 devnull int localaddr(Map *map, Regs *regs, char *fn, char *var, ulong *val);
540 0e3cc9f4 2004-04-19 devnull int fpformat(Map *map, Regdesc *reg, char *a, uint n, uint code);
541 0e3cc9f4 2004-04-19 devnull char* _hexify(char*, ulong, int);
542 0e3cc9f4 2004-04-19 devnull int locfmt(Fmt*);
543 0e3cc9f4 2004-04-19 devnull int loccmp(Loc*, Loc*);
544 0e3cc9f4 2004-04-19 devnull int locsimplify(Map *map, Regs *regs, Loc loc, Loc *newloc);
545 042aca77 2005-01-07 devnull Regdesc* regdesc(char*);
546 281c90a5 2005-02-11 devnull
547 0e3cc9f4 2004-04-19 devnull extern int machdebug;
548 1a0954ab 2005-01-04 devnull #if defined(__cplusplus)
549 1a0954ab 2005-01-04 devnull }
550 1a0954ab 2005-01-04 devnull #endif
551 1a0954ab 2005-01-04 devnull #endif