mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
90 lines
1.6 KiB
C
90 lines
1.6 KiB
C
|
#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);
|
||
|
}
|
||
|
|