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"
7 443d6288 2012-02-19 rsc typedef struct Ureg Ureg;
9 443d6288 2012-02-19 rsc // See FreeBSD's sys/procfs.h.
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;
32 443d6288 2012-02-19 rsc u32int trapno;
40 443d6288 2012-02-19 rsc u64int rflags;
45 443d6288 2012-02-19 rsc struct Status
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) */
57 443d6288 2012-02-19 rsc struct Psinfo
59 443d6288 2012-02-19 rsc u32int version;
61 443d6288 2012-02-19 rsc char name[17];
62 443d6288 2012-02-19 rsc char psargs[81];
66 443d6288 2012-02-19 rsc elfcorefreebsdamd64(Fhdr *fp, Elf *elf, ElfNote *note)
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");
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);
85 443d6288 2012-02-19 rsc u = malloc(sizeof(Ureg));
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;
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;
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 print("core PC=%#llux SP=%#llux\n", u->ip, u->sp);
118 443d6288 2012-02-19 rsc if((fp->thread = realloc(fp->thread, (1+fp->nthread)*sizeof(fp->thread[0]))) == nil){
119 443d6288 2012-02-19 rsc fprint(2, "warning: out of memory saving thread info\n");
122 443d6288 2012-02-19 rsc i = fp->nthread;
123 443d6288 2012-02-19 rsc fp->thread[i].id = s->pid;
124 443d6288 2012-02-19 rsc fp->thread[i].ureg = u;
125 443d6288 2012-02-19 rsc fp->nthread++;
131 443d6288 2012-02-19 rsc corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)
137 443d6288 2012-02-19 rsc if(note->descsz < sizeof(Psinfo)){
138 443d6288 2012-02-19 rsc werrstr("elf psinfo note too small");
141 443d6288 2012-02-19 rsc p = (Psinfo*)note->desc;
142 443d6288 2012-02-19 rsc /* print("elf name %s\nelf args %s\n", p->name, p->psargs); */
143 443d6288 2012-02-19 rsc t = malloc(80+1);
144 443d6288 2012-02-19 rsc if(t == nil)
146 443d6288 2012-02-19 rsc memmove(t, p->psargs, 80);