Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
4 #include "elf.h"
5 #include "ureg386.h"
7 typedef struct Lreg Lreg;
8 typedef struct Status Status;
10 struct Lreg
11 {
12 u32int ebx;
13 u32int ecx;
14 u32int edx;
15 u32int esi;
16 u32int edi;
17 u32int ebp;
18 u32int eax;
19 u32int ds;
20 u32int es;
21 u32int fs;
22 u32int gs;
23 u32int origeax;
24 u32int eip;
25 u32int cs;
26 u32int eflags;
27 u32int esp;
28 u32int ss;
29 };
31 /*
32 * Lreg is 64-bit aligned within status, so we shouldn't
33 * have any packing problems.
34 */
35 struct Status
36 {
37 u32int signo;
38 u32int code;
39 u32int errno;
40 u32int cursig;
41 u32int sigpend;
42 u32int sighold;
43 u32int pid;
44 u32int ppid;
45 u32int pgrp;
46 u32int sid;
47 u32int utime[2];
48 u32int stime[2];
49 u32int cutime[2];
50 u32int cstime[2];
51 Lreg reg;
52 u32int fpvalid;
53 };
55 int
56 coreregslinux386(Elf *elf, ElfNote *note, uchar **up)
57 {
58 Status *s;
59 Lreg *l;
60 Ureg *u;
62 if(note->descsz < sizeof(Status)){
63 werrstr("elf status note too small");
64 return -1;
65 }
66 s = (Status*)note->desc;
67 l = &s->reg;
68 u = malloc(sizeof(Ureg));
69 if(u == nil)
70 return -1;
72 /* no byte order problems - just copying and rearranging */
73 u->di = l->edi;
74 u->si = l->esi;
75 u->bp = l->ebp;
76 u->nsp = l->esp;
77 u->bx = l->ebx;
78 u->dx = l->edx;
79 u->cx = l->ecx;
80 u->ax = l->eax;
81 u->gs = l->gs;
82 u->fs = l->fs;
83 u->es = l->es;
84 u->ds = l->ds;
85 u->trap = ~0; // l->trapno;
86 u->ecode = ~0; // l->err;
87 u->pc = l->eip;
88 u->cs = l->cs;
89 u->flags = l->eflags;
90 u->sp = l->esp;
91 u->ss = l->ss;
92 *up = (uchar*)u;
93 return sizeof(Ureg);
94 }