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

