* bsd-kvm.c: Include "gdbthread.h".
[deliverable/binutils-gdb.git] / gdb / bsd-kvm.c
1 /* BSD Kernel Data Access Library (libkvm) interface.
2
3 Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
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
9 the Free Software Foundation; either version 3 of the License, or
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
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "cli/cli-cmds.h"
22 #include "command.h"
23 #include "frame.h"
24 #include "regcache.h"
25 #include "target.h"
26 #include "value.h"
27 #include "gdbcore.h" /* for get_exec_file */
28 #include "gdbthread.h"
29
30 #include "gdb_assert.h"
31 #include <fcntl.h>
32 #include <kvm.h>
33 #ifdef HAVE_NLIST_H
34 #include <nlist.h>
35 #endif
36 #include <paths.h>
37 #include "readline/readline.h"
38 #include <sys/param.h>
39 #include <sys/proc.h>
40 #include <sys/user.h>
41
42 #include "bsd-kvm.h"
43
44 /* Kernel memory device file. */
45 static const char *bsd_kvm_corefile;
46
47 /* Kernel memory interface descriptor. */
48 static kvm_t *core_kd;
49
50 /* Address of process control block. */
51 static struct pcb *bsd_kvm_paddr;
52
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);
56
57 /* Target ops for libkvm interface. */
58 static struct target_ops bsd_kvm_ops;
59
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;
64
65 static void
66 bsd_kvm_open (char *filename, int from_tty)
67 {
68 char errbuf[_POSIX2_LINE_MAX];
69 char *execfile = NULL;
70 kvm_t *temp_kd;
71
72 target_preopen (from_tty);
73
74 if (filename)
75 {
76 char *temp;
77
78 filename = tilde_expand (filename);
79 if (filename[0] != '/')
80 {
81 temp = concat (current_directory, "/", filename, (char *)NULL);
82 xfree (filename);
83 filename = temp;
84 }
85 }
86
87 execfile = get_exec_file (0);
88 temp_kd = kvm_openfiles (execfile, filename, NULL,
89 write_files ? O_RDWR : O_RDONLY, errbuf);
90 if (temp_kd == NULL)
91 error (("%s"), errbuf);
92
93 bsd_kvm_corefile = filename;
94 unpush_target (&bsd_kvm_ops);
95 core_kd = temp_kd;
96 push_target (&bsd_kvm_ops);
97
98 add_thread_silent (bsd_kvm_ptid);
99 inferior_ptid = bsd_kvm_ptid;
100
101 target_fetch_registers (get_current_regcache (), -1);
102
103 reinit_frame_cache ();
104 print_stack_frame (get_selected_frame (NULL), -1, 1);
105 }
106
107 static void
108 bsd_kvm_close (int quitting)
109 {
110 if (core_kd)
111 {
112 if (kvm_close (core_kd) == -1)
113 warning (("%s"), kvm_geterr(core_kd));
114 core_kd = NULL;
115 }
116
117 inferior_ptid = null_ptid;
118 delete_thread_silent (bsd_kvm_ptid);
119 }
120
121 static LONGEST
122 bsd_kvm_xfer_memory (CORE_ADDR addr, ULONGEST len,
123 gdb_byte *readbuf, const gdb_byte *writebuf)
124 {
125 ssize_t nbytes = len;
126
127 if (readbuf)
128 nbytes = kvm_read (core_kd, addr, readbuf, nbytes);
129 if (writebuf && nbytes > 0)
130 nbytes = kvm_write (core_kd, addr, writebuf, nbytes);
131 return nbytes;
132 }
133
134 static LONGEST
135 bsd_kvm_xfer_partial (struct target_ops *ops, enum target_object object,
136 const char *annex, gdb_byte *readbuf,
137 const gdb_byte *writebuf,
138 ULONGEST offset, LONGEST len)
139 {
140 switch (object)
141 {
142 case TARGET_OBJECT_MEMORY:
143 return bsd_kvm_xfer_memory (offset, len, readbuf, writebuf);
144
145 default:
146 return -1;
147 }
148 }
149
150 static void
151 bsd_kvm_files_info (struct target_ops *ops)
152 {
153 if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0)
154 printf_filtered (_("\tUsing the kernel crash dump %s.\n"),
155 bsd_kvm_corefile);
156 else
157 printf_filtered (_("\tUsing the currently running kernel.\n"));
158 }
159
160 /* Fetch process control block at address PADDR. */
161
162 static int
163 bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr)
164 {
165 struct pcb pcb;
166
167 if (kvm_read (core_kd, (unsigned long) paddr, &pcb, sizeof pcb) == -1)
168 error (("%s"), kvm_geterr (core_kd));
169
170 gdb_assert (bsd_kvm_supply_pcb);
171 return bsd_kvm_supply_pcb (regcache, &pcb);
172 }
173
174 static void
175 bsd_kvm_fetch_registers (struct regcache *regcache, int regnum)
176 {
177 struct nlist nl[2];
178
179 if (bsd_kvm_paddr)
180 {
181 bsd_kvm_fetch_pcb (regcache, bsd_kvm_paddr);
182 return;
183 }
184
185 /* On dumping core, BSD kernels store the faulting context (PCB)
186 in the variable "dumppcb". */
187 memset (nl, 0, sizeof nl);
188 nl[0].n_name = "_dumppcb";
189
190 if (kvm_nlist (core_kd, nl) == -1)
191 error (("%s"), kvm_geterr (core_kd));
192
193 if (nl[0].n_value != 0)
194 {
195 /* Found dumppcb. If it contains a valid context, return
196 immediately. */
197 if (bsd_kvm_fetch_pcb (regcache, (struct pcb *) nl[0].n_value))
198 return;
199 }
200
201 /* Traditional BSD kernels have a process proc0 that should always
202 be present. The address of proc0's PCB is stored in the variable
203 "proc0paddr". */
204
205 memset (nl, 0, sizeof nl);
206 nl[0].n_name = "_proc0paddr";
207
208 if (kvm_nlist (core_kd, nl) == -1)
209 error (("%s"), kvm_geterr (core_kd));
210
211 if (nl[0].n_value != 0)
212 {
213 struct pcb *paddr;
214
215 /* Found proc0paddr. */
216 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
217 error (("%s"), kvm_geterr (core_kd));
218
219 bsd_kvm_fetch_pcb (regcache, paddr);
220 return;
221 }
222
223 #ifdef HAVE_STRUCT_THREAD_TD_PCB
224 /* In FreeBSD kernels for 5.0-RELEASE and later, the PCB no longer
225 lives in `struct proc' but in `struct thread'. The `struct
226 thread' for the initial thread for proc0 can be found in the
227 variable "thread0". */
228
229 memset (nl, 0, sizeof nl);
230 nl[0].n_name = "_thread0";
231
232 if (kvm_nlist (core_kd, nl) == -1)
233 error (("%s"), kvm_geterr (core_kd));
234
235 if (nl[0].n_value != 0)
236 {
237 struct pcb *paddr;
238
239 /* Found thread0. */
240 nl[0].n_value += offsetof (struct thread, td_pcb);
241 if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
242 error (("%s"), kvm_geterr (core_kd));
243
244 bsd_kvm_fetch_pcb (regcache, paddr);
245 return;
246 }
247 #endif
248
249 /* i18n: PCB == "Process Control Block" */
250 error (_("Cannot find a valid PCB"));
251 }
252 \f
253
254 /* Kernel memory interface commands. */
255 struct cmd_list_element *bsd_kvm_cmdlist;
256
257 static void
258 bsd_kvm_cmd (char *arg, int fromtty)
259 {
260 /* ??? Should this become an alias for "target kvm"? */
261 }
262
263 #ifndef HAVE_STRUCT_THREAD_TD_PCB
264
265 static void
266 bsd_kvm_proc_cmd (char *arg, int fromtty)
267 {
268 CORE_ADDR addr;
269
270 if (arg == NULL)
271 error_no_arg (_("proc address"));
272
273 if (core_kd == NULL)
274 error (_("No kernel memory image."));
275
276 addr = parse_and_eval_address (arg);
277 #ifdef HAVE_STRUCT_LWP
278 addr += offsetof (struct lwp, l_addr);
279 #else
280 addr += offsetof (struct proc, p_addr);
281 #endif
282
283 if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1)
284 error (("%s"), kvm_geterr (core_kd));
285
286 target_fetch_registers (get_current_regcache (), -1);
287
288 reinit_frame_cache ();
289 print_stack_frame (get_selected_frame (NULL), -1, 1);
290 }
291
292 #endif
293
294 static void
295 bsd_kvm_pcb_cmd (char *arg, int fromtty)
296 {
297 if (arg == NULL)
298 /* i18n: PCB == "Process Control Block" */
299 error_no_arg (_("pcb address"));
300
301 if (core_kd == NULL)
302 error (_("No kernel memory image."));
303
304 bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg);
305
306 target_fetch_registers (get_current_regcache (), -1);
307
308 reinit_frame_cache ();
309 print_stack_frame (get_selected_frame (NULL), -1, 1);
310 }
311
312 static int
313 bsd_kvm_thread_alive (ptid_t ptid)
314 {
315 return 1;
316 }
317
318 static char *
319 bsd_kvm_pid_to_str (ptid_t ptid)
320 {
321 static char buf[64];
322 xsnprintf (buf, sizeof buf, "<kvm>");
323 return buf;
324 }
325
326 /* Add the libkvm interface to the list of all possible targets and
327 register CUPPLY_PCB as the architecture-specific process control
328 block interpreter. */
329
330 void
331 bsd_kvm_add_target (int (*supply_pcb)(struct regcache *, struct pcb *))
332 {
333 gdb_assert (bsd_kvm_supply_pcb == NULL);
334 bsd_kvm_supply_pcb = supply_pcb;
335
336 bsd_kvm_ops.to_shortname = "kvm";
337 bsd_kvm_ops.to_longname = _("Kernel memory interface");
338 bsd_kvm_ops.to_doc = _("Use a kernel virtual memory image as a target.\n\
339 Optionally specify the filename of a core dump.");
340 bsd_kvm_ops.to_open = bsd_kvm_open;
341 bsd_kvm_ops.to_close = bsd_kvm_close;
342 bsd_kvm_ops.to_fetch_registers = bsd_kvm_fetch_registers;
343 bsd_kvm_ops.to_xfer_partial = bsd_kvm_xfer_partial;
344 bsd_kvm_ops.to_files_info = bsd_kvm_files_info;
345 bsd_kvm_ops.to_thread_alive = bsd_kvm_thread_alive;
346 bsd_kvm_ops.to_pid_to_str = bsd_kvm_pid_to_str;
347 bsd_kvm_ops.to_stratum = process_stratum;
348 bsd_kvm_ops.to_has_memory = 1;
349 bsd_kvm_ops.to_has_stack = 1;
350 bsd_kvm_ops.to_has_registers = 1;
351 bsd_kvm_ops.to_magic = OPS_MAGIC;
352
353 add_target (&bsd_kvm_ops);
354
355 add_prefix_cmd ("kvm", class_obscure, bsd_kvm_cmd, _("\
356 Generic command for manipulating the kernel memory interface."),
357 &bsd_kvm_cmdlist, "kvm ", 0, &cmdlist);
358
359 #ifndef HAVE_STRUCT_THREAD_TD_PCB
360 add_cmd ("proc", class_obscure, bsd_kvm_proc_cmd,
361 _("Set current context from proc address"), &bsd_kvm_cmdlist);
362 #endif
363 add_cmd ("pcb", class_obscure, bsd_kvm_pcb_cmd,
364 /* i18n: PCB == "Process Control Block" */
365 _("Set current context from pcb address"), &bsd_kvm_cmdlist);
366
367 /* Some notes on the ptid usage on this target.
368
369 The pid field represents the kvm inferior instance. Currently,
370 we don't support multiple kvm inferiors, but we start at 1
371 anyway. The lwp field is set to != 0, in case the core wants to
372 refer to the whole kvm inferior with ptid(1,0,0).
373
374 If kvm is made to export running processes as gdb threads,
375 the following form can be used:
376 ptid (1, 1, 0) -> kvm inferior 1, in kernel
377 ptid (1, 1, 1) -> kvm inferior 1, process 1
378 ptid (1, 1, 2) -> kvm inferior 1, process 2
379 ptid (1, 1, n) -> kvm inferior 1, process n
380 */
381 bsd_kvm_ptid = ptid_build (1, 1, 0);
382 }
This page took 0.071399 seconds and 5 git commands to generate.