summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2008-02-25 22:20:13 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2008-02-25 22:20:13 +0000
commit38bfd8f7ccf380cd66ec0b899a11c77395ed8310 (patch)
tree8bf25449efb4c48c1329985e973d75617e4d58bd /gnu
parent7096d9f932d0a3d7f75ab8dd9d8fefdbe136a49a (diff)
Notes
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/gdb/kgdb/Makefile2
-rw-r--r--gnu/usr.bin/gdb/kgdb/kgdb.h5
-rw-r--r--gnu/usr.bin/gdb/kgdb/kthr.c12
-rw-r--r--gnu/usr.bin/gdb/kgdb/main.c11
-rw-r--r--gnu/usr.bin/gdb/kgdb/trgt.c18
-rw-r--r--gnu/usr.bin/gdb/kgdb/trgt_i386.c4
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));