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;9 typedef struct Psinfo Psinfo;11 struct Lreg12 {13 u32int fs;14 u32int es;15 u32int ds;16 u32int edi;17 u32int esi;18 u32int ebp;19 u32int isp;20 u32int ebx;21 u32int edx;22 u32int ecx;23 u32int eax;24 u32int trapno;25 u32int err;26 u32int eip;27 u32int cs;28 u32int eflags;29 u32int esp;30 u32int ss;31 u32int gs;32 };34 struct Status35 {36 u32int version; /* Version number of struct (1) */37 u32int statussz; /* sizeof(prstatus_t) (1) */38 u32int gregsetsz; /* sizeof(gregset_t) (1) */39 u32int fpregsetsz; /* sizeof(fpregset_t) (1) */40 u32int osreldate; /* Kernel version (1) */41 u32int cursig; /* Current signal (1) */42 u32int pid; /* Process ID (1) */43 Lreg reg; /* General purpose registers (1) */44 };46 struct Psinfo47 {48 u32int version;49 u32int size;50 char name[17];51 char psargs[81];52 };54 int55 coreregsfreebsd386(Elf *elf, ElfNote *note, uchar **up)56 {57 Status *s;58 Lreg *l;59 Ureg *u;61 if(note->descsz < sizeof(Status)){62 werrstr("elf status note too small");63 return -1;64 }65 s = (Status*)note->desc;66 if(s->version != 1){67 werrstr("unknown status version %ud", (uint)s->version);68 return -1;69 }70 l = &s->reg;71 u = malloc(sizeof(Ureg));72 if(u == nil)73 return -1;75 /* no byte order problems - just copying and rearranging */76 u->di = l->edi;77 u->si = l->esi;78 u->bp = l->ebp;79 u->nsp = l->esp;80 u->bx = l->ebx;81 u->dx = l->edx;82 u->cx = l->ecx;83 u->ax = l->eax;84 u->gs = l->gs;85 u->fs = l->fs;86 u->es = l->es;87 u->ds = l->ds;88 u->trap = l->trapno;89 u->ecode = l->err;90 u->pc = l->eip;91 u->cs = l->cs;92 u->flags = l->eflags;93 u->sp = l->esp;94 u->ss = l->ss;95 *up = (uchar*)u;96 return sizeof(Ureg);97 }99 int100 corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)101 {102 char *t;103 Psinfo *p;105 *pp = nil;106 if(note->descsz < sizeof(Psinfo)){107 werrstr("elf psinfo note too small");108 return -1;109 }110 p = (Psinfo*)note->desc;111 /* print("elf name %s\nelf args %s\n", p->name, p->psargs); */112 t = malloc(80+1);113 if(t == nil)114 return -1;115 memmove(t, p->psargs, 80);116 t[80] = 0;117 *pp = t;118 return 0;119 }