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 ebx;13 u32int ecx;14 u32int edx;15 u32int esi;16 u32int edi;17 u32int ebp;18 u32int eax;19 u32int ds;20 u32int es;21 u32int fs;22 u32int gs;23 u32int origeax;24 u32int eip;25 u32int cs;26 u32int eflags;27 u32int esp;28 u32int ss;29 };31 /*32 * Lreg is 64-bit aligned within status, so we shouldn't33 * have any packing problems.34 */35 struct Status36 {37 u32int signo;38 u32int code;39 u32int errno;40 u32int cursig;41 u32int sigpend;42 u32int sighold;43 u32int pid;44 u32int ppid;45 u32int pgrp;46 u32int sid;47 u32int utime[2];48 u32int stime[2];49 u32int cutime[2];50 u32int cstime[2];51 Lreg reg;52 u32int fpvalid;53 };55 int56 coreregslinux386(Elf *elf, ElfNote *note, uchar **up)57 {58 Status *s;59 Lreg *l;60 Ureg *u;62 if(note->descsz < sizeof(Status)){63 werrstr("elf status note too small");64 return -1;65 }66 s = (Status*)note->desc;67 l = &s->reg;68 u = malloc(sizeof(Ureg));69 if(u == nil)70 return -1;72 /* no byte order problems - just copying and rearranging */73 u->di = l->edi;74 u->si = l->esi;75 u->bp = l->ebp;76 u->nsp = l->esp;77 u->bx = l->ebx;78 u->dx = l->edx;79 u->cx = l->ecx;80 u->ax = l->eax;81 u->gs = l->gs;82 u->fs = l->fs;83 u->es = l->es;84 u->ds = l->ds;85 u->trap = ~0; // l->trapno;86 u->ecode = ~0; // l->err;87 u->pc = l->eip;88 u->cs = l->cs;89 u->flags = l->eflags;90 u->sp = l->esp;91 u->ss = l->ss;92 *up = (uchar*)u;93 return sizeof(Ureg);94 }