diff options
author | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
commit | a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (patch) | |
tree | 59a0e921597e5aa53e83d487c16727a7bf01547a /src/libmach/elfcorefreebsd386.c | |
parent | 0e3cc9f456ea49919459bf1164d0c8309a6134fa (diff) | |
download | plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.gz plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.bz2 plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.zip |
libmach
Diffstat (limited to 'src/libmach/elfcorefreebsd386.c')
-rw-r--r-- | src/libmach/elfcorefreebsd386.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/libmach/elfcorefreebsd386.c b/src/libmach/elfcorefreebsd386.c new file mode 100644 index 00000000..2ff746de --- /dev/null +++ b/src/libmach/elfcorefreebsd386.c @@ -0,0 +1,89 @@ +#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 fs; + u32int es; + u32int ds; + u32int edi; + u32int esi; + u32int ebp; + u32int isp; + u32int ebx; + u32int edx; + u32int ecx; + u32int eax; + u32int trapno; + u32int err; + u32int eip; + u32int cs; + u32int eflags; + u32int esp; + u32int ss; + u32int gs; +}; + +struct Status +{ + u32int version; /* Version number of struct (1) */ + u32int statussz; /* sizeof(prstatus_t) (1) */ + u32int gregsetsz; /* sizeof(gregset_t) (1) */ + u32int fpregsetsz; /* sizeof(fpregset_t) (1) */ + u32int osreldate; /* Kernel version (1) */ + u32int cursig; /* Current signal (1) */ + u32int pid; /* Process ID (1) */ + Lreg reg; /* General purpose registers (1) */ +}; + +int +coreregsfreebsd386(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; + if(s->version != 1){ + werrstr("unknown status version %ud", (uint)s->version); + return -1; + } + 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 = l->trapno; + u->ecode = 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); +} + |