URI:
       telfcorefreebsd386.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       telfcorefreebsd386.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 }