Blame


1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <mach.h>
4 a84cbb2a 2004-04-19 devnull #include "elf.h"
5 a84cbb2a 2004-04-19 devnull #include "dwarf.h"
6 a84cbb2a 2004-04-19 devnull
7 a84cbb2a 2004-04-19 devnull static int mapelf(Fhdr *fp, ulong base, Map *map, Regs**);
8 a84cbb2a 2004-04-19 devnull static int mapcoreregs(Fhdr *fp, Map *map, Regs**);
9 a84cbb2a 2004-04-19 devnull
10 a84cbb2a 2004-04-19 devnull static struct
11 a84cbb2a 2004-04-19 devnull {
12 a84cbb2a 2004-04-19 devnull uint etype;
13 a84cbb2a 2004-04-19 devnull uint mtype;
14 a84cbb2a 2004-04-19 devnull Mach *mach;
15 a84cbb2a 2004-04-19 devnull char *name;
16 a84cbb2a 2004-04-19 devnull } mtab[] =
17 a84cbb2a 2004-04-19 devnull { /* Font Tab 4 */
18 a84cbb2a 2004-04-19 devnull ElfMachSparc, MSPARC, nil, "sparc",
19 a84cbb2a 2004-04-19 devnull ElfMach386, M386, &mach386, "386",
20 a84cbb2a 2004-04-19 devnull ElfMachMips, MMIPS, nil, "mips",
21 a84cbb2a 2004-04-19 devnull ElfMachArm, MARM, nil, "arm",
22 a84cbb2a 2004-04-19 devnull ElfMachPower, MPOWER, nil, "powerpc",
23 a84cbb2a 2004-04-19 devnull ElfMachPower64, MNONE, nil, "powerpc64",
24 a84cbb2a 2004-04-19 devnull };
25 a84cbb2a 2004-04-19 devnull
26 a84cbb2a 2004-04-19 devnull static struct
27 a84cbb2a 2004-04-19 devnull {
28 a84cbb2a 2004-04-19 devnull uint etype;
29 a84cbb2a 2004-04-19 devnull uint atype;
30 a84cbb2a 2004-04-19 devnull char *aname;
31 a84cbb2a 2004-04-19 devnull } atab[] =
32 a84cbb2a 2004-04-19 devnull { /* Font Tab 4 */
33 a84cbb2a 2004-04-19 devnull ElfAbiSystemV, ALINUX, "linux", /* [sic] */
34 a84cbb2a 2004-04-19 devnull ElfAbiLinux, ALINUX, "linux",
35 a84cbb2a 2004-04-19 devnull ElfAbiFreeBSD, AFREEBSD, "freebsd",
36 a84cbb2a 2004-04-19 devnull };
37 a84cbb2a 2004-04-19 devnull
38 a84cbb2a 2004-04-19 devnull static struct
39 a84cbb2a 2004-04-19 devnull {
40 a84cbb2a 2004-04-19 devnull uint mtype;
41 a84cbb2a 2004-04-19 devnull uint atype;
42 a84cbb2a 2004-04-19 devnull int (*coreregs)(Elf*, ElfNote*, uchar**);
43 1cc215aa 2004-12-25 devnull int (*corecmd)(Elf*, ElfNote*, char**);
44 a84cbb2a 2004-04-19 devnull } ctab[] =
45 a84cbb2a 2004-04-19 devnull { /* Font Tab 4 */
46 1cc215aa 2004-12-25 devnull M386, ALINUX,
47 1cc215aa 2004-12-25 devnull coreregslinux386,
48 1cc215aa 2004-12-25 devnull corecmdlinux386,
49 1cc215aa 2004-12-25 devnull M386, ANONE,
50 1cc215aa 2004-12-25 devnull coreregslinux386, /* [sic] */
51 1cc215aa 2004-12-25 devnull corecmdlinux386, /* [sic] */
52 1cc215aa 2004-12-25 devnull M386, AFREEBSD,
53 1cc215aa 2004-12-25 devnull coreregsfreebsd386,
54 1cc215aa 2004-12-25 devnull corecmdfreebsd386,
55 a84cbb2a 2004-04-19 devnull };
56 a84cbb2a 2004-04-19 devnull
57 a84cbb2a 2004-04-19 devnull int
58 a84cbb2a 2004-04-19 devnull crackelf(int fd, Fhdr *fp)
59 a84cbb2a 2004-04-19 devnull {
60 a84cbb2a 2004-04-19 devnull int i, havetext, havedata;
61 a84cbb2a 2004-04-19 devnull Elf *elf;
62 a84cbb2a 2004-04-19 devnull ElfProg *p;
63 a84cbb2a 2004-04-19 devnull ElfSect *s1, *s2;
64 a84cbb2a 2004-04-19 devnull
65 a84cbb2a 2004-04-19 devnull if((elf = elfinit(fd)) == nil)
66 a84cbb2a 2004-04-19 devnull return -1;
67 a84cbb2a 2004-04-19 devnull
68 a84cbb2a 2004-04-19 devnull fp->fd = fd;
69 a84cbb2a 2004-04-19 devnull fp->elf = elf;
70 a84cbb2a 2004-04-19 devnull fp->dwarf = dwarfopen(elf); /* okay to fail */
71 a84cbb2a 2004-04-19 devnull fp->syminit = symelf;
72 a84cbb2a 2004-04-19 devnull
73 a84cbb2a 2004-04-19 devnull if((s1 = elfsection(elf, ".stab")) != nil && s1->link!=0 && s1->link < elf->nsect){
74 a84cbb2a 2004-04-19 devnull s2 = &elf->sect[s1->link];
75 a84cbb2a 2004-04-19 devnull if(elfmap(elf, s1) >= 0 && elfmap(elf, s2) >= 0){
76 a84cbb2a 2004-04-19 devnull fp->stabs.stabbase = s1->base;
77 a84cbb2a 2004-04-19 devnull fp->stabs.stabsize = s1->size;
78 929ba9b9 2004-04-20 devnull fp->stabs.strbase = (char*)s2->base;
79 a84cbb2a 2004-04-19 devnull fp->stabs.strsize = s2->size;
80 a84cbb2a 2004-04-19 devnull fp->stabs.e2 = elf->hdr.e2;
81 a84cbb2a 2004-04-19 devnull fp->stabs.e4 = elf->hdr.e4;
82 a84cbb2a 2004-04-19 devnull }
83 a84cbb2a 2004-04-19 devnull }
84 a84cbb2a 2004-04-19 devnull
85 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(mtab); i++){
86 a84cbb2a 2004-04-19 devnull if(elf->hdr.machine != mtab[i].etype)
87 a84cbb2a 2004-04-19 devnull continue;
88 a84cbb2a 2004-04-19 devnull fp->mach = mtab[i].mach;
89 a84cbb2a 2004-04-19 devnull fp->mname = mtab[i].name;
90 a84cbb2a 2004-04-19 devnull fp->mtype = mtab[i].mtype;
91 a84cbb2a 2004-04-19 devnull break;
92 a84cbb2a 2004-04-19 devnull }
93 a84cbb2a 2004-04-19 devnull if(i == nelem(mtab)){
94 a84cbb2a 2004-04-19 devnull werrstr("unsupported machine type %d", elf->hdr.machine);
95 a84cbb2a 2004-04-19 devnull goto err;
96 a84cbb2a 2004-04-19 devnull }
97 a84cbb2a 2004-04-19 devnull
98 a84cbb2a 2004-04-19 devnull if(mach == nil)
99 a84cbb2a 2004-04-19 devnull mach = fp->mach;
100 a84cbb2a 2004-04-19 devnull
101 a84cbb2a 2004-04-19 devnull fp->aname = "unknown";
102 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(atab); i++){
103 a84cbb2a 2004-04-19 devnull if(elf->hdr.abi != atab[i].etype)
104 a84cbb2a 2004-04-19 devnull continue;
105 a84cbb2a 2004-04-19 devnull fp->atype = atab[i].atype;
106 a84cbb2a 2004-04-19 devnull fp->aname = atab[i].aname;
107 a84cbb2a 2004-04-19 devnull break;
108 a84cbb2a 2004-04-19 devnull }
109 a84cbb2a 2004-04-19 devnull
110 a84cbb2a 2004-04-19 devnull switch(elf->hdr.type){
111 a84cbb2a 2004-04-19 devnull default:
112 a84cbb2a 2004-04-19 devnull werrstr("unknown file type %d", elf->hdr.type);
113 a84cbb2a 2004-04-19 devnull goto err;
114 a84cbb2a 2004-04-19 devnull case ElfTypeExecutable:
115 a84cbb2a 2004-04-19 devnull fp->ftype = FEXEC;
116 a84cbb2a 2004-04-19 devnull fp->fname = "executable";
117 a84cbb2a 2004-04-19 devnull break;
118 a84cbb2a 2004-04-19 devnull case ElfTypeRelocatable:
119 a84cbb2a 2004-04-19 devnull fp->ftype = FRELOC;
120 a84cbb2a 2004-04-19 devnull fp->fname = "relocatable";
121 a84cbb2a 2004-04-19 devnull break;
122 a84cbb2a 2004-04-19 devnull case ElfTypeSharedObject:
123 a84cbb2a 2004-04-19 devnull fp->ftype = FSHOBJ;
124 a84cbb2a 2004-04-19 devnull fp->fname = "shared object";
125 a84cbb2a 2004-04-19 devnull break;
126 a84cbb2a 2004-04-19 devnull case ElfTypeCore:
127 a84cbb2a 2004-04-19 devnull fp->ftype = FCORE;
128 a84cbb2a 2004-04-19 devnull fp->fname = "core dump";
129 a84cbb2a 2004-04-19 devnull break;
130 a84cbb2a 2004-04-19 devnull }
131 a84cbb2a 2004-04-19 devnull
132 a84cbb2a 2004-04-19 devnull fp->map = mapelf;
133 a84cbb2a 2004-04-19 devnull
134 a84cbb2a 2004-04-19 devnull if(fp->ftype == FCORE){
135 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(ctab); i++){
136 a84cbb2a 2004-04-19 devnull if(ctab[i].atype != fp->atype
137 a84cbb2a 2004-04-19 devnull || ctab[i].mtype != fp->mtype)
138 a84cbb2a 2004-04-19 devnull continue;
139 a84cbb2a 2004-04-19 devnull elf->coreregs = ctab[i].coreregs;
140 a84cbb2a 2004-04-19 devnull break;
141 a84cbb2a 2004-04-19 devnull }
142 a84cbb2a 2004-04-19 devnull return 0;
143 a84cbb2a 2004-04-19 devnull }
144 a84cbb2a 2004-04-19 devnull
145 a84cbb2a 2004-04-19 devnull fp->entry = elf->hdr.entry;
146 a84cbb2a 2004-04-19 devnull
147 a84cbb2a 2004-04-19 devnull /* First r-x section we find is the text and initialized data */
148 a84cbb2a 2004-04-19 devnull /* First rw- section we find is the r/w data */
149 a84cbb2a 2004-04-19 devnull havetext = 0;
150 a84cbb2a 2004-04-19 devnull havedata = 0;
151 a84cbb2a 2004-04-19 devnull for(i=0; i<elf->nprog; i++){
152 a84cbb2a 2004-04-19 devnull p = &elf->prog[i];
153 a84cbb2a 2004-04-19 devnull if(p->type != ElfProgLoad)
154 a84cbb2a 2004-04-19 devnull continue;
155 a84cbb2a 2004-04-19 devnull if(!havetext && p->flags == (ElfProgFlagRead|ElfProgFlagExec) && p->align >= mach->pgsize){
156 a84cbb2a 2004-04-19 devnull havetext = 1;
157 a84cbb2a 2004-04-19 devnull fp->txtaddr = p->vaddr;
158 a84cbb2a 2004-04-19 devnull fp->txtsz = p->memsz;
159 a84cbb2a 2004-04-19 devnull fp->txtoff = p->offset;
160 a84cbb2a 2004-04-19 devnull }
161 a84cbb2a 2004-04-19 devnull if(!havedata && p->flags == (ElfProgFlagRead|ElfProgFlagWrite) && p->align >= mach->pgsize){
162 a84cbb2a 2004-04-19 devnull havedata = 1;
163 a84cbb2a 2004-04-19 devnull fp->dataddr = p->vaddr;
164 a84cbb2a 2004-04-19 devnull fp->datsz = p->filesz;
165 a84cbb2a 2004-04-19 devnull fp->datoff = p->offset;
166 a84cbb2a 2004-04-19 devnull fp->bsssz = p->memsz - p->filesz;
167 a84cbb2a 2004-04-19 devnull }
168 a84cbb2a 2004-04-19 devnull }
169 a84cbb2a 2004-04-19 devnull if(!havetext){
170 a84cbb2a 2004-04-19 devnull werrstr("did not find text segment in elf binary");
171 a84cbb2a 2004-04-19 devnull goto err;
172 a84cbb2a 2004-04-19 devnull }
173 a84cbb2a 2004-04-19 devnull if(!havedata){
174 a84cbb2a 2004-04-19 devnull werrstr("did not find data segment in elf binary");
175 a84cbb2a 2004-04-19 devnull goto err;
176 a84cbb2a 2004-04-19 devnull }
177 a84cbb2a 2004-04-19 devnull return 0;
178 a84cbb2a 2004-04-19 devnull
179 a84cbb2a 2004-04-19 devnull err:
180 a84cbb2a 2004-04-19 devnull elfclose(elf);
181 a84cbb2a 2004-04-19 devnull return -1;
182 a84cbb2a 2004-04-19 devnull }
183 a84cbb2a 2004-04-19 devnull
184 a84cbb2a 2004-04-19 devnull static int
185 a84cbb2a 2004-04-19 devnull mapelf(Fhdr *fp, ulong base, Map *map, Regs **regs)
186 a84cbb2a 2004-04-19 devnull {
187 a84cbb2a 2004-04-19 devnull int i;
188 a84cbb2a 2004-04-19 devnull Elf *elf;
189 a84cbb2a 2004-04-19 devnull ElfProg *p;
190 a84cbb2a 2004-04-19 devnull ulong sz;
191 a84cbb2a 2004-04-19 devnull ulong lim;
192 a84cbb2a 2004-04-19 devnull Seg s;
193 a84cbb2a 2004-04-19 devnull
194 a84cbb2a 2004-04-19 devnull elf = fp->elf;
195 a84cbb2a 2004-04-19 devnull if(elf == nil){
196 a84cbb2a 2004-04-19 devnull werrstr("not an elf file");
197 a84cbb2a 2004-04-19 devnull return -1;
198 a84cbb2a 2004-04-19 devnull }
199 a84cbb2a 2004-04-19 devnull
200 a84cbb2a 2004-04-19 devnull for(i=0; i<elf->nprog; i++){
201 a84cbb2a 2004-04-19 devnull p = &elf->prog[i];
202 a84cbb2a 2004-04-19 devnull if(p->type != ElfProgLoad)
203 a84cbb2a 2004-04-19 devnull continue;
204 a84cbb2a 2004-04-19 devnull if(p->align < mach->pgsize)
205 a84cbb2a 2004-04-19 devnull continue;
206 a84cbb2a 2004-04-19 devnull if(p->filesz){
207 a84cbb2a 2004-04-19 devnull memset(&s, 0, sizeof s);
208 a84cbb2a 2004-04-19 devnull s.file = fp->filename;
209 a84cbb2a 2004-04-19 devnull s.fd = fp->fd;
210 a84cbb2a 2004-04-19 devnull if(fp->ftype == FCORE)
211 a84cbb2a 2004-04-19 devnull s.name = "core";
212 a84cbb2a 2004-04-19 devnull else if(p->flags == 5)
213 a84cbb2a 2004-04-19 devnull s.name = "text";
214 a84cbb2a 2004-04-19 devnull else
215 a84cbb2a 2004-04-19 devnull s.name = "data";
216 a84cbb2a 2004-04-19 devnull s.base = base+p->vaddr;
217 a84cbb2a 2004-04-19 devnull s.size = p->filesz;
218 a84cbb2a 2004-04-19 devnull s.offset = p->offset;
219 a84cbb2a 2004-04-19 devnull if(addseg(map, s) < 0)
220 a84cbb2a 2004-04-19 devnull return -1;
221 a84cbb2a 2004-04-19 devnull }
222 a84cbb2a 2004-04-19 devnull /*
223 a84cbb2a 2004-04-19 devnull * If memsz > filesz, we're supposed to zero fill.
224 a84cbb2a 2004-04-19 devnull * Core files have zeroed sections where the pages
225 a84cbb2a 2004-04-19 devnull * can be filled in from the text file, so if this is a core
226 a84cbb2a 2004-04-19 devnull * we only fill in that which isn't yet mapped.
227 a84cbb2a 2004-04-19 devnull */
228 a84cbb2a 2004-04-19 devnull if(fp->ftype == FCORE){
229 a84cbb2a 2004-04-19 devnull sz = p->filesz;
230 a84cbb2a 2004-04-19 devnull while(sz < p->memsz){
231 a84cbb2a 2004-04-19 devnull if(addrtoseg(map, base+p->vaddr+sz, &s) < 0){
232 a84cbb2a 2004-04-19 devnull lim = base + p->vaddr + p->memsz;
233 a84cbb2a 2004-04-19 devnull if(addrtosegafter(map, base+p->vaddr+sz, &s) >= 0 && s.base < lim)
234 a84cbb2a 2004-04-19 devnull lim = s.base;
235 a84cbb2a 2004-04-19 devnull memset(&s, 0, sizeof s);
236 a84cbb2a 2004-04-19 devnull s.name = "zero";
237 a84cbb2a 2004-04-19 devnull s.base = base + p->vaddr + sz;
238 a84cbb2a 2004-04-19 devnull s.size = lim - s.base;
239 a84cbb2a 2004-04-19 devnull s.offset = p->offset;
240 a84cbb2a 2004-04-19 devnull if(addseg(map, s) < 0)
241 a84cbb2a 2004-04-19 devnull return -1;
242 a84cbb2a 2004-04-19 devnull }else
243 a84cbb2a 2004-04-19 devnull sz = (s.base+s.size) - (base + p->vaddr);
244 a84cbb2a 2004-04-19 devnull }
245 a84cbb2a 2004-04-19 devnull }else{
246 a84cbb2a 2004-04-19 devnull if(p->filesz < p->memsz){
247 a84cbb2a 2004-04-19 devnull memset(&s, 0, sizeof s);
248 a84cbb2a 2004-04-19 devnull s.name = "zero";
249 a84cbb2a 2004-04-19 devnull s.base = base + p->vaddr + p->filesz;
250 a84cbb2a 2004-04-19 devnull s.size = p->memsz - p->filesz;
251 a84cbb2a 2004-04-19 devnull if(addseg(map, s) < 0)
252 a84cbb2a 2004-04-19 devnull return -1;
253 a84cbb2a 2004-04-19 devnull }
254 a84cbb2a 2004-04-19 devnull }
255 a84cbb2a 2004-04-19 devnull }
256 a84cbb2a 2004-04-19 devnull
257 a84cbb2a 2004-04-19 devnull if(fp->ftype == FCORE){
258 a84cbb2a 2004-04-19 devnull if(mapcoreregs(fp, map, regs) < 0)
259 a84cbb2a 2004-04-19 devnull fprint(2, "warning: reading core regs: %r");
260 a84cbb2a 2004-04-19 devnull }
261 a84cbb2a 2004-04-19 devnull
262 a84cbb2a 2004-04-19 devnull return 0;
263 a84cbb2a 2004-04-19 devnull }
264 a84cbb2a 2004-04-19 devnull
265 a84cbb2a 2004-04-19 devnull static int
266 a84cbb2a 2004-04-19 devnull unpacknote(Elf *elf, uchar *a, uchar *ea, ElfNote *note, uchar **pa)
267 a84cbb2a 2004-04-19 devnull {
268 a84cbb2a 2004-04-19 devnull if(a+12 > ea)
269 a84cbb2a 2004-04-19 devnull return -1;
270 a84cbb2a 2004-04-19 devnull note->namesz = elf->hdr.e4(a);
271 a84cbb2a 2004-04-19 devnull note->descsz = elf->hdr.e4(a+4);
272 a84cbb2a 2004-04-19 devnull note->type = elf->hdr.e4(a+8);
273 a84cbb2a 2004-04-19 devnull a += 12;
274 a84cbb2a 2004-04-19 devnull note->name = (char*)a;
275 a84cbb2a 2004-04-19 devnull /* XXX fetch alignment constants from elsewhere */
276 a84cbb2a 2004-04-19 devnull a += (note->namesz+3)&~3;
277 a84cbb2a 2004-04-19 devnull note->desc = (uchar*)a;
278 a84cbb2a 2004-04-19 devnull a += (note->descsz+3)&~3;
279 a84cbb2a 2004-04-19 devnull if(a > ea)
280 a84cbb2a 2004-04-19 devnull return -1;
281 a84cbb2a 2004-04-19 devnull *pa = a;
282 a84cbb2a 2004-04-19 devnull return 0;
283 a84cbb2a 2004-04-19 devnull }
284 a84cbb2a 2004-04-19 devnull
285 a84cbb2a 2004-04-19 devnull static int
286 a84cbb2a 2004-04-19 devnull mapcoreregs(Fhdr *fp, Map *map, Regs **rp)
287 a84cbb2a 2004-04-19 devnull {
288 a84cbb2a 2004-04-19 devnull int i;
289 a84cbb2a 2004-04-19 devnull uchar *a, *sa, *ea, *uregs;
290 a84cbb2a 2004-04-19 devnull uint n;
291 a84cbb2a 2004-04-19 devnull ElfNote note;
292 a84cbb2a 2004-04-19 devnull ElfProg *p;
293 a84cbb2a 2004-04-19 devnull Elf *elf;
294 a84cbb2a 2004-04-19 devnull UregRegs *r;
295 a84cbb2a 2004-04-19 devnull
296 a84cbb2a 2004-04-19 devnull elf = fp->elf;
297 a8763864 2004-07-09 devnull if(elf->coreregs == 0){
298 a84cbb2a 2004-04-19 devnull werrstr("cannot parse %s %s cores", fp->mname, fp->aname);
299 a84cbb2a 2004-04-19 devnull return -1;
300 a84cbb2a 2004-04-19 devnull }
301 a84cbb2a 2004-04-19 devnull
302 a84cbb2a 2004-04-19 devnull for(i=0; i<elf->nprog; i++){
303 a84cbb2a 2004-04-19 devnull p = &elf->prog[i];
304 a84cbb2a 2004-04-19 devnull if(p->type != ElfProgNote)
305 a84cbb2a 2004-04-19 devnull continue;
306 a84cbb2a 2004-04-19 devnull n = p->filesz;
307 a84cbb2a 2004-04-19 devnull a = malloc(n);
308 a84cbb2a 2004-04-19 devnull if(a == nil)
309 a84cbb2a 2004-04-19 devnull return -1;
310 a84cbb2a 2004-04-19 devnull if(seek(fp->fd, p->offset, 0) < 0 || readn(fp->fd, a, n) != n){
311 a84cbb2a 2004-04-19 devnull free(a);
312 a84cbb2a 2004-04-19 devnull continue;
313 a84cbb2a 2004-04-19 devnull }
314 a84cbb2a 2004-04-19 devnull sa = a;
315 a84cbb2a 2004-04-19 devnull ea = a+n;
316 a84cbb2a 2004-04-19 devnull while(a < ea){
317 a84cbb2a 2004-04-19 devnull note.offset = (a-sa) + p->offset;
318 a84cbb2a 2004-04-19 devnull if(unpacknote(elf, a, ea, &note, &a) < 0)
319 a84cbb2a 2004-04-19 devnull break;
320 a84cbb2a 2004-04-19 devnull switch(note.type){
321 a84cbb2a 2004-04-19 devnull case ElfNotePrStatus:
322 a84cbb2a 2004-04-19 devnull if((n = (*elf->coreregs)(elf, &note, &uregs)) < 0){
323 a84cbb2a 2004-04-19 devnull free(sa);
324 a84cbb2a 2004-04-19 devnull return -1;
325 a84cbb2a 2004-04-19 devnull }
326 a84cbb2a 2004-04-19 devnull free(sa);
327 a84cbb2a 2004-04-19 devnull if((r = mallocz(sizeof(*r), 1)) == nil){
328 a84cbb2a 2004-04-19 devnull free(uregs);
329 a84cbb2a 2004-04-19 devnull return -1;
330 a84cbb2a 2004-04-19 devnull }
331 a84cbb2a 2004-04-19 devnull r->r.rw = _uregrw;
332 a84cbb2a 2004-04-19 devnull r->ureg = uregs;
333 a84cbb2a 2004-04-19 devnull *rp = &r->r;
334 a84cbb2a 2004-04-19 devnull return 0;
335 a84cbb2a 2004-04-19 devnull case ElfNotePrFpreg:
336 a84cbb2a 2004-04-19 devnull case ElfNotePrPsinfo:
337 a84cbb2a 2004-04-19 devnull case ElfNotePrTaskstruct:
338 a84cbb2a 2004-04-19 devnull case ElfNotePrAuxv:
339 a84cbb2a 2004-04-19 devnull case ElfNotePrXfpreg:
340 a84cbb2a 2004-04-19 devnull break;
341 a84cbb2a 2004-04-19 devnull }
342 a84cbb2a 2004-04-19 devnull // fprint(2, "0x%lux note %s/%lud %p\n", note.offset, note.name, note.type, note.desc);
343 a84cbb2a 2004-04-19 devnull }
344 a84cbb2a 2004-04-19 devnull free(sa);
345 a84cbb2a 2004-04-19 devnull }
346 a84cbb2a 2004-04-19 devnull fprint(2, "could not find registers in core file\n");
347 a84cbb2a 2004-04-19 devnull return -1;
348 a84cbb2a 2004-04-19 devnull }
349 a84cbb2a 2004-04-19 devnull