From 1cc215aaf92a6cf3cea436f2c215a84839fd59bc Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 25 Dec 2004 22:03:28 +0000 Subject: better unwinding for 386. command-line extraction from core files on linux and freebsd. move linux ureg into ureg386.h (used in many places). --- src/libmach/elfcorefreebsd386.c | 47 ++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'src/libmach/elfcorefreebsd386.c') diff --git a/src/libmach/elfcorefreebsd386.c b/src/libmach/elfcorefreebsd386.c index 2ff746de..84f6c0fd 100644 --- a/src/libmach/elfcorefreebsd386.c +++ b/src/libmach/elfcorefreebsd386.c @@ -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; +} + -- cgit v1.2.3