aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/elfcorefreebsd386.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-12-25 22:03:28 +0000
committerrsc <devnull@localhost>2004-12-25 22:03:28 +0000
commit1cc215aaf92a6cf3cea436f2c215a84839fd59bc (patch)
treedd8524135949b5bd7b3cb3b23e02b09f9646891e /src/libmach/elfcorefreebsd386.c
parentcdf1805191ba4ab5b8fbb1697a95fe0d32e25ee6 (diff)
downloadplan9port-1cc215aaf92a6cf3cea436f2c215a84839fd59bc.tar.gz
plan9port-1cc215aaf92a6cf3cea436f2c215a84839fd59bc.tar.bz2
plan9port-1cc215aaf92a6cf3cea436f2c215a84839fd59bc.zip
better unwinding for 386.
command-line extraction from core files on linux and freebsd. move linux ureg into ureg386.h (used in many places).
Diffstat (limited to 'src/libmach/elfcorefreebsd386.c')
-rw-r--r--src/libmach/elfcorefreebsd386.c47
1 files changed, 39 insertions, 8 deletions
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;
+}
+