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

static int mapmacho(Fhdr *fp, ulong base, Map *map, Regs**);

static struct
{
	uint etype;
	uint mtype;
	Mach *mach;
	char *name;
	int (*coreregs)(Macho*, uchar**);
} mtab[] = 
{
	MachoCpuPower,	MPOWER,		&machpower, 		"powerpc",	coreregsmachopower,
};

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
crackmacho(int fd, Fhdr *fp)
{
	int i;
	Macho *m;

	if((m = machoinit(fd)) == nil)
		return -1;

	fp->fd = fd;
	fp->macho = m;

	for(i=0; i<nelem(mtab); i++){
		if(m->cputype != mtab[i].etype)
			continue;
		fp->mach = mtab[i].mach;
		fp->mtype = mtab[i].mtype;
		fp->mname = mtab[i].name;
		m->coreregs = mtab[i].coreregs;
		break;
	}
	if(i == nelem(mtab)){
		werrstr("unsupported cpu type %ud", m->cputype);
		goto err;
	}

	fp->atype = AMACH;
	fp->aname = "mach";

	if(mach == nil)
		mach = fp->mach;

	switch(m->filetype){
	default:
		werrstr("unsupported macho file type %lud", m->filetype);
		goto err;
	case MachoFileObject:
		fp->ftype = FOBJ;
		fp->fname = "object";
		break;
	case MachoFileExecutable:
		fp->ftype = FEXEC;
		fp->fname = "executable";
		break;
	case MachoFileFvmlib:
		fp->ftype = FSHLIB;
		fp->fname = "shared library";
		break;
	case MachoFileCore:
		fp->ftype = FCORE;
		fp->fname = "core";
		break;
	case MachoFilePreload:
		fp->ftype = FBOOT;
		fp->fname = "preloaded executable";
		break;
	}

	fp->txtaddr = fp->dataddr = 0;
	fp->txtsz = fp->datsz = 0;
	for(i=0; i<m->ncmd; i++){
		if(m->cmd[i].type != MachoCmdSegment)
			continue;
		if(strcmp(m->cmd[i].seg.name, "__TEXT") == 0){
			fp->txtaddr = m->cmd[i].seg.vmaddr;
			fp->txtsz = m->cmd[i].seg.vmsize;
			fp->txtoff = m->cmd[i].seg.fileoff;
		}
		if(strcmp(m->cmd[i].seg.name, "__DATA") == 0){
			fp->dataddr = m->cmd[i].seg.vmaddr;
			fp->datsz = m->cmd[i].seg.filesz;
			fp->datoff = m->cmd[i].seg.fileoff;
			fp->bsssz = m->cmd[i].seg.vmsize - fp->datsz;
		}
	}

	fp->map = mapmacho;
	fp->syminit = symmacho;

	for(i=0; i<m->ncmd; i++)
		if(m->cmd[i].type == MachoCmdSymtab)
			break;
	if(i < m->ncmd){
		fp->stabs.stabbase = load(fp->fd, m->cmd[i].sym.symoff, m->cmd[i].sym.nsym*16);
		fp->stabs.stabsize = m->cmd[i].sym.nsym*16;
		fp->stabs.strbase = (char*)load(fp->fd, m->cmd[i].sym.stroff, m->cmd[i].sym.strsize);
		if(fp->stabs.stabbase == nil || fp->stabs.strbase == nil){
			fp->stabs.stabbase = nil;
			fp->stabs.strbase = nil;
		}else{
			fp->stabs.strsize = m->cmd[i].sym.strsize;
			fp->stabs.e2 = (m->e4==beload4 ? beload2 : leload2);
			fp->stabs.e4 = m->e4;
		}
	}

	return 0;

err:
	machoclose(m);
	return -1;
}

static int
mapmacho(Fhdr *fp, ulong base, Map *map, Regs **rp)
{
	int i, n;
	uchar *u;
	Macho *m;
	MachoCmd *c;
	Seg s;
	UregRegs *r;

	m = fp->macho;
	if(m == nil){
		werrstr("not a macho file");
		return -1;
	}

	for(i=0; i<m->ncmd; i++){
		c = &m->cmd[i];
		if(c->type != MachoCmdSegment)
			continue;
		if(c->seg.filesz){
			memset(&s, 0, sizeof s);
			s.file = fp->filename;
			s.fd = fp->fd;
			if(fp->ftype == FCORE)
				s.name = "core";
			else if(strcmp(c->seg.name, "__DATA") == 0)
				s.name = "data";
			else
				s.name = "text";
			s.base = base+c->seg.vmaddr;
			s.size = c->seg.filesz;
			s.offset = c->seg.fileoff;
			if(addseg(map, s) < 0)
				return -1;
		}
		if(c->seg.filesz < c->seg.vmsize){
			memset(&s, 0, sizeof s);
			s.name = "zero";
			s.base = base + c->seg.vmaddr + c->seg.filesz;
			s.size = c->seg.vmsize - c->seg.filesz;
			if(addseg(map, s) < 0)
				return -1;
		}
	}

	if(fp->ftype == FCORE && m->coreregs){
		n = m->coreregs(m, &u);
		if(n < 0){
			fprint(2, "mapping registers: %r\n");
			goto noregs;
		}
		if((r = mallocz(sizeof *r, 1)) == nil)
			return -1;
		r->r.rw = _uregrw;
		r->ureg = u;	
		*rp = &r->r;
	}
noregs:
	return 0;
}
