diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c5acbc816d..cc9330ab6f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2004-07-03 Mark Kettenis + + * bsd-kvm.c: Include "cli/cli-cmds.h", "command.h", "value.h" and + . + (bsd_kvm_cmdlist): New variable. + (bsd_kvm_cmd, bsd_kvm_proc_cmd, bsd_kvm_pcb_cmd): New functions. + (bsd_kvm_add_target): Register "kvm" command prefix, "kvm pcb" + command and "kvm proc" command. + * Makefile.in (bsd-kvm.o): Update dependencies. + 2004-07-02 Mark Kettenis * osabi.c: Update copyright year. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 156ae89be0..616fa96e2c 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1646,8 +1646,9 @@ breakpoint.o: breakpoint.c $(defs_h) $(symtab_h) $(frame_h) $(breakpoint_h) \ $(objfiles_h) $(source_h) $(linespec_h) $(completer_h) $(gdb_h) \ $(ui_out_h) $(cli_script_h) $(gdb_assert_h) $(block_h) \ $(gdb_events_h) -bsd-kvm.o: bsd-kvm.c $(defs_h) $(frame_h) $(regcache_h) $(target_h) \ - $(gdb_assert_h) $(readline_h) $(bsd_kvm_h) +bsd-kvm.o: bsd-kvm.c $(defs_h) $(cli_cmds.h) $(command_h) $(value_h) \ + $(frame_h) $(regcache_h) $(target_h) $(gdb_assert_h) $(readline_h) \ + $(bsd_kvm_h) buildsym.o: buildsym.c $(defs_h) $(bfd_h) $(gdb_obstack_h) $(symtab_h) \ $(symfile_h) $(objfiles_h) $(gdbtypes_h) $(gdb_assert_h) \ $(complaints_h) $(gdb_string_h) $(expression_h) $(language_h) \ diff --git a/gdb/bsd-kvm.c b/gdb/bsd-kvm.c index a037f84c6a..3ed57d652b 100644 --- a/gdb/bsd-kvm.c +++ b/gdb/bsd-kvm.c @@ -20,9 +20,12 @@ 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 "gdb_assert.h" #include @@ -30,6 +33,7 @@ #include #include "readline/readline.h" #include +#include #include #include "bsd-kvm.h" @@ -201,6 +205,61 @@ bsd_kvm_fetch_registers (int regnum) } +/* Kernel memory interface commands. */ +struct cmd_list_element *bsd_kvm_cmdlist = NULL; + +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); + addr += offsetof (struct proc, p_addr); + + 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 (), -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 *) parse_and_eval_address (arg); + + target_fetch_registers (-1); + + flush_cached_frames (); + select_frame (get_current_frame ()); + print_stack_frame (get_selected_frame (), -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. */ @@ -226,4 +285,15 @@ Optionally specify the filename of a core dump."; 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); }