Blame


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