better unwinding for 386.

command-line extraction from core files on linux and freebsd.

move linux ureg into ureg386.h (used in many places).
This commit is contained in:
rsc 2004-12-25 22:03:28 +00:00
parent cdf1805191
commit 1cc215aaf9
13 changed files with 495 additions and 109 deletions

View file

@ -6,6 +6,7 @@
typedef struct Lreg Lreg;
typedef struct Status Status;
typedef struct Psinfo Psinfo;
struct Lreg
{
@ -32,14 +33,22 @@ struct Lreg
struct Status
{
u32int version; /* Version number of struct (1) */
u32int statussz; /* sizeof(prstatus_t) (1) */
u32int gregsetsz; /* sizeof(gregset_t) (1) */
u32int fpregsetsz; /* sizeof(fpregset_t) (1) */
u32int osreldate; /* Kernel version (1) */
u32int cursig; /* Current signal (1) */
u32int pid; /* Process ID (1) */
Lreg reg; /* General purpose registers (1) */
u32int version; /* Version number of struct (1) */
u32int statussz; /* sizeof(prstatus_t) (1) */
u32int gregsetsz; /* sizeof(gregset_t) (1) */
u32int fpregsetsz; /* sizeof(fpregset_t) (1) */
u32int osreldate; /* Kernel version (1) */
u32int cursig; /* Current signal (1) */
u32int pid; /* Process ID (1) */
Lreg reg; /* General purpose registers (1) */
};
struct Psinfo
{
u32int version;
u32int size;
char name[17];
char psargs[81];
};
int
@ -87,3 +96,25 @@ coreregsfreebsd386(Elf *elf, ElfNote *note, uchar **up)
return sizeof(Ureg);
}
int
corecmdfreebsd386(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->name, p->psargs);
t = malloc(80+1);
if(t == nil)
return -1;
memmove(t, p->psargs, 80);
t[80] = 0;
*pp = t;
return 0;
}