Boston, MA 02111-1307, USA. */
#include "defs.h"
+#include "cli/cli-cmds.h"
+#include "command.h"
#include "frame.h"
#include "regcache.h"
#include "target.h"
+#include "value.h"
+#include "gdbcore.h" /* for get_exec_file */
#include "gdb_assert.h"
#include <fcntl.h>
#include <kvm.h>
+#ifdef HAVE_NLIST_H
#include <nlist.h>
+#endif
#include "readline/readline.h"
#include <sys/param.h>
+#include <sys/proc.h>
#include <sys/user.h>
#include "bsd-kvm.h"
}
}
+ execfile = get_exec_file (0);
temp_kd = kvm_openfiles (execfile, filename, NULL, O_RDONLY, errbuf);
if (temp_kd == NULL)
error ("%s", errbuf);
flush_cached_frames ();
select_frame (get_current_frame ());
- print_stack_frame (get_selected_frame (), -1, 1);
+ print_stack_frame (get_selected_frame (NULL), -1, 1);
}
static void
}
\f
+/* Kernel memory interface commands. */
+struct cmd_list_element *bsd_kvm_cmdlist;
+
+static void
+bsd_kvm_cmd (char *arg, int fromtty)
+{
+ /* ??? Should this become an alias for "target kvm"? */
+}
+
+#ifndef HAVE_STRUCT_THREAD_TD_PCB
+
+static void
+bsd_kvm_proc_cmd (char *arg, int fromtty)
+{
+ CORE_ADDR addr;
+
+ if (arg == NULL)
+ error_no_arg ("proc address");
+
+ if (core_kd == NULL)
+ error ("No kernel memory image.");
+
+ addr = parse_and_eval_address (arg);
+#ifdef HAVE_STRUCT_LWP
+ addr += offsetof (struct lwp, l_addr);
+#else
+ addr += offsetof (struct proc, p_addr);
+#endif
+
+ if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1)
+ error ("%s", kvm_geterr (core_kd));
+
+ target_fetch_registers (-1);
+
+ flush_cached_frames ();
+ select_frame (get_current_frame ());
+ print_stack_frame (get_selected_frame (NULL), -1, 1);
+}
+
+#endif
+
+static void
+bsd_kvm_pcb_cmd (char *arg, int fromtty)
+{
+ if (arg == NULL)
+ error_no_arg ("pcb address");
+
+ if (core_kd == NULL)
+ error ("No kernel memory image.");
+
+ bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg);
+
+ target_fetch_registers (-1);
+
+ flush_cached_frames ();
+ select_frame (get_current_frame ());
+ print_stack_frame (get_selected_frame (NULL), -1, 1);
+}
+
/* Add the libkvm interface to the list of all possible targets and
register CUPPLY_PCB as the architecture-specific process control
block interpreter. */
bsd_kvm_ops.to_open = bsd_kvm_open;
bsd_kvm_ops.to_close = bsd_kvm_close;
bsd_kvm_ops.to_fetch_registers = bsd_kvm_fetch_registers;
- bsd_kvm_ops.to_xfer_memory = bsd_kvm_xfer_memory;
+ bsd_kvm_ops.deprecated_xfer_memory = bsd_kvm_xfer_memory;
bsd_kvm_ops.to_stratum = process_stratum;
bsd_kvm_ops.to_has_memory = 1;
bsd_kvm_ops.to_has_stack = 1;
bsd_kvm_ops.to_magic = OPS_MAGIC;
add_target (&bsd_kvm_ops);
+
+ add_prefix_cmd ("kvm", class_obscure, bsd_kvm_cmd, "\
+Generic command for manipulating the kernel memory interface.",
+ &bsd_kvm_cmdlist, "kvm ", 0, &cmdlist);
+
+#ifndef HAVE_STRUCT_THREAD_TD_PCB
+ add_cmd ("proc", class_obscure, bsd_kvm_proc_cmd,
+ "Set current context from proc address", &bsd_kvm_cmdlist);
+#endif
+ add_cmd ("pcb", class_obscure, bsd_kvm_pcb_cmd,
+ "Set current context from pcb address", &bsd_kvm_cmdlist);
}