daily update
[deliverable/binutils-gdb.git] / gdb / bsd-kvm.c
CommitLineData
2e0c3539
MK
1/* BSD Kernel Data Access Library (libkvm) interface.
2
ecd75fc8 3 Copyright (C) 2004-2014 Free Software Foundation, Inc.
2e0c3539
MK
4
5 This file is part of GDB.
6
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
2e0c3539
MK
10 (at your option) any later version.
11
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.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
2e0c3539
MK
19
20#include "defs.h"
963c4174
MK
21#include "cli/cli-cmds.h"
22#include "command.h"
2e0c3539
MK
23#include "frame.h"
24#include "regcache.h"
25#include "target.h"
963c4174 26#include "value.h"
7f245d65 27#include "gdbcore.h" /* for get_exec_file */
6c613132 28#include "gdbthread.h"
2e0c3539
MK
29
30#include "gdb_assert.h"
31#include <fcntl.h>
32#include <kvm.h>
ac5754fa 33#ifdef HAVE_NLIST_H
2e0c3539 34#include <nlist.h>
ac5754fa 35#endif
2e5a5020 36#include <paths.h>
2e0c3539 37#include "readline/readline.h"
af09351e 38#include <sys/param.h>
963c4174 39#include <sys/proc.h>
2e0c3539
MK
40#include <sys/user.h>
41
42#include "bsd-kvm.h"
43
2e5a5020
MK
44/* Kernel memory device file. */
45static const char *bsd_kvm_corefile;
46
2e0c3539 47/* Kernel memory interface descriptor. */
2e5a5020 48static kvm_t *core_kd;
2e0c3539
MK
49
50/* Address of process control block. */
2e5a5020 51static struct pcb *bsd_kvm_paddr;
2e0c3539
MK
52
53/* Pointer to architecture-specific function that reconstructs the
54 register state from PCB and supplies it to REGCACHE. */
2e5a5020 55static int (*bsd_kvm_supply_pcb)(struct regcache *regcache, struct pcb *pcb);
2e0c3539
MK
56
57/* Target ops for libkvm interface. */
2e5a5020 58static struct target_ops bsd_kvm_ops;
2e0c3539 59
6c613132
PA
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. */
63static ptid_t bsd_kvm_ptid;
64
2e0c3539 65static void
014f9477 66bsd_kvm_open (const char *arg, int from_tty)
2e0c3539
MK
67{
68 char errbuf[_POSIX2_LINE_MAX];
69 char *execfile = NULL;
70 kvm_t *temp_kd;
014f9477 71 char *filename = NULL;
2e0c3539
MK
72
73 target_preopen (from_tty);
74
014f9477 75 if (arg)
2e0c3539
MK
76 {
77 char *temp;
78
014f9477 79 filename = tilde_expand (arg);
2e0c3539
MK
80 if (filename[0] != '/')
81 {
1754f103 82 temp = concat (current_directory, "/", filename, (char *)NULL);
2e0c3539
MK
83 xfree (filename);
84 filename = temp;
85 }
86 }
87
7f245d65 88 execfile = get_exec_file (0);
4a35b02a
NW
89 temp_kd = kvm_openfiles (execfile, filename, NULL,
90 write_files ? O_RDWR : O_RDONLY, errbuf);
2e0c3539 91 if (temp_kd == NULL)
8a3fe4f8 92 error (("%s"), errbuf);
2e0c3539 93
2e5a5020 94 bsd_kvm_corefile = filename;
2e0c3539
MK
95 unpush_target (&bsd_kvm_ops);
96 core_kd = temp_kd;
97 push_target (&bsd_kvm_ops);
98
6c613132
PA
99 add_thread_silent (bsd_kvm_ptid);
100 inferior_ptid = bsd_kvm_ptid;
101
594f7785 102 target_fetch_registers (get_current_regcache (), -1);
2e0c3539 103
35f196d9 104 reinit_frame_cache ();
08d72866 105 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
2e0c3539
MK
106}
107
108static void
de90e03d 109bsd_kvm_close (struct target_ops *self)
2e0c3539
MK
110{
111 if (core_kd)
112 {
113 if (kvm_close (core_kd) == -1)
8a3fe4f8 114 warning (("%s"), kvm_geterr(core_kd));
2e0c3539
MK
115 core_kd = NULL;
116 }
6c613132
PA
117
118 inferior_ptid = null_ptid;
119 delete_thread_silent (bsd_kvm_ptid);
2e0c3539
MK
120}
121
961cb7b5
MK
122static LONGEST
123bsd_kvm_xfer_memory (CORE_ADDR addr, ULONGEST len,
124 gdb_byte *readbuf, const gdb_byte *writebuf)
2e0c3539 125{
961cb7b5
MK
126 ssize_t nbytes = len;
127
128 if (readbuf)
129 nbytes = kvm_read (core_kd, addr, readbuf, nbytes);
130 if (writebuf && nbytes > 0)
131 nbytes = kvm_write (core_kd, addr, writebuf, nbytes);
132 return nbytes;
133}
2e0c3539 134
9b409511 135static enum target_xfer_status
961cb7b5
MK
136bsd_kvm_xfer_partial (struct target_ops *ops, enum target_object object,
137 const char *annex, gdb_byte *readbuf,
138 const gdb_byte *writebuf,
9b409511 139 ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
961cb7b5
MK
140{
141 switch (object)
142 {
143 case TARGET_OBJECT_MEMORY:
9b409511
YQ
144 {
145 LONGEST ret = bsd_kvm_xfer_memory (offset, len, readbuf, writebuf);
146
147 if (ret < 0)
148 return TARGET_XFER_E_IO;
149 else if (ret == 0)
150 return TARGET_XFER_EOF;
151 else
152 {
153 *xfered_len = (ULONGEST) ret;
154 return TARGET_XFER_OK;
155 }
156 }
961cb7b5
MK
157
158 default:
2ed4b548 159 return TARGET_XFER_E_IO;
961cb7b5 160 }
2e0c3539
MK
161}
162
2e5a5020
MK
163static void
164bsd_kvm_files_info (struct target_ops *ops)
165{
166 if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0)
167 printf_filtered (_("\tUsing the kernel crash dump %s.\n"),
168 bsd_kvm_corefile);
169 else
170 printf_filtered (_("\tUsing the currently running kernel.\n"));
171}
172
2e0c3539
MK
173/* Fetch process control block at address PADDR. */
174
175static int
56be3814 176bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr)
2e0c3539
MK
177{
178 struct pcb pcb;
179
180 if (kvm_read (core_kd, (unsigned long) paddr, &pcb, sizeof pcb) == -1)
8a3fe4f8 181 error (("%s"), kvm_geterr (core_kd));
2e0c3539
MK
182
183 gdb_assert (bsd_kvm_supply_pcb);
56be3814 184 return bsd_kvm_supply_pcb (regcache, &pcb);
2e0c3539
MK
185}
186
187static void
28439f5e
PA
188bsd_kvm_fetch_registers (struct target_ops *ops,
189 struct regcache *regcache, int regnum)
2e0c3539
MK
190{
191 struct nlist nl[2];
192
193 if (bsd_kvm_paddr)
efe1d7b9 194 {
56be3814 195 bsd_kvm_fetch_pcb (regcache, bsd_kvm_paddr);
efe1d7b9
MK
196 return;
197 }
2e0c3539
MK
198
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";
203
204 if (kvm_nlist (core_kd, nl) == -1)
8a3fe4f8 205 error (("%s"), kvm_geterr (core_kd));
2e0c3539
MK
206
207 if (nl[0].n_value != 0)
208 {
4a64f543 209 /* Found dumppcb. If it contains a valid context, return
2e0c3539 210 immediately. */
56be3814 211 if (bsd_kvm_fetch_pcb (regcache, (struct pcb *) nl[0].n_value))
2e0c3539
MK
212 return;
213 }
214
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
217 "proc0paddr". */
218
219 memset (nl, 0, sizeof nl);
220 nl[0].n_name = "_proc0paddr";
221
222 if (kvm_nlist (core_kd, nl) == -1)
8a3fe4f8 223 error (("%s"), kvm_geterr (core_kd));
2e0c3539
MK
224
225 if (nl[0].n_value != 0)
226 {
227 struct pcb *paddr;
228
229 /* Found proc0paddr. */
230 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
8a3fe4f8 231 error (("%s"), kvm_geterr (core_kd));
2e0c3539 232
56be3814 233 bsd_kvm_fetch_pcb (regcache, paddr);
2e0c3539
MK
234 return;
235 }
236
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". */
242
243 memset (nl, 0, sizeof nl);
244 nl[0].n_name = "_thread0";
245
246 if (kvm_nlist (core_kd, nl) == -1)
8a3fe4f8 247 error (("%s"), kvm_geterr (core_kd));
2e0c3539
MK
248
249 if (nl[0].n_value != 0)
250 {
251 struct pcb *paddr;
252
253 /* Found thread0. */
efe1d7b9
MK
254 nl[0].n_value += offsetof (struct thread, td_pcb);
255 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
8a3fe4f8 256 error (("%s"), kvm_geterr (core_kd));
2e0c3539 257
56be3814 258 bsd_kvm_fetch_pcb (regcache, paddr);
2e0c3539
MK
259 return;
260 }
261#endif
262
0963b4bd 263 /* i18n: PCB == "Process Control Block". */
3d263c1d 264 error (_("Cannot find a valid PCB"));
2e0c3539
MK
265}
266\f
267
963c4174 268/* Kernel memory interface commands. */
fdb1bf9d 269struct cmd_list_element *bsd_kvm_cmdlist;
963c4174
MK
270
271static void
272bsd_kvm_cmd (char *arg, int fromtty)
273{
274 /* ??? Should this become an alias for "target kvm"? */
275}
276
277#ifndef HAVE_STRUCT_THREAD_TD_PCB
278
279static void
280bsd_kvm_proc_cmd (char *arg, int fromtty)
281{
282 CORE_ADDR addr;
283
284 if (arg == NULL)
3d263c1d 285 error_no_arg (_("proc address"));
963c4174
MK
286
287 if (core_kd == NULL)
3d263c1d 288 error (_("No kernel memory image."));
963c4174
MK
289
290 addr = parse_and_eval_address (arg);
da7d81e3
NW
291#ifdef HAVE_STRUCT_LWP
292 addr += offsetof (struct lwp, l_addr);
293#else
963c4174 294 addr += offsetof (struct proc, p_addr);
da7d81e3 295#endif
963c4174
MK
296
297 if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1)
8a3fe4f8 298 error (("%s"), kvm_geterr (core_kd));
963c4174 299
594f7785 300 target_fetch_registers (get_current_regcache (), -1);
963c4174 301
35f196d9 302 reinit_frame_cache ();
08d72866 303 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
963c4174
MK
304}
305
306#endif
307
308static void
309bsd_kvm_pcb_cmd (char *arg, int fromtty)
310{
311 if (arg == NULL)
0963b4bd 312 /* i18n: PCB == "Process Control Block". */
3d263c1d 313 error_no_arg (_("pcb address"));
963c4174
MK
314
315 if (core_kd == NULL)
3d263c1d 316 error (_("No kernel memory image."));
963c4174 317
57ac95b8 318 bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg);
963c4174 319
594f7785 320 target_fetch_registers (get_current_regcache (), -1);
963c4174 321
35f196d9 322 reinit_frame_cache ();
08d72866 323 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
963c4174
MK
324}
325
6c613132 326static int
28439f5e
PA
327bsd_kvm_thread_alive (struct target_ops *ops,
328 ptid_t ptid)
6c613132
PA
329{
330 return 1;
331}
332
333static char *
117de6a9 334bsd_kvm_pid_to_str (struct target_ops *ops, ptid_t ptid)
6c613132
PA
335{
336 static char buf[64];
337 xsnprintf (buf, sizeof buf, "<kvm>");
338 return buf;
339}
340
c35b1492
PA
341static int
342bsd_kvm_return_one (struct target_ops *ops)
343{
344 return 1;
345}
346
2e0c3539
MK
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. */
350
351void
352bsd_kvm_add_target (int (*supply_pcb)(struct regcache *, struct pcb *))
353{
354 gdb_assert (bsd_kvm_supply_pcb == NULL);
355 bsd_kvm_supply_pcb = supply_pcb;
356
357 bsd_kvm_ops.to_shortname = "kvm";
3d263c1d
BI
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\
360Optionally specify the filename of a core dump.");
2e0c3539
MK
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;
961cb7b5 364 bsd_kvm_ops.to_xfer_partial = bsd_kvm_xfer_partial;
2e5a5020 365 bsd_kvm_ops.to_files_info = bsd_kvm_files_info;
6c613132
PA
366 bsd_kvm_ops.to_thread_alive = bsd_kvm_thread_alive;
367 bsd_kvm_ops.to_pid_to_str = bsd_kvm_pid_to_str;
2e0c3539 368 bsd_kvm_ops.to_stratum = process_stratum;
c35b1492
PA
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;
2e0c3539
MK
372 bsd_kvm_ops.to_magic = OPS_MAGIC;
373
374 add_target (&bsd_kvm_ops);
963c4174 375
3d263c1d
BI
376 add_prefix_cmd ("kvm", class_obscure, bsd_kvm_cmd, _("\
377Generic command for manipulating the kernel memory interface."),
963c4174
MK
378 &bsd_kvm_cmdlist, "kvm ", 0, &cmdlist);
379
380#ifndef HAVE_STRUCT_THREAD_TD_PCB
381 add_cmd ("proc", class_obscure, bsd_kvm_proc_cmd,
3d263c1d 382 _("Set current context from proc address"), &bsd_kvm_cmdlist);
963c4174
MK
383#endif
384 add_cmd ("pcb", class_obscure, bsd_kvm_pcb_cmd,
0963b4bd 385 /* i18n: PCB == "Process Control Block". */
3d263c1d 386 _("Set current context from pcb address"), &bsd_kvm_cmdlist);
6c613132
PA
387
388 /* Some notes on the ptid usage on this target.
389
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).
394
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
0963b4bd
MS
400 ptid (1, 1, n) -> kvm inferior 1, process n */
401
6c613132 402 bsd_kvm_ptid = ptid_build (1, 1, 0);
2e0c3539 403}
This page took 0.643331 seconds and 4 git commands to generate.