plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

elfcorefreebsd386.c (2119B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <mach.h>
      4 #include "elf.h"
      5 #include "ureg386.h"
      6 
      7 typedef struct Lreg Lreg;
      8 typedef struct Status Status;
      9 typedef struct Psinfo Psinfo;
     10 
     11 struct Lreg
     12 {
     13 	u32int	fs;
     14 	u32int	es;
     15 	u32int	ds;
     16 	u32int	edi;
     17 	u32int	esi;
     18 	u32int	ebp;
     19 	u32int	isp;
     20 	u32int	ebx;
     21 	u32int	edx;
     22 	u32int	ecx;
     23 	u32int	eax;
     24 	u32int	trapno;
     25 	u32int	err;
     26 	u32int	eip;
     27 	u32int	cs;
     28 	u32int	eflags;
     29 	u32int	esp;
     30 	u32int	ss;
     31 	u32int	gs;
     32 };
     33 
     34 struct Status
     35 {
     36 	u32int		version;	/* Version number of struct (1) */
     37 	u32int		statussz;	/* sizeof(prstatus_t) (1) */
     38 	u32int		gregsetsz;	/* sizeof(gregset_t) (1) */
     39 	u32int		fpregsetsz;	/* sizeof(fpregset_t) (1) */
     40 	u32int		osreldate;	/* Kernel version (1) */
     41 	u32int		cursig;	/* Current signal (1) */
     42 	u32int		pid;		/* Process ID (1) */
     43 	Lreg		reg;		/* General purpose registers (1) */
     44 };
     45 
     46 struct Psinfo
     47 {
     48 	u32int	version;
     49 	u32int	size;
     50 	char	name[17];
     51 	char	psargs[81];
     52 };
     53 
     54 int
     55 coreregsfreebsd386(Elf *elf, ElfNote *note, uchar **up)
     56 {
     57 	Status *s;
     58 	Lreg *l;
     59 	Ureg *u;
     60 
     61 	if(note->descsz < sizeof(Status)){
     62 		werrstr("elf status note too small");
     63 		return -1;
     64 	}
     65 	s = (Status*)note->desc;
     66 	if(s->version != 1){
     67 		werrstr("unknown status version %ud", (uint)s->version);
     68 		return -1;
     69 	}
     70 	l = &s->reg;
     71 	u = malloc(sizeof(Ureg));
     72 	if(u == nil)
     73 		return -1;
     74 
     75 	/* no byte order problems - just copying and rearranging */
     76 	u->di = l->edi;
     77 	u->si = l->esi;
     78 	u->bp = l->ebp;
     79 	u->nsp = l->esp;
     80 	u->bx = l->ebx;
     81 	u->dx = l->edx;
     82 	u->cx = l->ecx;
     83 	u->ax = l->eax;
     84 	u->gs = l->gs;
     85 	u->fs = l->fs;
     86 	u->es = l->es;
     87 	u->ds = l->ds;
     88 	u->trap = l->trapno;
     89 	u->ecode = l->err;
     90 	u->pc = l->eip;
     91 	u->cs = l->cs;
     92 	u->flags = l->eflags;
     93 	u->sp = l->esp;
     94 	u->ss = l->ss;
     95 	*up = (uchar*)u;
     96 	return sizeof(Ureg);
     97 }
     98 
     99 int
    100 corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)
    101 {
    102 	char *t;
    103 	Psinfo *p;
    104 
    105 	*pp = nil;
    106 	if(note->descsz < sizeof(Psinfo)){
    107 		werrstr("elf psinfo note too small");
    108 		return -1;
    109 	}
    110 	p = (Psinfo*)note->desc;
    111 	/* print("elf name %s\nelf args %s\n", p->name, p->psargs); */
    112 	t = malloc(80+1);
    113 	if(t == nil)
    114 		return -1;
    115 	memmove(t, p->psargs, 80);
    116 	t[80] = 0;
    117 	*pp = t;
    118 	return 0;
    119 }