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 "ureg386.h"
6 a84cbb2a 2004-04-19 devnull
7 b8f742db 2005-01-11 devnull #undef errno
8 b8f742db 2005-01-11 devnull #define errno uregerrno
9 b8f742db 2005-01-11 devnull
10 a84cbb2a 2004-04-19 devnull typedef struct Lreg Lreg;
11 a84cbb2a 2004-04-19 devnull typedef struct Status Status;
12 1cc215aa 2004-12-25 devnull typedef struct Psinfo Psinfo;
13 a84cbb2a 2004-04-19 devnull
14 a84cbb2a 2004-04-19 devnull /*
15 fa325e9b 2020-01-10 cross * UregLinux386 is 64-bit aligned within status, so we shouldn't
16 fa325e9b 2020-01-10 cross * have any packing problems.
17 a84cbb2a 2004-04-19 devnull */
18 a84cbb2a 2004-04-19 devnull struct Status
19 a84cbb2a 2004-04-19 devnull {
20 a84cbb2a 2004-04-19 devnull u32int signo;
21 a84cbb2a 2004-04-19 devnull u32int code;
22 a84cbb2a 2004-04-19 devnull u32int errno;
23 a84cbb2a 2004-04-19 devnull u32int cursig;
24 a84cbb2a 2004-04-19 devnull u32int sigpend;
25 a84cbb2a 2004-04-19 devnull u32int sighold;
26 a84cbb2a 2004-04-19 devnull u32int pid;
27 a84cbb2a 2004-04-19 devnull u32int ppid;
28 a84cbb2a 2004-04-19 devnull u32int pgrp;
29 a84cbb2a 2004-04-19 devnull u32int sid;
30 a84cbb2a 2004-04-19 devnull u32int utime[2];
31 a84cbb2a 2004-04-19 devnull u32int stime[2];
32 a84cbb2a 2004-04-19 devnull u32int cutime[2];
33 a84cbb2a 2004-04-19 devnull u32int cstime[2];
34 1cc215aa 2004-12-25 devnull UregLinux386 reg;
35 a84cbb2a 2004-04-19 devnull u32int fpvalid;
36 a84cbb2a 2004-04-19 devnull };
37 dd944ec7 2005-01-23 devnull enum
38 dd944ec7 2005-01-23 devnull {
39 cbeb0b26 2006-04-01 devnull StatusSize = sizeof(Status)
40 dd944ec7 2005-01-23 devnull };
41 a84cbb2a 2004-04-19 devnull
42 1cc215aa 2004-12-25 devnull struct Psinfo
43 1cc215aa 2004-12-25 devnull {
44 1cc215aa 2004-12-25 devnull char state;
45 1cc215aa 2004-12-25 devnull char sname;
46 1cc215aa 2004-12-25 devnull char zomb;
47 1cc215aa 2004-12-25 devnull char nice;
48 1cc215aa 2004-12-25 devnull u32int flag;
49 1cc215aa 2004-12-25 devnull u16int uid;
50 1cc215aa 2004-12-25 devnull u16int gid;
51 1cc215aa 2004-12-25 devnull u32int pid;
52 1cc215aa 2004-12-25 devnull u32int ppid;
53 1cc215aa 2004-12-25 devnull u32int pgrp;
54 1cc215aa 2004-12-25 devnull u32int sid;
55 1cc215aa 2004-12-25 devnull char fname[16];
56 1cc215aa 2004-12-25 devnull char psargs[80];
57 1cc215aa 2004-12-25 devnull };
58 dd944ec7 2005-01-23 devnull enum
59 dd944ec7 2005-01-23 devnull {
60 cbeb0b26 2006-04-01 devnull PsinfoSize = sizeof(Psinfo)
61 dd944ec7 2005-01-23 devnull };
62 1cc215aa 2004-12-25 devnull
63 a84cbb2a 2004-04-19 devnull int
64 a84cbb2a 2004-04-19 devnull coreregslinux386(Elf *elf, ElfNote *note, uchar **up)
65 a84cbb2a 2004-04-19 devnull {
66 a84cbb2a 2004-04-19 devnull Status *s;
67 1cc215aa 2004-12-25 devnull UregLinux386 *l;
68 a84cbb2a 2004-04-19 devnull Ureg *u;
69 a84cbb2a 2004-04-19 devnull
70 a84cbb2a 2004-04-19 devnull if(note->descsz < sizeof(Status)){
71 a84cbb2a 2004-04-19 devnull werrstr("elf status note too small");
72 a84cbb2a 2004-04-19 devnull return -1;
73 a84cbb2a 2004-04-19 devnull }
74 a84cbb2a 2004-04-19 devnull s = (Status*)note->desc;
75 a84cbb2a 2004-04-19 devnull l = &s->reg;
76 dd944ec7 2005-01-23 devnull if((u = malloc(sizeof *u)) == nil)
77 a84cbb2a 2004-04-19 devnull return -1;
78 dd944ec7 2005-01-23 devnull linux2ureg386(l, u);
79 a84cbb2a 2004-04-19 devnull *up = (uchar*)u;
80 a84cbb2a 2004-04-19 devnull return sizeof(Ureg);
81 a84cbb2a 2004-04-19 devnull }
82 a84cbb2a 2004-04-19 devnull
83 1cc215aa 2004-12-25 devnull int
84 1cc215aa 2004-12-25 devnull corecmdlinux386(Elf *elf, ElfNote *note, char **pp)
85 1cc215aa 2004-12-25 devnull {
86 1cc215aa 2004-12-25 devnull char *t;
87 1cc215aa 2004-12-25 devnull Psinfo *p;
88 1cc215aa 2004-12-25 devnull
89 1cc215aa 2004-12-25 devnull *pp = nil;
90 1cc215aa 2004-12-25 devnull if(note->descsz < sizeof(Psinfo)){
91 1cc215aa 2004-12-25 devnull werrstr("elf psinfo note too small");
92 1cc215aa 2004-12-25 devnull return -1;
93 1cc215aa 2004-12-25 devnull }
94 1cc215aa 2004-12-25 devnull p = (Psinfo*)note->desc;
95 cbeb0b26 2006-04-01 devnull /* print("elf name %s\nelf args %s\n", p->fname, p->psargs); */
96 1cc215aa 2004-12-25 devnull t = malloc(80+1);
97 1cc215aa 2004-12-25 devnull if(t == nil)
98 1cc215aa 2004-12-25 devnull return -1;
99 1cc215aa 2004-12-25 devnull memmove(t, p->psargs, 80);
100 1cc215aa 2004-12-25 devnull t[80] = 0;
101 1cc215aa 2004-12-25 devnull *pp = t;
102 1cc215aa 2004-12-25 devnull return 0;
103 1cc215aa 2004-12-25 devnull }
104 1cc215aa 2004-12-25 devnull
105 dd944ec7 2005-01-23 devnull #define dprint if(0)print
106 dd944ec7 2005-01-23 devnull
107 dd944ec7 2005-01-23 devnull void
108 dd944ec7 2005-01-23 devnull elfcorelinux386(Fhdr *fp, Elf *elf, ElfNote *note)
109 dd944ec7 2005-01-23 devnull {
110 dd944ec7 2005-01-23 devnull int i;
111 dd944ec7 2005-01-23 devnull Psinfo *ps;
112 dd944ec7 2005-01-23 devnull Status *st;
113 dd944ec7 2005-01-23 devnull Mach *m;
114 dd944ec7 2005-01-23 devnull Ureg *u;
115 dd944ec7 2005-01-23 devnull
116 dd944ec7 2005-01-23 devnull m = fp->mach;
117 dd944ec7 2005-01-23 devnull dprint("%s ", note->name);
118 dd944ec7 2005-01-23 devnull switch(note->type){
119 dd944ec7 2005-01-23 devnull case ElfNotePrPsinfo:
120 dd944ec7 2005-01-23 devnull ps = (Psinfo*)note->desc;
121 dd944ec7 2005-01-23 devnull dprint("note info\n");
122 dd944ec7 2005-01-23 devnull dprint("state=%d sname=%d zomb=%d nice=%d\n",
123 dd944ec7 2005-01-23 devnull ps->state, ps->sname, ps->zomb, ps->nice);
124 dd944ec7 2005-01-23 devnull dprint("flag=0x%ux uid=%ud gid=%ud pid=%ud ppid=%ud pgrp=%ud sid=%ud\n",
125 dd944ec7 2005-01-23 devnull (uint)m->swap4(ps->flag),
126 dd944ec7 2005-01-23 devnull (uint)m->swap2(ps->uid),
127 dd944ec7 2005-01-23 devnull (uint)m->swap2(ps->gid),
128 dd944ec7 2005-01-23 devnull (uint)m->swap4(ps->pid),
129 dd944ec7 2005-01-23 devnull (uint)m->swap4(ps->ppid),
130 dd944ec7 2005-01-23 devnull (uint)m->swap4(ps->pgrp),
131 dd944ec7 2005-01-23 devnull (uint)m->swap4(ps->sid));
132 dd944ec7 2005-01-23 devnull dprint("fname=%s psargs=%s\n", ps->fname, ps->psargs);
133 dd944ec7 2005-01-23 devnull fp->pid = m->swap4(ps->pid);
134 dd944ec7 2005-01-23 devnull if((fp->prog = strdup(ps->fname)) == nil)
135 dd944ec7 2005-01-23 devnull fprint(2, "warning: out of memory saving core program name\n");
136 dd944ec7 2005-01-23 devnull if((fp->cmdline = strdup(ps->psargs)) == nil)
137 dd944ec7 2005-01-23 devnull fprint(2, "warning: out of memory saving core command line\n");
138 dd944ec7 2005-01-23 devnull break;
139 dd944ec7 2005-01-23 devnull case ElfNotePrTaskstruct:
140 dd944ec7 2005-01-23 devnull dprint("note taskstruct\n");
141 dd944ec7 2005-01-23 devnull break;
142 dd944ec7 2005-01-23 devnull case ElfNotePrAuxv:
143 dd944ec7 2005-01-23 devnull dprint("note auxv\n");
144 dd944ec7 2005-01-23 devnull break;
145 dd944ec7 2005-01-23 devnull case ElfNotePrStatus:
146 dd944ec7 2005-01-23 devnull dprint("note status\n");
147 dd944ec7 2005-01-23 devnull if(note->descsz < StatusSize){
148 dd944ec7 2005-01-23 devnull dprint("too small\n");
149 dd944ec7 2005-01-23 devnull break;
150 dd944ec7 2005-01-23 devnull }
151 dd944ec7 2005-01-23 devnull st = (Status*)note->desc;
152 dd944ec7 2005-01-23 devnull dprint("sig=%ud code=%ud errno=%ud cursig=%ud sigpend=0x%ux sighold=0x%ux\n",
153 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->signo),
154 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->code),
155 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->errno),
156 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->cursig),
157 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->sigpend),
158 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->sighold));
159 dd944ec7 2005-01-23 devnull dprint("pid=%ud ppid=%ud pgrp=%ud sid=%ud\n",
160 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->pid),
161 fa325e9b 2020-01-10 cross (uint)m->swap4(st->ppid),
162 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->pgrp),
163 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->sid));
164 dd944ec7 2005-01-23 devnull dprint("utime=%ud.%06ud stime=%ud.%06ud cutime=%ud.%06ud cstime=%ud.%06ud\n",
165 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->utime[0]),
166 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->utime[1]),
167 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->stime[0]),
168 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->stime[1]),
169 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->cutime[0]),
170 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->cutime[1]),
171 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->cstime[0]),
172 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->cstime[1]));
173 dd944ec7 2005-01-23 devnull dprint("fpvalid=%ud\n",
174 dd944ec7 2005-01-23 devnull (uint)m->swap4(st->fpvalid));
175 dd944ec7 2005-01-23 devnull if((fp->thread = realloc(fp->thread, (1+fp->nthread)*sizeof(fp->thread[0]))) == nil){
176 dd944ec7 2005-01-23 devnull fprint(2, "warning: out of memory saving thread info\n");
177 dd944ec7 2005-01-23 devnull return;
178 dd944ec7 2005-01-23 devnull }
179 dd944ec7 2005-01-23 devnull i = fp->nthread;
180 dd944ec7 2005-01-23 devnull fp->thread[i].id = m->swap4(st->pid);
181 dd944ec7 2005-01-23 devnull u = malloc(sizeof *u);
182 dd944ec7 2005-01-23 devnull if(u == nil){
183 dd944ec7 2005-01-23 devnull fprint(2, "warning: out of memory saving thread info\n");
184 dd944ec7 2005-01-23 devnull return;
185 dd944ec7 2005-01-23 devnull }
186 dd944ec7 2005-01-23 devnull fp->thread[i].ureg = u;
187 dd944ec7 2005-01-23 devnull linux2ureg386(&st->reg, u);
188 dd944ec7 2005-01-23 devnull fp->nthread++;
189 dd944ec7 2005-01-23 devnull break;
190 dd944ec7 2005-01-23 devnull case ElfNotePrFpreg:
191 dd944ec7 2005-01-23 devnull dprint("note fpreg\n");
192 dd944ec7 2005-01-23 devnull /* XXX maybe record floating-point registers eventually */
193 dd944ec7 2005-01-23 devnull break;
194 dd944ec7 2005-01-23 devnull case ElfNotePrXfpreg:
195 dd944ec7 2005-01-23 devnull dprint("note xfpreg\n");
196 dd944ec7 2005-01-23 devnull /* XXX maybe record floating-point registers eventually */
197 dd944ec7 2005-01-23 devnull break;
198 dd944ec7 2005-01-23 devnull default:
199 dd944ec7 2005-01-23 devnull dprint("note %d\n", note->type);
200 dd944ec7 2005-01-23 devnull }
201 dd944ec7 2005-01-23 devnull }