| #include <u.h> |
| #include <libc.h> |
| #include <mach.h> |
| #include "elf.h" |
| #include "ureg386.h" |
| |
| typedef struct Lreg Lreg; |
| typedef struct Status Status; |
| |
| struct Lreg |
| { |
| u32int fs; |
| u32int es; |
| u32int ds; |
| u32int edi; |
| u32int esi; |
| u32int ebp; |
| u32int isp; |
| u32int ebx; |
| u32int edx; |
| u32int ecx; |
| u32int eax; |
| u32int trapno; |
| u32int err; |
| u32int eip; |
| u32int cs; |
| u32int eflags; |
| u32int esp; |
| u32int ss; |
| u32int gs; |
| }; |
| |
| struct Status |
| { |
| u32int version; /* Version number of struct (1) */ |
| u32int statussz; /* sizeof(prstatus_t) (1) */ |
| u32int gregsetsz; /* sizeof(gregset_t) (1) */ |
| u32int fpregsetsz; /* sizeof(fpregset_t) (1) */ |
| u32int osreldate; /* Kernel version (1) */ |
| u32int cursig; /* Current signal (1) */ |
| u32int pid; /* Process ID (1) */ |
| Lreg reg; /* General purpose registers (1) */ |
| }; |
| |
| int |
| coreregsfreebsd386(Elf *elf, ElfNote *note, uchar **up) |
| { |
| Status *s; |
| Lreg *l; |
| Ureg *u; |
| |
| if(note->descsz < sizeof(Status)){ |
| werrstr("elf status note too small"); |
| return -1; |
| } |
| s = (Status*)note->desc; |
| if(s->version != 1){ |
| werrstr("unknown status version %ud", (uint)s->version); |
| return -1; |
| } |
| l = &s->reg; |
| u = malloc(sizeof(Ureg)); |
| if(u == nil) |
| return -1; |
| |
| /* no byte order problems - just copying and rearranging */ |
| u->di = l->edi; |
| u->si = l->esi; |
| u->bp = l->ebp; |
| u->nsp = l->esp; |
| u->bx = l->ebx; |
| u->dx = l->edx; |
| u->cx = l->ecx; |
| u->ax = l->eax; |
| u->gs = l->gs; |
| u->fs = l->fs; |
| u->es = l->es; |
| u->ds = l->ds; |
| u->trap = l->trapno; |
| u->ecode = l->err; |
| u->pc = l->eip; |
| u->cs = l->cs; |
| u->flags = l->eflags; |
| u->sp = l->esp; |
| u->ss = l->ss; |
| *up = (uchar*)u; |
| return sizeof(Ureg); |
| } |
| |