plan9port

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

elfcorefreebsdamd64.c (2712B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <mach.h>
      4 #include "elf.h"
      5 #include "uregamd64.h"
      6 
      7 typedef struct Ureg Ureg;
      8 
      9 // See FreeBSD's sys/procfs.h.
     10 
     11 typedef struct Lreg Lreg;
     12 typedef struct Status Status;
     13 typedef struct Psinfo Psinfo;
     14 
     15 struct Lreg
     16 {
     17 	u64int	r15;
     18 	u64int	r14;
     19 	u64int	r13;
     20 	u64int	r12;
     21 	u64int	r11;
     22 	u64int	r10;
     23 	u64int	r9;
     24 	u64int	r8;
     25 	u64int	rdi;
     26 	u64int	rsi;
     27 	u64int	rbp;
     28 	u64int	rbx;
     29 	u64int	rdx;
     30 	u64int	rcx;
     31 	u64int	rax;
     32 	u32int	trapno;
     33 	u16int	fs;
     34 	u16int	gs;
     35 	u32int	err;
     36 	u16int	es;
     37 	u16int	ds;
     38 	u64int	rip;
     39 	u64int	cs;
     40 	u64int	rflags;
     41 	u64int	rsp;
     42 	u64int	ss;
     43 };
     44 
     45 struct Status
     46 {
     47 	u32int		version;	/* Version number of struct (1) */
     48 	u64int		statussz;	/* sizeof(prstatus_t) (1) */
     49 	u64int		gregsetsz;	/* sizeof(gregset_t) (1) */
     50 	u64int		fpregsetsz;	/* sizeof(fpregset_t) (1) */
     51 	u32int		osreldate;	/* Kernel version (1) */
     52 	u32int		cursig;	/* Current signal (1) */
     53 	u32int		pid;		/* Process ID (1) */
     54 	Lreg		reg;		/* General purpose registers (1) */
     55 };
     56 
     57 struct Psinfo
     58 {
     59 	u32int	version;
     60 	u64int	size;
     61 	char	name[17];
     62 	char	psargs[81];
     63 };
     64 
     65 void
     66 elfcorefreebsdamd64(Fhdr *fp, Elf *elf, ElfNote *note)
     67 {
     68 	Status *s;
     69 	Lreg *l;
     70 	Ureg *u;
     71 	int i;
     72 
     73 	switch(note->type) {
     74 	case ElfNotePrStatus:
     75 		if(note->descsz < sizeof(Status)){
     76 			fprint(2, "warning: elf status note too small\n");
     77 			break;
     78 		}
     79 		s = (Status*)note->desc;
     80 		if(s->version != 1){
     81 			fprint(2, "warning: unknown elf note status version %ud\n", (uint)s->version);
     82 			break;
     83 		}
     84 		l = &s->reg;
     85 		u = malloc(sizeof(Ureg));
     86 
     87 		/* no byte order problems - just copying and rearranging */
     88 		u->ax = l->rax;
     89 		u->bx = l->rbx;
     90 		u->cx = l->rcx;
     91 		u->dx = l->rdx;
     92 		u->si = l->rsi;
     93 		u->di = l->rdi;
     94 		u->bp = l->rbp;
     95 		u->r8 = l->r8;
     96 		u->r9 = l->r9;
     97 		u->r10 = l->r10;
     98 		u->r11 = l->r11;
     99 		u->r12 = l->r12;
    100 		u->r13 = l->r13;
    101 		u->r14 = l->r14;
    102 		u->r15 = l->r15;
    103 
    104 		u->ds = l->ds;
    105 		u->es = l->es;
    106 		u->fs = l->fs;
    107 		u->gs = l->gs;
    108 
    109 		u->type = l->trapno;
    110 		u->error = l->err;
    111 		u->ip = l->rip;
    112 		u->cs = l->cs;
    113 		u->flags = l->rflags;
    114 		u->sp = l->rsp;
    115 		u->ss = l->ss;
    116 
    117 		if((fp->thread = realloc(fp->thread, (1+fp->nthread)*sizeof(fp->thread[0]))) == nil){
    118 			fprint(2, "warning: out of memory saving thread info\n");
    119 			return;
    120 		}
    121 		i = fp->nthread;
    122 		fp->thread[i].id = s->pid;
    123 		fp->thread[i].ureg = u;
    124 		fp->nthread++;
    125 		break;
    126 	}
    127 }
    128 
    129 int
    130 corecmdfreebsd386(Elf *elf, ElfNote *note, char **pp)
    131 {
    132 	char *t;
    133 	Psinfo *p;
    134 
    135 	*pp = nil;
    136 	if(note->descsz < sizeof(Psinfo)){
    137 		werrstr("elf psinfo note too small");
    138 		return -1;
    139 	}
    140 	p = (Psinfo*)note->desc;
    141 	/* print("elf name %s\nelf args %s\n", p->name, p->psargs); */
    142 	t = malloc(80+1);
    143 	if(t == nil)
    144 		return -1;
    145 	memmove(t, p->psargs, 80);
    146 	t[80] = 0;
    147 	*pp = t;
    148 	return 0;
    149 }