blob: 0d01d969d6759d2abc75ebfa6120807a1a943d42 [file] [log] [blame]
#include <u.h>
#include <libc.h>
#include <mach.h>
#include "elf.h"
#include "ureg386.h"
typedef struct Lreg Lreg;
typedef struct Status Status;
typedef struct Psinfo Psinfo;
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) */
};
struct Psinfo
{
u32int version;
u32int size;
char name[17];
char psargs[81];
};
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);
}
int
corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)
{
char *t;
Psinfo *p;
*pp = nil;
if(note->descsz < sizeof(Psinfo)){
werrstr("elf psinfo note too small");
return -1;
}
p = (Psinfo*)note->desc;
/* print("elf name %s\nelf args %s\n", p->name, p->psargs); */
t = malloc(80+1);
if(t == nil)
return -1;
memmove(t, p->psargs, 80);
t[80] = 0;
*pp = t;
return 0;
}