projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* symtab.c: (multiple_symbols_modes, multiple_symbols_ask)
[deliverable/binutils-gdb.git]
/
gdb
/
bsd-kvm.c
diff --git
a/gdb/bsd-kvm.c
b/gdb/bsd-kvm.c
index db60052eccad4efb072111a1579a6c271a2198ed..2e410d2d07417130cca10b5c21ac571f00117db8 100644
(file)
--- a/
gdb/bsd-kvm.c
+++ b/
gdb/bsd-kvm.c
@@
-1,12
+1,12
@@
/* BSD Kernel Data Access Library (libkvm) interface.
/* 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
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,
(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
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 <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "cli/cli-cmds.h"
#include "defs.h"
#include "cli/cli-cmds.h"
@@
-34,6
+32,7
@@
#ifdef HAVE_NLIST_H
#include <nlist.h>
#endif
#ifdef HAVE_NLIST_H
#include <nlist.h>
#endif
+#include <paths.h>
#include "readline/readline.h"
#include <sys/param.h>
#include <sys/proc.h>
#include "readline/readline.h"
#include <sys/param.h>
#include <sys/proc.h>
@@
-41,18
+40,21
@@
#include "bsd-kvm.h"
#include "bsd-kvm.h"
+/* Kernel memory device file. */
+static const char *bsd_kvm_corefile;
+
/* Kernel memory interface descriptor. */
/* Kernel memory interface descriptor. */
-kvm_t *core_kd;
+
static
kvm_t *core_kd;
/* Address of process control block. */
/* Address of process control block. */
-struct pcb *bsd_kvm_paddr;
+st
atic st
ruct pcb *bsd_kvm_paddr;
/* Pointer to architecture-specific function that reconstructs the
register state from PCB and supplies it to REGCACHE. */
/* 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. */
/* Target ops for libkvm interface. */
-struct target_ops bsd_kvm_ops;
+st
atic st
ruct target_ops bsd_kvm_ops;
static void
bsd_kvm_open (char *filename, int from_tty)
static void
bsd_kvm_open (char *filename, int from_tty)
@@
-70,25
+72,26
@@
bsd_kvm_open (char *filename, int from_tty)
filename = tilde_expand (filename);
if (filename[0] != '/')
{
filename = tilde_expand (filename);
if (filename[0] != '/')
{
- temp = concat (current_directory, "/", filename, NULL);
+ temp = concat (current_directory, "/", filename,
(char *)
NULL);
xfree (filename);
filename = temp;
}
}
execfile = get_exec_file (0);
xfree (filename);
filename = temp;
}
}
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);
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);
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);
}
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
/* 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;
{
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);
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
}
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)
{
{
struct nlist nl[2];
if (bsd_kvm_paddr)
{
- bsd_kvm_fetch_pcb (bsd_kvm_paddr);
+ bsd_kvm_fetch_pcb (
regcache,
bsd_kvm_paddr);
return;
}
return;
}
@@
-169,7
+182,7
@@
bsd_kvm_fetch_registers (int regnum)
{
/* Found dumppcb. If it contains a valid context, return
immediately. */
{
/* 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;
}
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));
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;
}
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));
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
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));
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);
}
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);
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);
}
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_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;
bsd_kvm_ops.to_stratum = process_stratum;
bsd_kvm_ops.to_has_memory = 1;
bsd_kvm_ops.to_has_stack = 1;
This page took
0.027768 seconds
and
4
git commands to generate.