| #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 ebx; |
| u32int ecx; |
| u32int edx; |
| u32int esi; |
| u32int edi; |
| u32int ebp; |
| u32int eax; |
| u32int ds; |
| u32int es; |
| u32int fs; |
| u32int gs; |
| u32int origeax; |
| u32int eip; |
| u32int cs; |
| u32int eflags; |
| u32int esp; |
| u32int ss; |
| }; |
| |
| /* |
| * Lreg is 64-bit aligned within status, so we shouldn't |
| * have any packing problems. |
| */ |
| struct Status |
| { |
| u32int signo; |
| u32int code; |
| u32int errno; |
| u32int cursig; |
| u32int sigpend; |
| u32int sighold; |
| u32int pid; |
| u32int ppid; |
| u32int pgrp; |
| u32int sid; |
| u32int utime[2]; |
| u32int stime[2]; |
| u32int cutime[2]; |
| u32int cstime[2]; |
| Lreg reg; |
| u32int fpvalid; |
| }; |
| |
| int |
| coreregslinux386(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; |
| 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 = ~0; // l->trapno; |
| u->ecode = ~0; // 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); |
| } |
| |