Blame


1 443d6288 2012-02-19 rsc #include <u.h>
2 443d6288 2012-02-19 rsc #include <libc.h>
3 443d6288 2012-02-19 rsc #include <mach.h>
4 443d6288 2012-02-19 rsc #include "elf.h"
5 443d6288 2012-02-19 rsc #include "uregamd64.h"
6 443d6288 2012-02-19 rsc
7 443d6288 2012-02-19 rsc typedef struct Ureg Ureg;
8 443d6288 2012-02-19 rsc
9 443d6288 2012-02-19 rsc // See FreeBSD's sys/procfs.h.
10 443d6288 2012-02-19 rsc
11 443d6288 2012-02-19 rsc typedef struct Lreg Lreg;
12 443d6288 2012-02-19 rsc typedef struct Status Status;
13 443d6288 2012-02-19 rsc typedef struct Psinfo Psinfo;
14 443d6288 2012-02-19 rsc
15 443d6288 2012-02-19 rsc struct Lreg
16 443d6288 2012-02-19 rsc {
17 443d6288 2012-02-19 rsc u64int r15;
18 443d6288 2012-02-19 rsc u64int r14;
19 443d6288 2012-02-19 rsc u64int r13;
20 443d6288 2012-02-19 rsc u64int r12;
21 443d6288 2012-02-19 rsc u64int r11;
22 443d6288 2012-02-19 rsc u64int r10;
23 443d6288 2012-02-19 rsc u64int r9;
24 443d6288 2012-02-19 rsc u64int r8;
25 443d6288 2012-02-19 rsc u64int rdi;
26 443d6288 2012-02-19 rsc u64int rsi;
27 443d6288 2012-02-19 rsc u64int rbp;
28 443d6288 2012-02-19 rsc u64int rbx;
29 443d6288 2012-02-19 rsc u64int rdx;
30 443d6288 2012-02-19 rsc u64int rcx;
31 443d6288 2012-02-19 rsc u64int rax;
32 443d6288 2012-02-19 rsc u32int trapno;
33 443d6288 2012-02-19 rsc u16int fs;
34 443d6288 2012-02-19 rsc u16int gs;
35 443d6288 2012-02-19 rsc u32int err;
36 443d6288 2012-02-19 rsc u16int es;
37 443d6288 2012-02-19 rsc u16int ds;
38 443d6288 2012-02-19 rsc u64int rip;
39 443d6288 2012-02-19 rsc u64int cs;
40 443d6288 2012-02-19 rsc u64int rflags;
41 443d6288 2012-02-19 rsc u64int rsp;
42 443d6288 2012-02-19 rsc u64int ss;
43 443d6288 2012-02-19 rsc };
44 443d6288 2012-02-19 rsc
45 443d6288 2012-02-19 rsc struct Status
46 443d6288 2012-02-19 rsc {
47 443d6288 2012-02-19 rsc u32int version; /* Version number of struct (1) */
48 443d6288 2012-02-19 rsc u64int statussz; /* sizeof(prstatus_t) (1) */
49 443d6288 2012-02-19 rsc u64int gregsetsz; /* sizeof(gregset_t) (1) */
50 443d6288 2012-02-19 rsc u64int fpregsetsz; /* sizeof(fpregset_t) (1) */
51 443d6288 2012-02-19 rsc u32int osreldate; /* Kernel version (1) */
52 443d6288 2012-02-19 rsc u32int cursig; /* Current signal (1) */
53 443d6288 2012-02-19 rsc u32int pid; /* Process ID (1) */
54 443d6288 2012-02-19 rsc Lreg reg; /* General purpose registers (1) */
55 443d6288 2012-02-19 rsc };
56 443d6288 2012-02-19 rsc
57 443d6288 2012-02-19 rsc struct Psinfo
58 443d6288 2012-02-19 rsc {
59 443d6288 2012-02-19 rsc u32int version;
60 443d6288 2012-02-19 rsc u64int size;
61 443d6288 2012-02-19 rsc char name[17];
62 443d6288 2012-02-19 rsc char psargs[81];
63 443d6288 2012-02-19 rsc };
64 443d6288 2012-02-19 rsc
65 443d6288 2012-02-19 rsc void
66 443d6288 2012-02-19 rsc elfcorefreebsdamd64(Fhdr *fp, Elf *elf, ElfNote *note)
67 443d6288 2012-02-19 rsc {
68 443d6288 2012-02-19 rsc Status *s;
69 443d6288 2012-02-19 rsc Lreg *l;
70 443d6288 2012-02-19 rsc Ureg *u;
71 443d6288 2012-02-19 rsc int i;
72 443d6288 2012-02-19 rsc
73 443d6288 2012-02-19 rsc switch(note->type) {
74 443d6288 2012-02-19 rsc case ElfNotePrStatus:
75 443d6288 2012-02-19 rsc if(note->descsz < sizeof(Status)){
76 443d6288 2012-02-19 rsc fprint(2, "warning: elf status note too small\n");
77 443d6288 2012-02-19 rsc break;
78 443d6288 2012-02-19 rsc }
79 443d6288 2012-02-19 rsc s = (Status*)note->desc;
80 443d6288 2012-02-19 rsc if(s->version != 1){
81 443d6288 2012-02-19 rsc fprint(2, "warning: unknown elf note status version %ud\n", (uint)s->version);
82 443d6288 2012-02-19 rsc break;
83 443d6288 2012-02-19 rsc }
84 443d6288 2012-02-19 rsc l = &s->reg;
85 443d6288 2012-02-19 rsc u = malloc(sizeof(Ureg));
86 fa325e9b 2020-01-10 cross
87 443d6288 2012-02-19 rsc /* no byte order problems - just copying and rearranging */
88 443d6288 2012-02-19 rsc u->ax = l->rax;
89 443d6288 2012-02-19 rsc u->bx = l->rbx;
90 443d6288 2012-02-19 rsc u->cx = l->rcx;
91 443d6288 2012-02-19 rsc u->dx = l->rdx;
92 443d6288 2012-02-19 rsc u->si = l->rsi;
93 443d6288 2012-02-19 rsc u->di = l->rdi;
94 443d6288 2012-02-19 rsc u->bp = l->rbp;
95 443d6288 2012-02-19 rsc u->r8 = l->r8;
96 443d6288 2012-02-19 rsc u->r9 = l->r9;
97 443d6288 2012-02-19 rsc u->r10 = l->r10;
98 443d6288 2012-02-19 rsc u->r11 = l->r11;
99 443d6288 2012-02-19 rsc u->r12 = l->r12;
100 443d6288 2012-02-19 rsc u->r13 = l->r13;
101 443d6288 2012-02-19 rsc u->r14 = l->r14;
102 443d6288 2012-02-19 rsc u->r15 = l->r15;
103 fa325e9b 2020-01-10 cross
104 443d6288 2012-02-19 rsc u->ds = l->ds;
105 443d6288 2012-02-19 rsc u->es = l->es;
106 443d6288 2012-02-19 rsc u->fs = l->fs;
107 443d6288 2012-02-19 rsc u->gs = l->gs;
108 fa325e9b 2020-01-10 cross
109 443d6288 2012-02-19 rsc u->type = l->trapno;
110 443d6288 2012-02-19 rsc u->error = l->err;
111 443d6288 2012-02-19 rsc u->ip = l->rip;
112 443d6288 2012-02-19 rsc u->cs = l->cs;
113 443d6288 2012-02-19 rsc u->flags = l->rflags;
114 443d6288 2012-02-19 rsc u->sp = l->rsp;
115 443d6288 2012-02-19 rsc u->ss = l->ss;
116 4a000a28 2012-03-05 rsc
117 443d6288 2012-02-19 rsc if((fp->thread = realloc(fp->thread, (1+fp->nthread)*sizeof(fp->thread[0]))) == nil){
118 443d6288 2012-02-19 rsc fprint(2, "warning: out of memory saving thread info\n");
119 443d6288 2012-02-19 rsc return;
120 443d6288 2012-02-19 rsc }
121 443d6288 2012-02-19 rsc i = fp->nthread;
122 443d6288 2012-02-19 rsc fp->thread[i].id = s->pid;
123 443d6288 2012-02-19 rsc fp->thread[i].ureg = u;
124 443d6288 2012-02-19 rsc fp->nthread++;
125 443d6288 2012-02-19 rsc break;
126 443d6288 2012-02-19 rsc }
127 443d6288 2012-02-19 rsc }
128 443d6288 2012-02-19 rsc
129 443d6288 2012-02-19 rsc int
130 443d6288 2012-02-19 rsc corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)
131 443d6288 2012-02-19 rsc {
132 443d6288 2012-02-19 rsc char *t;
133 443d6288 2012-02-19 rsc Psinfo *p;
134 443d6288 2012-02-19 rsc
135 443d6288 2012-02-19 rsc *pp = nil;
136 443d6288 2012-02-19 rsc if(note->descsz < sizeof(Psinfo)){
137 443d6288 2012-02-19 rsc werrstr("elf psinfo note too small");
138 443d6288 2012-02-19 rsc return -1;
139 443d6288 2012-02-19 rsc }
140 443d6288 2012-02-19 rsc p = (Psinfo*)note->desc;
141 443d6288 2012-02-19 rsc /* print("elf name %s\nelf args %s\n", p->name, p->psargs); */
142 443d6288 2012-02-19 rsc t = malloc(80+1);
143 443d6288 2012-02-19 rsc if(t == nil)
144 443d6288 2012-02-19 rsc return -1;
145 443d6288 2012-02-19 rsc memmove(t, p->psargs, 80);
146 443d6288 2012-02-19 rsc t[80] = 0;
147 443d6288 2012-02-19 rsc *pp = t;
148 443d6288 2012-02-19 rsc return 0;
149 443d6288 2012-02-19 rsc }