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;