aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/elfcorefreebsd386.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-04-19 19:29:25 +0000
committerrsc <devnull@localhost>2004-04-19 19:29:25 +0000
commita84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (patch)
tree59a0e921597e5aa53e83d487c16727a7bf01547a /src/libmach/elfcorefreebsd386.c
parent0e3cc9f456ea49919459bf1164d0c8309a6134fa (diff)
downloadplan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.gz
plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.bz2
plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.zip
libmach
Diffstat (limited to 'src/libmach/elfcorefreebsd386.c')
-rw-r--r--src/libmach/elfcorefreebsd386.c89
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);
+}
+