X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbsd-kvm.c;h=2e410d2d07417130cca10b5c21ac571f00117db8;hb=57380f4e0bbdfa396ed068db6bd867b4fafd9925;hp=32da68dd61bdb995bdffcc99d7da0be7c79baac2;hpb=1754f103e6323b908fc004d992930933a04183ce;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bsd-kvm.c b/gdb/bsd-kvm.c index 32da68dd61..2e410d2d07 100644 --- a/gdb/bsd-kvm.c +++ b/gdb/bsd-kvm.c @@ -1,12 +1,12 @@ /* BSD Kernel Data Access Library (libkvm) interface. - Copyright 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,9 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "cli/cli-cmds.h" @@ -34,6 +32,7 @@ #ifdef HAVE_NLIST_H #include #endif +#include #include "readline/readline.h" #include #include @@ -41,18 +40,21 @@ #include "bsd-kvm.h" +/* Kernel memory device file. */ +static const char *bsd_kvm_corefile; + /* Kernel memory interface descriptor. */ -kvm_t *core_kd; +static kvm_t *core_kd; /* Address of process control block. */ -struct pcb *bsd_kvm_paddr; +static struct pcb *bsd_kvm_paddr; /* Pointer to architecture-specific function that reconstructs the register state from PCB and supplies it to REGCACHE. */ -int (*bsd_kvm_supply_pcb)(struct regcache *regcache, struct pcb *pcb); +static int (*bsd_kvm_supply_pcb)(struct regcache *regcache, struct pcb *pcb); /* Target ops for libkvm interface. */ -struct target_ops bsd_kvm_ops; +static struct target_ops bsd_kvm_ops; static void bsd_kvm_open (char *filename, int from_tty) @@ -77,18 +79,19 @@ bsd_kvm_open (char *filename, int from_tty) } execfile = get_exec_file (0); - temp_kd = kvm_openfiles (execfile, filename, NULL, O_RDONLY, errbuf); + temp_kd = kvm_openfiles (execfile, filename, NULL, + write_files ? O_RDWR : O_RDONLY, errbuf); if (temp_kd == NULL) error (("%s"), errbuf); + bsd_kvm_corefile = filename; unpush_target (&bsd_kvm_ops); core_kd = temp_kd; push_target (&bsd_kvm_ops); - target_fetch_registers (-1); + target_fetch_registers (get_current_regcache (), -1); - flush_cached_frames (); - select_frame (get_current_frame ()); + reinit_frame_cache (); print_stack_frame (get_selected_frame (NULL), -1, 1); } @@ -132,10 +135,20 @@ bsd_kvm_xfer_partial (struct target_ops *ops, enum target_object object, } } +static void +bsd_kvm_files_info (struct target_ops *ops) +{ + if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0) + printf_filtered (_("\tUsing the kernel crash dump %s.\n"), + bsd_kvm_corefile); + else + printf_filtered (_("\tUsing the currently running kernel.\n")); +} + /* Fetch process control block at address PADDR. */ static int -bsd_kvm_fetch_pcb (struct pcb *paddr) +bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr) { struct pcb pcb; @@ -143,17 +156,17 @@ bsd_kvm_fetch_pcb (struct pcb *paddr) error (("%s"), kvm_geterr (core_kd)); gdb_assert (bsd_kvm_supply_pcb); - return bsd_kvm_supply_pcb (current_regcache, &pcb); + return bsd_kvm_supply_pcb (regcache, &pcb); } static void -bsd_kvm_fetch_registers (int regnum) +bsd_kvm_fetch_registers (struct regcache *regcache, int regnum) { struct nlist nl[2]; if (bsd_kvm_paddr) { - bsd_kvm_fetch_pcb (bsd_kvm_paddr); + bsd_kvm_fetch_pcb (regcache, bsd_kvm_paddr); return; } @@ -169,7 +182,7 @@ bsd_kvm_fetch_registers (int regnum) { /* Found dumppcb. If it contains a valid context, return immediately. */ - if (bsd_kvm_fetch_pcb ((struct pcb *) nl[0].n_value)) + if (bsd_kvm_fetch_pcb (regcache, (struct pcb *) nl[0].n_value)) return; } @@ -191,7 +204,7 @@ bsd_kvm_fetch_registers (int regnum) if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1) error (("%s"), kvm_geterr (core_kd)); - bsd_kvm_fetch_pcb (paddr); + bsd_kvm_fetch_pcb (regcache, paddr); return; } @@ -216,7 +229,7 @@ bsd_kvm_fetch_registers (int regnum) if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1) error (("%s"), kvm_geterr (core_kd)); - bsd_kvm_fetch_pcb (paddr); + bsd_kvm_fetch_pcb (regcache, paddr); return; } #endif @@ -258,10 +271,9 @@ bsd_kvm_proc_cmd (char *arg, int fromtty) if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1) error (("%s"), kvm_geterr (core_kd)); - target_fetch_registers (-1); + target_fetch_registers (get_current_regcache (), -1); - flush_cached_frames (); - select_frame (get_current_frame ()); + reinit_frame_cache (); print_stack_frame (get_selected_frame (NULL), -1, 1); } @@ -279,10 +291,9 @@ bsd_kvm_pcb_cmd (char *arg, int fromtty) bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg); - target_fetch_registers (-1); + target_fetch_registers (get_current_regcache (), -1); - flush_cached_frames (); - select_frame (get_current_frame ()); + reinit_frame_cache (); print_stack_frame (get_selected_frame (NULL), -1, 1); } @@ -304,6 +315,7 @@ Optionally specify the filename of a core dump."); bsd_kvm_ops.to_close = bsd_kvm_close; bsd_kvm_ops.to_fetch_registers = bsd_kvm_fetch_registers; bsd_kvm_ops.to_xfer_partial = bsd_kvm_xfer_partial; + bsd_kvm_ops.to_files_info = bsd_kvm_files_info; bsd_kvm_ops.to_stratum = process_stratum; bsd_kvm_ops.to_has_memory = 1; bsd_kvm_ops.to_has_stack = 1;