Date: Sun, 13 Jun 2004 19:15:44 GMT From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 54840 for review Message-ID: <200406131915.i5DJFiNb029959@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=54840 Change 54840 by marcel@marcel_nfs on 2004/06/13 19:15:17 Use the PCB instead of the trapframe for thread context. Add support for using dumppcb and dumptid. This allows us to set the current thread to the one that did the kernel dump and also use the saved context. Note that the kernel currently doesn't save dumptid. Affected files ... .. //depot/projects/gdb/usr.bin/kgdb/kgdb.h#7 edit .. //depot/projects/gdb/usr.bin/kgdb/kthr.c#4 edit .. //depot/projects/gdb/usr.bin/kgdb/md_i386.c#5 edit Differences ... ==== //depot/projects/gdb/usr.bin/kgdb/kgdb.h#7 (text+ko) ==== @@ -107,13 +107,13 @@ extern kvm_t *kvm; extern int verbose; -struct trapframe; +struct pcb; struct kthr { struct kthr *next; uintptr_t kaddr; - struct trapframe *td_frame; uintptr_t td_kstack; + struct pcb *td_pcb; int td_tid; }; ==== //depot/projects/gdb/usr.bin/kgdb/kthr.c#4 (text+ko) ==== @@ -37,10 +37,13 @@ #include <stdio.h> #include <stdlib.h> -#include <machine/frame.h> +#include <machine/pcb.h> #include "kgdb.h" +struct pcb *dumppcb; +int dumptid; + static struct kthr *first; struct kthr *curkthr; @@ -53,7 +56,7 @@ struct kthr * kgdb_thr_init(void) { - struct nlist nl[2]; + struct nlist nl[3]; struct proc p; struct thread td; struct kthr *thr; @@ -67,25 +70,38 @@ } kvm_read(kvm, nl[0].n_value, &paddr, sizeof(paddr)); + nl[0].n_name = (char *)(uintptr_t)"_dumppcb"; + nl[1].n_name = (char *)(uintptr_t)"_dumptid"; + nl[2].n_name = NULL; + if (kvm_nlist(kvm, nl) != 0) { + warnx(kvm_geterr(kvm)); + dumppcb = NULL; + dumptid = -1; + } else { + dumppcb = (struct pcb *)(nl[0].n_value); + kvm_read(kvm, nl[1].n_value, &dumptid, sizeof(dumptid)); + } + while (paddr != 0) { kvm_read(kvm, paddr, &p, sizeof(p)); tdaddr = (uintptr_t)TAILQ_FIRST(&p.p_threads); while (tdaddr != 0) { kvm_read(kvm, tdaddr, &td, sizeof(td)); - if (td.td_last_frame != NULL) { - thr = malloc(sizeof(*thr)); - thr->next = first; - thr->kaddr = tdaddr; - thr->td_frame = td.td_last_frame; - thr->td_kstack = td.td_kstack; - thr->td_tid = td.td_tid; - first = thr; - } + thr = malloc(sizeof(*thr)); + thr->next = first; + thr->kaddr = tdaddr; + thr->td_pcb = (td.td_tid == dumptid) ? dumppcb : + td.td_pcb; + thr->td_kstack = td.td_kstack; + thr->td_tid = td.td_tid; + first = thr; tdaddr = (uintptr_t)TAILQ_NEXT(&td, td_plist); } paddr = (uintptr_t)LIST_NEXT(&p, p_list); } - curkthr = first; + curkthr = kgdb_thr_lookup(dumptid); + if (curkthr == NULL) + curkthr = first; return (first); } ==== //depot/projects/gdb/usr.bin/kgdb/md_i386.c#5 (text+ko) ==== @@ -33,60 +33,32 @@ #include <inttypes.h> #include <kvm.h> #include <stdio.h> -#include <machine/frame.h> #include <machine/gdb_machdep.h> +#include <machine/pcb.h> #include <machine/psl.h> #include <machine/segments.h> #include "kgdb.h" -static int -getreg(int *addr) -{ - int val; - - kvm_read(kvm, (uintptr_t)addr, &val, sizeof(val)); - return (val); -} - void * gdb_cpu_getreg(int regnum, size_t *regsz) { - struct trapframe *tf = curkthr->td_frame; - int cs; *regsz = gdb_cpu_regsz(regnum); switch (regnum) { - case 0: return (&tf->tf_eax); - case 1: return (&tf->tf_ecx); - case 2: return (&tf->tf_edx); - case 3: return (&tf->tf_ebx); - case 5: return (&tf->tf_ebp); - case 6: return (&tf->tf_esi); - case 7: return (&tf->tf_edi); - case 8: return (&tf->tf_eip); - case 9: return (&tf->tf_eflags); - case 10: return (&tf->tf_cs); - case 12: return (&tf->tf_ds); - case 13: return (&tf->tf_es); - case 4: - cs = getreg(&tf->tf_cs); - return (!ISPL(cs)) ? &tf->tf_ebp : &tf->tf_esp; - case 11: - cs = getreg(&tf->tf_cs); - return (!ISPL(cs)) ? &tf->tf_ds : &tf->tf_ss; + case 3: return (&curkthr->td_pcb->pcb_ebx); + case 4: return (&curkthr->td_pcb->pcb_esp); + case 5: return (&curkthr->td_pcb->pcb_ebp); + case 6: return (&curkthr->td_pcb->pcb_esi); + case 7: return (&curkthr->td_pcb->pcb_edi); + case 8: return (&curkthr->td_pcb->pcb_eip); } return (NULL); } void -gdb_cpu_setreg(int regnum, register_t val) +gdb_cpu_setreg(int regnum __unused, register_t val __unused) { - struct trapframe *tf = curkthr->td_frame; - - switch (regnum) { - case GDB_REG_PC: tf->tf_eip = val; break; - } } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200406131915.i5DJFiNb029959>