#include <u.h>
#include <libc.h>
#include <mach.h>
#include "macho.h"
#include "uregpower.h"

enum
{
	ThreadState = 1,
	FloatState,
	ExceptionState,
	VectorState,
	ThreadState64,
	ExceptionState64,
	ThreadStateNone,
};

typedef struct Lreg Lreg;
typedef struct Lflt Lflt;
typedef struct Lexc Lexc;

struct Lreg
{
	u32int srr0;
	u32int srr1;
	u32int r0;
	u32int r1;
	u32int r2;
	u32int r3;
	u32int r4;
	u32int r5;
	u32int r6;
	u32int r7;
	u32int r8;
	u32int r9;
	u32int r10;
	u32int r11;
	u32int r12;
	u32int r13;
	u32int r14;
	u32int r15;
	u32int r16;
	u32int r17;
	u32int r18;
	u32int r19;
	u32int r20;
	u32int r21;
	u32int r22;
	u32int r23;
	u32int r24;
	u32int r25;
	u32int r26;
	u32int r27;
	u32int r28;
	u32int r29;
	u32int r30;
	u32int r31;

	u32int cr;
	u32int xer;
	u32int lr;
	u32int ctr;
	u32int mq;

	u32int vrsave;
};

struct Lflt
{
	u32int fpregs[32*2];		/* 32 doubles */
	u32int fpscr[2];

};

struct Lexc
{
	u32int dar;
	u32int dsisr;
	u32int exception;
	u32int pad0;
	u32int pad1[4];
};

static void
lreg2ureg(Lreg *l, Ureg *u)
{
	u->pc = l->srr0;
	u->srr1 = l->srr1;
	u->lr = l->lr;
	u->cr = l->cr;
	u->xer = l->xer;
	u->ctr = l->ctr;
	u->vrsave = l->vrsave;
	memmove(&u->r0, &l->r0, 32*4);
}

static void
lexc2ureg(Lexc *l, Ureg *u)
{
	u->cause = l->exception;
	u->dar = l->dar;
	u->dsisr = l->dsisr;
}

static uchar*
load(int fd, ulong off, int size)
{
	uchar *a;

	a = malloc(size);
	if(a == nil)
		return nil;
	if(seek(fd, off, 0) < 0 || readn(fd, a, size) != size){
		free(a);
		return nil;
	}
	return a;
}

int
coreregsmachopower(Macho *m, uchar **up)
{
	int i, havereg, haveexc;
	uchar *a, *p, *nextp;
	Ureg *u;
	ulong flavor, count;
	MachoCmd *c;

	*up = nil;
	for(i=0; i<m->ncmd; i++)
		if(m->cmd[i].type == MachoCmdThread)
			break;
	if(i == m->ncmd){
		werrstr("no registers found");
		return -1;
	}

	c = &m->cmd[i];
	a = load(m->fd, c->off, c->size);
	if(a == nil)
		return -1;

	if((u = mallocz(sizeof(Ureg), 1)) == nil){
		free(a);
		return -1;
	}

	havereg = haveexc = 0;
	for(p=a+8; p<a+c->size; p=nextp){
		flavor = m->e4(p);
		count = m->e4(p+4);
		nextp = p+8+count*4;
		if(flavor == ThreadState && count*4 == sizeof(Lreg)){
			havereg = 1;
			lreg2ureg((Lreg*)(p+8), u);
		}
		if(flavor == ExceptionState && count*4 == sizeof(Lexc)){
			haveexc = 1;
			lexc2ureg((Lexc*)(p+8), u);
		}
	}
	free(a);
	if(!havereg){
		werrstr("no registers found");
		free(u);
		return -1;
	}
	if(!haveexc)
		fprint(2, "warning: no exception state in core file registers\n");
	*up = (uchar*)u;
	return sizeof(*u);
}

