#include #include #include #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); }