36 #include "readline/readline.h"
37 #include <sys/param.h>
67 char errbuf[_POSIX2_LINE_MAX];
68 char *execfile = NULL;
70 char *filename = NULL;
78 filename = tilde_expand (arg);
79 if (filename[0] !=
'/')
88 temp_kd = kvm_openfiles (execfile, filename, NULL,
91 error ((
"%s"), errbuf);
93 bsd_kvm_corefile = filename;
112 if (kvm_close (core_kd) == -1)
113 warning ((
"%s"), kvm_geterr(core_kd));
125 ssize_t nbytes =
len;
128 nbytes = kvm_read (core_kd, addr, readbuf, nbytes);
129 if (writebuf && nbytes > 0)
130 nbytes = kvm_write (core_kd, addr, writebuf, nbytes);
136 const char *annex,
gdb_byte *readbuf,
165 if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0)
179 if (kvm_read (core_kd, (
unsigned long) paddr, &pcb,
sizeof pcb) == -1)
180 error ((
"%s"), kvm_geterr (core_kd));
188 struct regcache *regcache,
int regnum)
200 memset (nl, 0,
sizeof nl);
201 nl[0].n_name =
"_dumppcb";
203 if (kvm_nlist (core_kd, nl) == -1)
204 error ((
"%s"), kvm_geterr (core_kd));
206 if (nl[0].n_value != 0)
218 memset (nl, 0,
sizeof nl);
219 nl[0].n_name =
"_proc0paddr";
221 if (kvm_nlist (core_kd, nl) == -1)
222 error ((
"%s"), kvm_geterr (core_kd));
224 if (nl[0].n_value != 0)
229 if (kvm_read (core_kd, nl[0].n_value, &paddr,
sizeof paddr) == -1)
230 error ((
"%s"), kvm_geterr (core_kd));
236 #ifdef HAVE_STRUCT_THREAD_TD_PCB
242 memset (nl, 0,
sizeof nl);
243 nl[0].n_name =
"_thread0";
245 if (kvm_nlist (core_kd, nl) == -1)
246 error ((
"%s"), kvm_geterr (core_kd));
248 if (nl[0].n_value != 0)
253 nl[0].n_value += offsetof (
struct thread, td_pcb);
254 if (kvm_read (core_kd, nl[0].n_value, &paddr,
sizeof paddr) == -1)
255 error ((
"%s"), kvm_geterr (core_kd));
263 error (
_(
"Cannot find a valid PCB"));
276 #ifndef HAVE_STRUCT_THREAD_TD_PCB
287 error (
_(
"No kernel memory image."));
290 #ifdef HAVE_STRUCT_LWP
291 addr += offsetof (
struct lwp, l_addr);
293 addr += offsetof (
struct proc, p_addr);
296 if (kvm_read (core_kd, addr, &bsd_kvm_paddr,
sizeof bsd_kvm_paddr) == -1)
297 error ((
"%s"), kvm_geterr (core_kd));
315 error (
_(
"No kernel memory image."));
359 Optionally specify the filename of a core dump.");
376 Generic command for manipulating the kernel memory interface."),
377 &bsd_kvm_cmdlist,
"kvm ", 0, &
cmdlist);
379 #ifndef HAVE_STRUCT_THREAD_TD_PCB
381 _(
"Set current context from proc address"), &bsd_kvm_cmdlist);
385 _(
"Set current context from pcb address"), &bsd_kvm_cmdlist);
void error_no_arg(const char *why)
void add_target(struct target_ops *t)
struct cmd_list_element * add_prefix_cmd(const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, const char *doc, struct cmd_list_element **prefixlist, const char *prefixname, int allow_unknown, struct cmd_list_element **list)
static void bsd_kvm_proc_cmd(char *arg, int fromtty)
static void bsd_kvm_open(const char *arg, int from_tty)
static int(* bsd_kvm_supply_pcb)(struct regcache *regcache, struct pcb *pcb)
static ptid_t bsd_kvm_ptid
struct cmd_list_element * bsd_kvm_cmdlist
struct frame_info * get_selected_frame(const char *message)
int(* to_has_memory)(struct target_ops *)
void warning(const char *fmt,...)
char *(* to_pid_to_str)(struct target_ops *, ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
static void bsd_kvm_cmd(char *arg, int fromtty)
int(* to_has_stack)(struct target_ops *)
void push_target(struct target_ops *t)
void delete_thread_silent(ptid_t)
int unpush_target(struct target_ops *t)
static enum target_xfer_status bsd_kvm_xfer_partial(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
void(* to_close)(struct target_ops *)
static void bsd_kvm_pcb_cmd(char *arg, int fromtty)
struct cmd_list_element * cmdlist
void target_fetch_registers(struct regcache *regcache, int regno)
struct regcache * get_current_regcache(void)
void printf_filtered(const char *format,...)
ptid_t ptid_build(int pid, long lwp, long tid)
void(* to_files_info)(struct target_ops *) TARGET_DEFAULT_IGNORE()
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, const char *doc, struct cmd_list_element **list)
static LONGEST bsd_kvm_xfer_memory(CORE_ADDR addr, ULONGEST len, gdb_byte *readbuf, const gdb_byte *writebuf)
static void bsd_kvm_fetch_registers(struct target_ops *ops, struct regcache *regcache, int regnum)
struct thread_info * add_thread_silent(ptid_t ptid)
enum target_xfer_status(* to_xfer_partial)(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) TARGET_DEFAULT_RETURN(TARGET_XFER_E_IO)
static void bsd_kvm_close(struct target_ops *self)
void print_stack_frame(struct frame_info *, int print_level, enum print_what print_what, int set_current_sal)
const char const char int
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
int xsnprintf(char *str, size_t size, const char *format,...)
CORE_ADDR parse_and_eval_address(const char *exp)
static const char * bsd_kvm_corefile
void(* to_open)(const char *, int)
static int bsd_kvm_return_one(struct target_ops *ops)
const char * to_shortname
static void bsd_kvm_files_info(struct target_ops *ops)
char * get_exec_file(int err)
unsigned long long ULONGEST
static struct pcb * bsd_kvm_paddr
void bsd_kvm_add_target(int(*supply_pcb)(struct regcache *, struct pcb *))
int(* to_thread_alive)(struct target_ops *, ptid_t ptid) TARGET_DEFAULT_RETURN(0)
void target_preopen(int from_tty)
void reinit_frame_cache(void)
static int bsd_kvm_thread_alive(struct target_ops *ops, ptid_t ptid)
int(* to_has_registers)(struct target_ops *)
static char * bsd_kvm_pid_to_str(struct target_ops *ops, ptid_t ptid)
void error(const char *fmt,...)
static struct target_ops bsd_kvm_ops
static int bsd_kvm_fetch_pcb(struct regcache *regcache, struct pcb *paddr)
const ULONGEST const LONGEST len