Changeset View
Changeset View
Standalone View
Standalone View
gnu/usr.bin/gdb/kgdb/trgt.c
Show First 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | |||||
static struct target_ops kgdb_trgt_ops; | static struct target_ops kgdb_trgt_ops; | ||||
kvm_t *kvm; | kvm_t *kvm; | ||||
static char kvm_err[_POSIX2_LINE_MAX]; | static char kvm_err[_POSIX2_LINE_MAX]; | ||||
#define KERNOFF (kgdb_kernbase ()) | #define KERNOFF (kgdb_kernbase ()) | ||||
#define PINKERNEL(x) ((x) >= KERNOFF) | #define PINKERNEL(x) ((x) >= KERNOFF) | ||||
static int | |||||
kgdb_resolve_symbol(const char *name, kvaddr_t *kva) | |||||
{ | |||||
struct minimal_symbol *ms; | |||||
ms = lookup_minimal_symbol (name, NULL, NULL); | |||||
if (ms == NULL) | |||||
return (1); | |||||
*kva = SYMBOL_VALUE_ADDRESS (ms); | |||||
return (0);; | |||||
} | |||||
static CORE_ADDR | static CORE_ADDR | ||||
kgdb_kernbase (void) | kgdb_kernbase (void) | ||||
{ | { | ||||
static CORE_ADDR kernbase; | static CORE_ADDR kernbase; | ||||
struct minimal_symbol *sym; | struct minimal_symbol *sym; | ||||
if (kernbase == 0) { | if (kernbase == 0) { | ||||
sym = lookup_minimal_symbol ("kernbase", NULL, NULL); | sym = lookup_minimal_symbol ("kernbase", NULL, NULL); | ||||
Show All 26 Lines | kgdb_trgt_open(char *filename, int from_tty) | ||||
if (filename[0] != '/') { | if (filename[0] != '/') { | ||||
temp = concat (current_directory, "/", filename, NULL); | temp = concat (current_directory, "/", filename, NULL); | ||||
xfree(filename); | xfree(filename); | ||||
filename = temp; | filename = temp; | ||||
} | } | ||||
old_chain = make_cleanup (xfree, filename); | old_chain = make_cleanup (xfree, filename); | ||||
nkvm = kvm_openfiles(bfd_get_filename(exec_bfd), filename, NULL, | nkvm = kvm_open2(bfd_get_filename(exec_bfd), filename, | ||||
write_files ? O_RDWR : O_RDONLY, kvm_err); | write_files ? O_RDWR : O_RDONLY, kvm_err, kgdb_resolve_symbol); | ||||
if (nkvm == NULL) | if (nkvm == NULL) | ||||
error ("Failed to open vmcore: %s", kvm_err); | error ("Failed to open vmcore: %s", kvm_err); | ||||
/* Don't free the filename now and close any previous vmcore. */ | /* Don't free the filename now and close any previous vmcore. */ | ||||
discard_cleanups(old_chain); | discard_cleanups(old_chain); | ||||
unpush_target(&kgdb_trgt_ops); | unpush_target(&kgdb_trgt_ops); | ||||
kvm = nkvm; | kvm = nkvm; | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | kgdb_trgt_xfer_memory(CORE_ADDR memaddr, char *myaddr, int len, int write, | ||||
struct mem_attrib *attrib, struct target_ops *target) | struct mem_attrib *attrib, struct target_ops *target) | ||||
{ | { | ||||
struct target_ops *tb; | struct target_ops *tb; | ||||
if (kvm != NULL) { | if (kvm != NULL) { | ||||
if (len == 0) | if (len == 0) | ||||
return (0); | return (0); | ||||
if (!write) | if (!write) | ||||
return (kvm_read(kvm, memaddr, myaddr, len)); | return (kvm_read2(kvm, memaddr, myaddr, len)); | ||||
else | else | ||||
return (kvm_write(kvm, memaddr, myaddr, len)); | return (kvm_write(kvm, memaddr, myaddr, len)); | ||||
} | } | ||||
tb = find_target_beneath(target); | tb = find_target_beneath(target); | ||||
return (tb->to_xfer_memory(memaddr, myaddr, len, write, attrib, tb)); | return (tb->to_xfer_memory(memaddr, myaddr, len, write, attrib, tb)); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 118 Lines • Show Last 20 Lines |