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 Lreg11 {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 Status34 {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 int46 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 }