diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2008-02-25 22:20:13 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2008-02-25 22:20:13 +0000 |
| commit | 38bfd8f7ccf380cd66ec0b899a11c77395ed8310 (patch) | |
| tree | 8bf25449efb4c48c1329985e973d75617e4d58bd /gnu | |
| parent | 7096d9f932d0a3d7f75ab8dd9d8fefdbe136a49a (diff) | |
Notes
Diffstat (limited to 'gnu')
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/Makefile | 2 | ||||
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/kgdb.h | 5 | ||||
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/kthr.c | 12 | ||||
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/main.c | 11 | ||||
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/trgt.c | 18 | ||||
| -rw-r--r-- | gnu/usr.bin/gdb/kgdb/trgt_i386.c | 4 |
6 files changed, 35 insertions, 17 deletions
diff --git a/gnu/usr.bin/gdb/kgdb/Makefile b/gnu/usr.bin/gdb/kgdb/Makefile index 8093f9ce2b57..955394a5d9fa 100644 --- a/gnu/usr.bin/gdb/kgdb/Makefile +++ b/gnu/usr.bin/gdb/kgdb/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ PROG= kgdb${GDB_SUFFIX} -SRCS= main.c kthr.c trgt.c trgt_${TARGET_ARCH}.c +SRCS= main.c kld.c kthr.c trgt.c trgt_${TARGET_ARCH}.c WARNS?= 2 BULIBS= ${OBJ_BU}/libbfd/libbfd.a ${OBJ_BU}/libopcodes/libopcodes.a \ diff --git a/gnu/usr.bin/gdb/kgdb/kgdb.h b/gnu/usr.bin/gdb/kgdb/kgdb.h index d723a5ff7fa4..0c324e6e41a8 100644 --- a/gnu/usr.bin/gdb/kgdb/kgdb.h +++ b/gnu/usr.bin/gdb/kgdb/kgdb.h @@ -32,6 +32,8 @@ struct thread_info; extern kvm_t *kvm; +extern char *kernel; +extern bfd *kern_bfd; struct kthr { struct kthr *next; @@ -46,6 +48,8 @@ struct kthr { extern struct kthr *curkthr; +void kgdb_add_kld_cmd(char *, int); +void kgdb_kld_init(void); void kgdb_target(void); void kgdb_trgt_fetch_registers(int); void kgdb_trgt_store_registers(int); @@ -63,5 +67,6 @@ struct kthr *kgdb_thr_select(struct kthr *); char *kgdb_thr_extra_thread_info(int); uintptr_t kgdb_lookup(const char *sym); +CORE_ADDR kgdb_parse(const char *exp); #endif /* _KGDB_H_ */ diff --git a/gnu/usr.bin/gdb/kgdb/kthr.c b/gnu/usr.bin/gdb/kgdb/kthr.c index 4c7f55656d1a..734d5dd64fb7 100644 --- a/gnu/usr.bin/gdb/kgdb/kthr.c +++ b/gnu/usr.bin/gdb/kgdb/kthr.c @@ -59,10 +59,8 @@ kgdb_lookup(const char *sym) nl[0].n_name = (char *)(uintptr_t)sym; nl[1].n_name = NULL; - if (kvm_nlist(kvm, nl) != 0) { - warnx("kvm_nlist(%s): %s", sym, kvm_geterr(kvm)); + if (kvm_nlist(kvm, nl) != 0) return (0); - } return (nl[0].n_value); } @@ -81,13 +79,17 @@ kgdb_thr_init(void) uintptr_t addr, paddr; addr = kgdb_lookup("_allproc"); - if (addr == 0) + if (addr == 0) { + warnx("kvm_nlist(_allproc): %s", kvm_geterr(kvm)); return (NULL); + } kvm_read(kvm, addr, &paddr, sizeof(paddr)); dumppcb = kgdb_lookup("_dumppcb"); - if (dumppcb == 0) + if (dumppcb == 0) { + warnx("kvm_nlist(_dumppcb): %s", kvm_geterr(kvm)); return (NULL); + } addr = kgdb_lookup("_dumptid"); if (addr != 0) diff --git a/gnu/usr.bin/gdb/kgdb/main.c b/gnu/usr.bin/gdb/kgdb/main.c index 12bc3c468f91..5e1c9c6b2687 100644 --- a/gnu/usr.bin/gdb/kgdb/main.c +++ b/gnu/usr.bin/gdb/kgdb/main.c @@ -72,10 +72,11 @@ kvm_t *kvm; static char kvm_err[_POSIX2_LINE_MAX]; static int dumpnr; +static int quiet; static int verbose; static char crashdir[PATH_MAX]; -static char *kernel; +char *kernel; static char *remote; static char *vmcore; @@ -178,7 +179,7 @@ out: kgdb_new_objfile_chain(objfile); } -static CORE_ADDR +CORE_ADDR kgdb_parse(const char *exp) { struct cleanup *old_chain; @@ -203,7 +204,6 @@ static void kgdb_init_target(void) { CORE_ADDR bufp; - bfd *kern_bfd; int size, rseq, wseq; int kern_desc; char c; @@ -227,7 +227,6 @@ kgdb_init_target(void) } set_gdbarch_from_file (kern_bfd); - bfd_close(kern_bfd); symbol_file_add_main (kernel, 0); if (remote) @@ -239,6 +238,8 @@ kgdb_init_target(void) * Display the unread portion of the message buffer. This gives the * user a some initial data to work from. */ + if (quiet) + return; bufp = kgdb_parse("msgbufp->msg_ptr"); size = (int)kgdb_parse("msgbufp->msg_size"); rseq = (int)kgdb_parse("msgbufp->msg_rseq"); @@ -302,7 +303,7 @@ main(int argc, char *argv[]) struct stat st; struct captured_main_args args; char *s; - int a, ch, quiet, writecore; + int a, ch, writecore; dumpnr = -1; diff --git a/gnu/usr.bin/gdb/kgdb/trgt.c b/gnu/usr.bin/gdb/kgdb/trgt.c index f79e4345d1b5..a312767c43c8 100644 --- a/gnu/usr.bin/gdb/kgdb/trgt.c +++ b/gnu/usr.bin/gdb/kgdb/trgt.c @@ -31,10 +31,12 @@ __FBSDID("$FreeBSD$"); #include <sys/proc.h> #include <sys/sysctl.h> #include <sys/user.h> +#include <err.h> #include <kvm.h> #include <defs.h> #include <command.h> +#include <exec.h> #include <frame-unwind.h> #include <gdbthread.h> #include <inferior.h> @@ -45,6 +47,8 @@ __FBSDID("$FreeBSD$"); static struct target_ops kgdb_trgt_ops; +bfd *kern_bfd; + #define KERNOFF (kgdb_kernbase ()) #define INKERNEL(x) ((x) >= KERNOFF) @@ -81,11 +85,8 @@ kgdb_trgt_extra_thread_info(struct thread_info *ti) static void kgdb_trgt_files_info(struct target_ops *target) { - struct target_ops *tb; - tb = find_target_beneath(target); - if (tb->to_files_info != NULL) - tb->to_files_info(tb); + print_section_info(target, kern_bfd); } static void @@ -207,7 +208,7 @@ kgdb_target(void) kgdb_trgt_ops.to_magic = OPS_MAGIC; kgdb_trgt_ops.to_shortname = "kernel"; - kgdb_trgt_ops.to_longname = "kernel core files."; + kgdb_trgt_ops.to_longname = "kernel core files"; kgdb_trgt_ops.to_doc = "Kernel core files."; kgdb_trgt_ops.to_stratum = thread_stratum; kgdb_trgt_ops.to_has_memory = 1; @@ -222,6 +223,12 @@ kgdb_target(void) kgdb_trgt_ops.to_store_registers = kgdb_trgt_store_registers; kgdb_trgt_ops.to_thread_alive = kgdb_trgt_thread_alive; kgdb_trgt_ops.to_xfer_memory = kgdb_trgt_xfer_memory; + + if (build_section_table(kern_bfd, &kgdb_trgt_ops.to_sections, + &kgdb_trgt_ops.to_sections_end) != 0) + errx(1, "\"%s\": can't find the file sections: %s", + kernel, bfd_errmsg(bfd_get_error())); + add_target(&kgdb_trgt_ops); push_target(&kgdb_trgt_ops); @@ -236,4 +243,5 @@ kgdb_target(void) "Set current process context"); add_com ("tid", class_obscure, kgdb_set_tid_cmd, "Set current thread context"); + kgdb_kld_init(); } diff --git a/gnu/usr.bin/gdb/kgdb/trgt_i386.c b/gnu/usr.bin/gdb/kgdb/trgt_i386.c index c3581b5e9f51..de15a63cef96 100644 --- a/gnu/usr.bin/gdb/kgdb/trgt_i386.c +++ b/gnu/usr.bin/gdb/kgdb/trgt_i386.c @@ -141,8 +141,10 @@ kgdb_trgt_fetch_tss(void) */ if (trunc_page(tss) == 0xffc00000) { addr = kgdb_lookup("_cpu0prvpage"); - if (addr == 0) + if (addr == 0) { + warnx("kvm_nlist(_cpu0prvpage): %s", kvm_geterr(kvm)); return (0); + } if (kvm_read(kvm, addr, &cpu0prvpage, sizeof(cpu0prvpage)) != sizeof(cpu0prvpage)) { warnx("kvm_read: %s", kvm_geterr(kvm)); |
