Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
4 #include "elf.h"
5 #include "ureg386.h"
7 typedef struct Lreg Lreg;
8 typedef struct Status Status;
10 struct Lreg
11 {
12 u32int fs;
13 u32int es;
14 u32int ds;
15 u32int edi;
16 u32int esi;
17 u32int ebp;
18 u32int isp;
19 u32int ebx;
20 u32int edx;
21 u32int ecx;
22 u32int eax;
23 u32int trapno;
24 u32int err;
25 u32int eip;
26 u32int cs;
27 u32int eflags;
28 u32int esp;
29 u32int ss;
30 u32int gs;
31 };
33 struct Status
34 {
35 u32int version; /* Version number of struct (1) */
36 u32int statussz; /* sizeof(prstatus_t) (1) */
37 u32int gregsetsz; /* sizeof(gregset_t) (1) */
38 u32int fpregsetsz; /* sizeof(fpregset_t) (1) */
39 u32int osreldate; /* Kernel version (1) */
40 u32int cursig; /* Current signal (1) */
41 u32int pid; /* Process ID (1) */
42 Lreg reg; /* General purpose registers (1) */
43 };
45 int
46 coreregsfreebsd386(Elf *elf, ElfNote *note, uchar **up)
47 {
48 Status *s;
49 Lreg *l;
50 Ureg *u;
52 if(note->descsz < sizeof(Status)){
53 werrstr("elf status note too small");
54 return -1;
55 }
56 s = (Status*)note->desc;
57 if(s->version != 1){
58 werrstr("unknown status version %ud", (uint)s->version);
59 return -1;
60 }
61 l = &s->reg;
62 u = malloc(sizeof(Ureg));
63 if(u == nil)
64 return -1;
66 /* no byte order problems - just copying and rearranging */
67 u->di = l->edi;
68 u->si = l->esi;
69 u->bp = l->ebp;
70 u->nsp = l->esp;
71 u->bx = l->ebx;
72 u->dx = l->edx;
73 u->cx = l->ecx;
74 u->ax = l->eax;
75 u->gs = l->gs;
76 u->fs = l->fs;
77 u->es = l->es;
78 u->ds = l->ds;
79 u->trap = l->trapno;
80 u->ecode = l->err;
81 u->pc = l->eip;
82 u->cs = l->cs;
83 u->flags = l->eflags;
84 u->sp = l->esp;
85 u->ss = l->ss;
86 *up = (uchar*)u;
87 return sizeof(Ureg);
88 }