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