1 /* BSD Kernel Data Access Library (libkvm) interface.
3 Copyright (C) 2004-2014 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "cli/cli-cmds.h"
27 #include "gdbcore.h" /* for get_exec_file */
28 #include "gdbthread.h"
30 #include "gdb_assert.h"
37 #include "readline/readline.h"
38 #include <sys/param.h>
44 /* Kernel memory device file. */
45 static const char *bsd_kvm_corefile;
47 /* Kernel memory interface descriptor. */
48 static kvm_t *core_kd;
50 /* Address of process control block. */
51 static struct pcb *bsd_kvm_paddr;
53 /* Pointer to architecture-specific function that reconstructs the
54 register state from PCB and supplies it to REGCACHE. */
55 static int (*bsd_kvm_supply_pcb)(struct regcache *regcache, struct pcb *pcb);
57 /* Target ops for libkvm interface. */
58 static struct target_ops bsd_kvm_ops;
60 /* This is the ptid we use while we're connected to kvm. The kvm
61 target currently doesn't export any view of the running processes,
62 so this represents the kernel task. */
63 static ptid_t bsd_kvm_ptid;
66 bsd_kvm_open (const char *arg, int from_tty)
68 char errbuf[_POSIX2_LINE_MAX];
69 char *execfile = NULL;
71 char *filename = NULL;
73 target_preopen (from_tty);
79 filename = tilde_expand (arg);
80 if (filename[0] != '/')
82 temp = concat (current_directory, "/", filename, (char *)NULL);
88 execfile = get_exec_file (0);
89 temp_kd = kvm_openfiles (execfile, filename, NULL,
90 write_files ? O_RDWR : O_RDONLY, errbuf);
92 error (("%s"), errbuf);
94 bsd_kvm_corefile = filename;
95 unpush_target (&bsd_kvm_ops);
97 push_target (&bsd_kvm_ops);
99 add_thread_silent (bsd_kvm_ptid);
100 inferior_ptid = bsd_kvm_ptid;
102 target_fetch_registers (get_current_regcache (), -1);
104 reinit_frame_cache ();
105 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
109 bsd_kvm_close (struct target_ops *self)
113 if (kvm_close (core_kd) == -1)
114 warning (("%s"), kvm_geterr(core_kd));
118 inferior_ptid = null_ptid;
119 delete_thread_silent (bsd_kvm_ptid);
123 bsd_kvm_xfer_memory (CORE_ADDR addr, ULONGEST len,
124 gdb_byte *readbuf, const gdb_byte *writebuf)
126 ssize_t nbytes = len;
129 nbytes = kvm_read (core_kd, addr, readbuf, nbytes);
130 if (writebuf && nbytes > 0)
131 nbytes = kvm_write (core_kd, addr, writebuf, nbytes);
135 static enum target_xfer_status
136 bsd_kvm_xfer_partial (struct target_ops *ops, enum target_object object,
137 const char *annex, gdb_byte *readbuf,
138 const gdb_byte *writebuf,
139 ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
143 case TARGET_OBJECT_MEMORY:
145 LONGEST ret = bsd_kvm_xfer_memory (offset, len, readbuf, writebuf);
148 return TARGET_XFER_E_IO;
150 return TARGET_XFER_EOF;
153 *xfered_len = (ULONGEST) ret;
154 return TARGET_XFER_OK;
159 return TARGET_XFER_E_IO;
164 bsd_kvm_files_info (struct target_ops *ops)
166 if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0)
167 printf_filtered (_("\tUsing the kernel crash dump %s.\n"),
170 printf_filtered (_("\tUsing the currently running kernel.\n"));
173 /* Fetch process control block at address PADDR. */
176 bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr)
180 if (kvm_read (core_kd, (unsigned long) paddr, &pcb, sizeof pcb) == -1)
181 error (("%s"), kvm_geterr (core_kd));
183 gdb_assert (bsd_kvm_supply_pcb);
184 return bsd_kvm_supply_pcb (regcache, &pcb);
188 bsd_kvm_fetch_registers (struct target_ops *ops,
189 struct regcache *regcache, int regnum)
195 bsd_kvm_fetch_pcb (regcache, bsd_kvm_paddr);
199 /* On dumping core, BSD kernels store the faulting context (PCB)
200 in the variable "dumppcb". */
201 memset (nl, 0, sizeof nl);
202 nl[0].n_name = "_dumppcb";
204 if (kvm_nlist (core_kd, nl) == -1)
205 error (("%s"), kvm_geterr (core_kd));
207 if (nl[0].n_value != 0)
209 /* Found dumppcb. If it contains a valid context, return
211 if (bsd_kvm_fetch_pcb (regcache, (struct pcb *) nl[0].n_value))
215 /* Traditional BSD kernels have a process proc0 that should always
216 be present. The address of proc0's PCB is stored in the variable
219 memset (nl, 0, sizeof nl);
220 nl[0].n_name = "_proc0paddr";
222 if (kvm_nlist (core_kd, nl) == -1)
223 error (("%s"), kvm_geterr (core_kd));
225 if (nl[0].n_value != 0)
229 /* Found proc0paddr. */
230 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
231 error (("%s"), kvm_geterr (core_kd));
233 bsd_kvm_fetch_pcb (regcache, paddr);
237 #ifdef HAVE_STRUCT_THREAD_TD_PCB
238 /* In FreeBSD kernels for 5.0-RELEASE and later, the PCB no longer
239 lives in `struct proc' but in `struct thread'. The `struct
240 thread' for the initial thread for proc0 can be found in the
241 variable "thread0". */
243 memset (nl, 0, sizeof nl);
244 nl[0].n_name = "_thread0";
246 if (kvm_nlist (core_kd, nl) == -1)
247 error (("%s"), kvm_geterr (core_kd));
249 if (nl[0].n_value != 0)
254 nl[0].n_value += offsetof (struct thread, td_pcb);
255 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
256 error (("%s"), kvm_geterr (core_kd));
258 bsd_kvm_fetch_pcb (regcache, paddr);
263 /* i18n: PCB == "Process Control Block". */
264 error (_("Cannot find a valid PCB"));
268 /* Kernel memory interface commands. */
269 struct cmd_list_element *bsd_kvm_cmdlist;
272 bsd_kvm_cmd (char *arg, int fromtty)
274 /* ??? Should this become an alias for "target kvm"? */
277 #ifndef HAVE_STRUCT_THREAD_TD_PCB
280 bsd_kvm_proc_cmd (char *arg, int fromtty)
285 error_no_arg (_("proc address"));
288 error (_("No kernel memory image."));
290 addr = parse_and_eval_address (arg);
291 #ifdef HAVE_STRUCT_LWP
292 addr += offsetof (struct lwp, l_addr);
294 addr += offsetof (struct proc, p_addr);
297 if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1)
298 error (("%s"), kvm_geterr (core_kd));
300 target_fetch_registers (get_current_regcache (), -1);
302 reinit_frame_cache ();
303 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
309 bsd_kvm_pcb_cmd (char *arg, int fromtty)
312 /* i18n: PCB == "Process Control Block". */
313 error_no_arg (_("pcb address"));
316 error (_("No kernel memory image."));
318 bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg);
320 target_fetch_registers (get_current_regcache (), -1);
322 reinit_frame_cache ();
323 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
327 bsd_kvm_thread_alive (struct target_ops *ops,
334 bsd_kvm_pid_to_str (struct target_ops *ops, ptid_t ptid)
337 xsnprintf (buf, sizeof buf, "<kvm>");
342 bsd_kvm_return_one (struct target_ops *ops)
347 /* Add the libkvm interface to the list of all possible targets and
348 register CUPPLY_PCB as the architecture-specific process control
349 block interpreter. */
352 bsd_kvm_add_target (int (*supply_pcb)(struct regcache *, struct pcb *))
354 gdb_assert (bsd_kvm_supply_pcb == NULL);
355 bsd_kvm_supply_pcb = supply_pcb;
357 bsd_kvm_ops.to_shortname = "kvm";
358 bsd_kvm_ops.to_longname = _("Kernel memory interface");
359 bsd_kvm_ops.to_doc = _("Use a kernel virtual memory image as a target.\n\
360 Optionally specify the filename of a core dump.");
361 bsd_kvm_ops.to_open = bsd_kvm_open;
362 bsd_kvm_ops.to_close = bsd_kvm_close;
363 bsd_kvm_ops.to_fetch_registers = bsd_kvm_fetch_registers;
364 bsd_kvm_ops.to_xfer_partial = bsd_kvm_xfer_partial;
365 bsd_kvm_ops.to_files_info = bsd_kvm_files_info;
366 bsd_kvm_ops.to_thread_alive = bsd_kvm_thread_alive;
367 bsd_kvm_ops.to_pid_to_str = bsd_kvm_pid_to_str;
368 bsd_kvm_ops.to_stratum = process_stratum;
369 bsd_kvm_ops.to_has_memory = bsd_kvm_return_one;
370 bsd_kvm_ops.to_has_stack = bsd_kvm_return_one;
371 bsd_kvm_ops.to_has_registers = bsd_kvm_return_one;
372 bsd_kvm_ops.to_magic = OPS_MAGIC;
374 add_target (&bsd_kvm_ops);
376 add_prefix_cmd ("kvm", class_obscure, bsd_kvm_cmd, _("\
377 Generic command for manipulating the kernel memory interface."),
378 &bsd_kvm_cmdlist, "kvm ", 0, &cmdlist);
380 #ifndef HAVE_STRUCT_THREAD_TD_PCB
381 add_cmd ("proc", class_obscure, bsd_kvm_proc_cmd,
382 _("Set current context from proc address"), &bsd_kvm_cmdlist);
384 add_cmd ("pcb", class_obscure, bsd_kvm_pcb_cmd,
385 /* i18n: PCB == "Process Control Block". */
386 _("Set current context from pcb address"), &bsd_kvm_cmdlist);
388 /* Some notes on the ptid usage on this target.
390 The pid field represents the kvm inferior instance. Currently,
391 we don't support multiple kvm inferiors, but we start at 1
392 anyway. The lwp field is set to != 0, in case the core wants to
393 refer to the whole kvm inferior with ptid(1,0,0).
395 If kvm is made to export running processes as gdb threads,
396 the following form can be used:
397 ptid (1, 1, 0) -> kvm inferior 1, in kernel
398 ptid (1, 1, 1) -> kvm inferior 1, process 1
399 ptid (1, 1, 2) -> kvm inferior 1, process 2
400 ptid (1, 1, n) -> kvm inferior 1, process n */
402 bsd_kvm_ptid = ptid_build (1, 1, 0);