| #include <u.h> |
| #include <libc.h> |
| #include <mach.h> |
| #include "elf.h" |
| #include "ureg386.h" |
| |
| typedef struct Lreg Lreg; |
| typedef struct Status Status; |
| typedef struct Psinfo Psinfo; |
| |
| /* |
| * UregLinux386 is 64-bit aligned within status, so we shouldn't |
| * have any packing problems. |
| */ |
| struct Status |
| { |
| u32int signo; |
| u32int code; |
| u32int errno; |
| u32int cursig; |
| u32int sigpend; |
| u32int sighold; |
| u32int pid; |
| u32int ppid; |
| u32int pgrp; |
| u32int sid; |
| u32int utime[2]; |
| u32int stime[2]; |
| u32int cutime[2]; |
| u32int cstime[2]; |
| UregLinux386 reg; |
| u32int fpvalid; |
| }; |
| |
| struct Psinfo |
| { |
| char state; |
| char sname; |
| char zomb; |
| char nice; |
| u32int flag; |
| u16int uid; |
| u16int gid; |
| u32int pid; |
| u32int ppid; |
| u32int pgrp; |
| u32int sid; |
| char fname[16]; |
| char psargs[80]; |
| }; |
| |
| int |
| coreregslinux386(Elf *elf, ElfNote *note, uchar **up) |
| { |
| Status *s; |
| UregLinux386 *l; |
| Ureg *u; |
| |
| if(note->descsz < sizeof(Status)){ |
| werrstr("elf status note too small"); |
| return -1; |
| } |
| s = (Status*)note->desc; |
| l = &s->reg; |
| if((u = _linux2ureg386(l)) == nil) |
| return -1; |
| *up = (uchar*)u; |
| return sizeof(Ureg); |
| } |
| |
| int |
| corecmdlinux386(Elf *elf, ElfNote *note, char **pp) |
| { |
| char *t; |
| Psinfo *p; |
| |
| *pp = nil; |
| if(note->descsz < sizeof(Psinfo)){ |
| werrstr("elf psinfo note too small"); |
| return -1; |
| } |
| p = (Psinfo*)note->desc; |
| print("elf name %s\nelf args %s\n", p->fname, p->psargs); |
| t = malloc(80+1); |
| if(t == nil) |
| return -1; |
| memmove(t, p->psargs, 80); |
| t[80] = 0; |
| *pp = t; |
| return 0; |
| } |
| |