aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/elfcorelinux386.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-23 22:33:04 +0000
committerrsc <devnull@localhost>2005-01-23 22:33:04 +0000
commitdd944ec72a26d0b380ba2af5f6c00310f2f1651e (patch)
tree2f40332ca2fcf189d347cf4f577cf613af21108f /src/libmach/elfcorelinux386.c
parenta0e8d02d093e01fdadf8a16bc86fe18b0c4e82c3 (diff)
downloadplan9port-dd944ec72a26d0b380ba2af5f6c00310f2f1651e.tar.gz
plan9port-dd944ec72a26d0b380ba2af5f6c00310f2f1651e.tar.bz2
plan9port-dd944ec72a26d0b380ba2af5f6c00310f2f1651e.zip
Start working through proper handling of pthreads when
debugging Linux core dumps. Pthreads for active processes is still not supported, nor are other systems.
Diffstat (limited to 'src/libmach/elfcorelinux386.c')
-rw-r--r--src/libmach/elfcorelinux386.c109
1 files changed, 108 insertions, 1 deletions
diff --git a/src/libmach/elfcorelinux386.c b/src/libmach/elfcorelinux386.c
index 9e8d0aa9..4c4aabc4 100644
--- a/src/libmach/elfcorelinux386.c
+++ b/src/libmach/elfcorelinux386.c
@@ -34,6 +34,10 @@ struct Status
UregLinux386 reg;
u32int fpvalid;
};
+enum
+{
+ StatusSize = sizeof(Status),
+};
struct Psinfo
{
@@ -51,6 +55,10 @@ struct Psinfo
char fname[16];
char psargs[80];
};
+enum
+{
+ PsinfoSize = sizeof(Psinfo),
+};
int
coreregslinux386(Elf *elf, ElfNote *note, uchar **up)
@@ -65,8 +73,9 @@ coreregslinux386(Elf *elf, ElfNote *note, uchar **up)
}
s = (Status*)note->desc;
l = &s->reg;
- if((u = _linux2ureg386(l)) == nil)
+ if((u = malloc(sizeof *u)) == nil)
return -1;
+ linux2ureg386(l, u);
*up = (uchar*)u;
return sizeof(Ureg);
}
@@ -93,3 +102,101 @@ corecmdlinux386(Elf *elf, ElfNote *note, char **pp)
return 0;
}
+#define dprint if(0)print
+
+void
+elfcorelinux386(Fhdr *fp, Elf *elf, ElfNote *note)
+{
+ int i;
+ Psinfo *ps;
+ Status *st;
+ Mach *m;
+ Ureg *u;
+
+ m = fp->mach;
+ dprint("%s ", note->name);
+ switch(note->type){
+ case ElfNotePrPsinfo:
+ ps = (Psinfo*)note->desc;
+ dprint("note info\n");
+ dprint("state=%d sname=%d zomb=%d nice=%d\n",
+ ps->state, ps->sname, ps->zomb, ps->nice);
+ dprint("flag=0x%ux uid=%ud gid=%ud pid=%ud ppid=%ud pgrp=%ud sid=%ud\n",
+ (uint)m->swap4(ps->flag),
+ (uint)m->swap2(ps->uid),
+ (uint)m->swap2(ps->gid),
+ (uint)m->swap4(ps->pid),
+ (uint)m->swap4(ps->ppid),
+ (uint)m->swap4(ps->pgrp),
+ (uint)m->swap4(ps->sid));
+ dprint("fname=%s psargs=%s\n", ps->fname, ps->psargs);
+ fp->pid = m->swap4(ps->pid);
+ if((fp->prog = strdup(ps->fname)) == nil)
+ fprint(2, "warning: out of memory saving core program name\n");
+ if((fp->cmdline = strdup(ps->psargs)) == nil)
+ fprint(2, "warning: out of memory saving core command line\n");
+ break;
+ case ElfNotePrTaskstruct:
+ dprint("note taskstruct\n");
+ break;
+ case ElfNotePrAuxv:
+ dprint("note auxv\n");
+ break;
+ case ElfNotePrStatus:
+ dprint("note status\n");
+ if(note->descsz < StatusSize){
+ dprint("too small\n");
+ break;
+ }
+ st = (Status*)note->desc;
+ dprint("sig=%ud code=%ud errno=%ud cursig=%ud sigpend=0x%ux sighold=0x%ux\n",
+ (uint)m->swap4(st->signo),
+ (uint)m->swap4(st->code),
+ (uint)m->swap4(st->errno),
+ (uint)m->swap4(st->cursig),
+ (uint)m->swap4(st->sigpend),
+ (uint)m->swap4(st->sighold));
+ dprint("pid=%ud ppid=%ud pgrp=%ud sid=%ud\n",
+ (uint)m->swap4(st->pid),
+ (uint)m->swap4(st->ppid),
+ (uint)m->swap4(st->pgrp),
+ (uint)m->swap4(st->sid));
+ dprint("utime=%ud.%06ud stime=%ud.%06ud cutime=%ud.%06ud cstime=%ud.%06ud\n",
+ (uint)m->swap4(st->utime[0]),
+ (uint)m->swap4(st->utime[1]),
+ (uint)m->swap4(st->stime[0]),
+ (uint)m->swap4(st->stime[1]),
+ (uint)m->swap4(st->cutime[0]),
+ (uint)m->swap4(st->cutime[1]),
+ (uint)m->swap4(st->cstime[0]),
+ (uint)m->swap4(st->cstime[1]));
+ dprint("fpvalid=%ud\n",
+ (uint)m->swap4(st->fpvalid));
+ if((fp->thread = realloc(fp->thread, (1+fp->nthread)*sizeof(fp->thread[0]))) == nil){
+ fprint(2, "warning: out of memory saving thread info\n");
+ return;
+ }
+ i = fp->nthread;
+ fp->thread[i].id = m->swap4(st->pid);
+ u = malloc(sizeof *u);
+ if(u == nil){
+ fprint(2, "warning: out of memory saving thread info\n");
+ return;
+ }
+ fp->thread[i].ureg = u;
+ linux2ureg386(&st->reg, u);
+ fp->nthread++;
+ break;
+ case ElfNotePrFpreg:
+ dprint("note fpreg\n");
+ /* XXX maybe record floating-point registers eventually */
+ break;
+ case ElfNotePrXfpreg:
+ dprint("note xfpreg\n");
+ /* XXX maybe record floating-point registers eventually */
+ break;
+ default:
+ dprint("note %d\n", note->type);
+ }
+}
+