Check whether kernel supports PTRACE_GETREGSET
[deliverable/binutils-gdb.git] / gdb / arm-linux-nat.c
1 /* GNU/Linux on ARM native support.
2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19 #include "defs.h"
20 #include "inferior.h"
21 #include "gdbcore.h"
22 #include "regcache.h"
23 #include "target.h"
24 #include "linux-nat.h"
25 #include "target-descriptions.h"
26 #include "auxv.h"
27 #include "observer.h"
28 #include "gdbthread.h"
29
30 #include "arm-tdep.h"
31 #include "arm-linux-tdep.h"
32
33 #include <elf/common.h>
34 #include <sys/user.h>
35 #include <sys/ptrace.h>
36 #include <sys/utsname.h>
37 #include <sys/procfs.h>
38
39 /* Prototypes for supply_gregset etc. */
40 #include "gregset.h"
41
42 /* Defines ps_err_e, struct ps_prochandle. */
43 #include "gdb_proc_service.h"
44
45 #ifndef PTRACE_GET_THREAD_AREA
46 #define PTRACE_GET_THREAD_AREA 22
47 #endif
48
49 #ifndef PTRACE_GETWMMXREGS
50 #define PTRACE_GETWMMXREGS 18
51 #define PTRACE_SETWMMXREGS 19
52 #endif
53
54 #ifndef PTRACE_GETVFPREGS
55 #define PTRACE_GETVFPREGS 27
56 #define PTRACE_SETVFPREGS 28
57 #endif
58
59 #ifndef PTRACE_GETHBPREGS
60 #define PTRACE_GETHBPREGS 29
61 #define PTRACE_SETHBPREGS 30
62 #endif
63
64 extern int arm_apcs_32;
65
66 /* On GNU/Linux, threads are implemented as pseudo-processes, in which
67 case we may be tracing more than one process at a time. In that
68 case, inferior_ptid will contain the main process ID and the
69 individual thread (process) ID. get_thread_id () is used to get
70 the thread id if it's available, and the process id otherwise. */
71
72 static int
73 get_thread_id (ptid_t ptid)
74 {
75 int tid = ptid_get_lwp (ptid);
76 if (0 == tid)
77 tid = ptid_get_pid (ptid);
78 return tid;
79 }
80
81 #define GET_THREAD_ID(PTID) get_thread_id (PTID)
82
83 /* Get the value of a particular register from the floating point
84 state of the process and store it into regcache. */
85
86 static void
87 fetch_fpregister (struct regcache *regcache, int regno)
88 {
89 int ret, tid;
90 gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
91
92 /* Get the thread id for the ptrace call. */
93 tid = GET_THREAD_ID (inferior_ptid);
94
95 /* Read the floating point state. */
96 ret = ptrace (PT_GETFPREGS, tid, 0, fp);
97 if (ret < 0)
98 {
99 warning (_("Unable to fetch floating point register."));
100 return;
101 }
102
103 /* Fetch fpsr. */
104 if (ARM_FPS_REGNUM == regno)
105 regcache_raw_supply (regcache, ARM_FPS_REGNUM,
106 fp + NWFPE_FPSR_OFFSET);
107
108 /* Fetch the floating point register. */
109 if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
110 supply_nwfpe_register (regcache, regno, fp);
111 }
112
113 /* Get the whole floating point state of the process and store it
114 into regcache. */
115
116 static void
117 fetch_fpregs (struct regcache *regcache)
118 {
119 int ret, regno, tid;
120 gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
121
122 /* Get the thread id for the ptrace call. */
123 tid = GET_THREAD_ID (inferior_ptid);
124
125 /* Read the floating point state. */
126 ret = ptrace (PT_GETFPREGS, tid, 0, fp);
127 if (ret < 0)
128 {
129 warning (_("Unable to fetch the floating point registers."));
130 return;
131 }
132
133 /* Fetch fpsr. */
134 regcache_raw_supply (regcache, ARM_FPS_REGNUM,
135 fp + NWFPE_FPSR_OFFSET);
136
137 /* Fetch the floating point registers. */
138 for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
139 supply_nwfpe_register (regcache, regno, fp);
140 }
141
142 /* Save a particular register into the floating point state of the
143 process using the contents from regcache. */
144
145 static void
146 store_fpregister (const struct regcache *regcache, int regno)
147 {
148 int ret, tid;
149 gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
150
151 /* Get the thread id for the ptrace call. */
152 tid = GET_THREAD_ID (inferior_ptid);
153
154 /* Read the floating point state. */
155 ret = ptrace (PT_GETFPREGS, tid, 0, fp);
156 if (ret < 0)
157 {
158 warning (_("Unable to fetch the floating point registers."));
159 return;
160 }
161
162 /* Store fpsr. */
163 if (ARM_FPS_REGNUM == regno
164 && REG_VALID == regcache_register_status (regcache, ARM_FPS_REGNUM))
165 regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
166
167 /* Store the floating point register. */
168 if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
169 collect_nwfpe_register (regcache, regno, fp);
170
171 ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
172 if (ret < 0)
173 {
174 warning (_("Unable to store floating point register."));
175 return;
176 }
177 }
178
179 /* Save the whole floating point state of the process using
180 the contents from regcache. */
181
182 static void
183 store_fpregs (const struct regcache *regcache)
184 {
185 int ret, regno, tid;
186 gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
187
188 /* Get the thread id for the ptrace call. */
189 tid = GET_THREAD_ID (inferior_ptid);
190
191 /* Read the floating point state. */
192 ret = ptrace (PT_GETFPREGS, tid, 0, fp);
193 if (ret < 0)
194 {
195 warning (_("Unable to fetch the floating point registers."));
196 return;
197 }
198
199 /* Store fpsr. */
200 if (REG_VALID == regcache_register_status (regcache, ARM_FPS_REGNUM))
201 regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
202
203 /* Store the floating point registers. */
204 for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
205 if (REG_VALID == regcache_register_status (regcache, regno))
206 collect_nwfpe_register (regcache, regno, fp);
207
208 ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
209 if (ret < 0)
210 {
211 warning (_("Unable to store floating point registers."));
212 return;
213 }
214 }
215
216 /* Fetch a general register of the process and store into
217 regcache. */
218
219 static void
220 fetch_register (struct regcache *regcache, int regno)
221 {
222 int ret, tid;
223 elf_gregset_t regs;
224
225 /* Get the thread id for the ptrace call. */
226 tid = GET_THREAD_ID (inferior_ptid);
227
228 ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
229 if (ret < 0)
230 {
231 warning (_("Unable to fetch general register."));
232 return;
233 }
234
235 if (regno >= ARM_A1_REGNUM && regno < ARM_PC_REGNUM)
236 regcache_raw_supply (regcache, regno, (char *) &regs[regno]);
237
238 if (ARM_PS_REGNUM == regno)
239 {
240 if (arm_apcs_32)
241 regcache_raw_supply (regcache, ARM_PS_REGNUM,
242 (char *) &regs[ARM_CPSR_GREGNUM]);
243 else
244 regcache_raw_supply (regcache, ARM_PS_REGNUM,
245 (char *) &regs[ARM_PC_REGNUM]);
246 }
247
248 if (ARM_PC_REGNUM == regno)
249 {
250 regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
251 (get_regcache_arch (regcache),
252 regs[ARM_PC_REGNUM]);
253 regcache_raw_supply (regcache, ARM_PC_REGNUM,
254 (char *) &regs[ARM_PC_REGNUM]);
255 }
256 }
257
258 /* Fetch all general registers of the process and store into
259 regcache. */
260
261 static void
262 fetch_regs (struct regcache *regcache)
263 {
264 int ret, regno, tid;
265 elf_gregset_t regs;
266
267 /* Get the thread id for the ptrace call. */
268 tid = GET_THREAD_ID (inferior_ptid);
269
270 ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
271 if (ret < 0)
272 {
273 warning (_("Unable to fetch general registers."));
274 return;
275 }
276
277 for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
278 regcache_raw_supply (regcache, regno, (char *) &regs[regno]);
279
280 if (arm_apcs_32)
281 regcache_raw_supply (regcache, ARM_PS_REGNUM,
282 (char *) &regs[ARM_CPSR_GREGNUM]);
283 else
284 regcache_raw_supply (regcache, ARM_PS_REGNUM,
285 (char *) &regs[ARM_PC_REGNUM]);
286
287 regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
288 (get_regcache_arch (regcache), regs[ARM_PC_REGNUM]);
289 regcache_raw_supply (regcache, ARM_PC_REGNUM,
290 (char *) &regs[ARM_PC_REGNUM]);
291 }
292
293 /* Store all general registers of the process from the values in
294 regcache. */
295
296 static void
297 store_register (const struct regcache *regcache, int regno)
298 {
299 int ret, tid;
300 elf_gregset_t regs;
301
302 if (REG_VALID != regcache_register_status (regcache, regno))
303 return;
304
305 /* Get the thread id for the ptrace call. */
306 tid = GET_THREAD_ID (inferior_ptid);
307
308 /* Get the general registers from the process. */
309 ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
310 if (ret < 0)
311 {
312 warning (_("Unable to fetch general registers."));
313 return;
314 }
315
316 if (regno >= ARM_A1_REGNUM && regno <= ARM_PC_REGNUM)
317 regcache_raw_collect (regcache, regno, (char *) &regs[regno]);
318 else if (arm_apcs_32 && regno == ARM_PS_REGNUM)
319 regcache_raw_collect (regcache, regno,
320 (char *) &regs[ARM_CPSR_GREGNUM]);
321 else if (!arm_apcs_32 && regno == ARM_PS_REGNUM)
322 regcache_raw_collect (regcache, ARM_PC_REGNUM,
323 (char *) &regs[ARM_PC_REGNUM]);
324
325 ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
326 if (ret < 0)
327 {
328 warning (_("Unable to store general register."));
329 return;
330 }
331 }
332
333 static void
334 store_regs (const struct regcache *regcache)
335 {
336 int ret, regno, tid;
337 elf_gregset_t regs;
338
339 /* Get the thread id for the ptrace call. */
340 tid = GET_THREAD_ID (inferior_ptid);
341
342 /* Fetch the general registers. */
343 ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
344 if (ret < 0)
345 {
346 warning (_("Unable to fetch general registers."));
347 return;
348 }
349
350 for (regno = ARM_A1_REGNUM; regno <= ARM_PC_REGNUM; regno++)
351 {
352 if (REG_VALID == regcache_register_status (regcache, regno))
353 regcache_raw_collect (regcache, regno, (char *) &regs[regno]);
354 }
355
356 if (arm_apcs_32 && REG_VALID == regcache_register_status (regcache, ARM_PS_REGNUM))
357 regcache_raw_collect (regcache, ARM_PS_REGNUM,
358 (char *) &regs[ARM_CPSR_GREGNUM]);
359
360 ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
361
362 if (ret < 0)
363 {
364 warning (_("Unable to store general registers."));
365 return;
366 }
367 }
368
369 /* Fetch all WMMX registers of the process and store into
370 regcache. */
371
372 #define IWMMXT_REGS_SIZE (16 * 8 + 6 * 4)
373
374 static void
375 fetch_wmmx_regs (struct regcache *regcache)
376 {
377 char regbuf[IWMMXT_REGS_SIZE];
378 int ret, regno, tid;
379
380 /* Get the thread id for the ptrace call. */
381 tid = GET_THREAD_ID (inferior_ptid);
382
383 ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
384 if (ret < 0)
385 {
386 warning (_("Unable to fetch WMMX registers."));
387 return;
388 }
389
390 for (regno = 0; regno < 16; regno++)
391 regcache_raw_supply (regcache, regno + ARM_WR0_REGNUM,
392 &regbuf[regno * 8]);
393
394 for (regno = 0; regno < 2; regno++)
395 regcache_raw_supply (regcache, regno + ARM_WCSSF_REGNUM,
396 &regbuf[16 * 8 + regno * 4]);
397
398 for (regno = 0; regno < 4; regno++)
399 regcache_raw_supply (regcache, regno + ARM_WCGR0_REGNUM,
400 &regbuf[16 * 8 + 2 * 4 + regno * 4]);
401 }
402
403 static void
404 store_wmmx_regs (const struct regcache *regcache)
405 {
406 char regbuf[IWMMXT_REGS_SIZE];
407 int ret, regno, tid;
408
409 /* Get the thread id for the ptrace call. */
410 tid = GET_THREAD_ID (inferior_ptid);
411
412 ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
413 if (ret < 0)
414 {
415 warning (_("Unable to fetch WMMX registers."));
416 return;
417 }
418
419 for (regno = 0; regno < 16; regno++)
420 if (REG_VALID == regcache_register_status (regcache,
421 regno + ARM_WR0_REGNUM))
422 regcache_raw_collect (regcache, regno + ARM_WR0_REGNUM,
423 &regbuf[regno * 8]);
424
425 for (regno = 0; regno < 2; regno++)
426 if (REG_VALID == regcache_register_status (regcache,
427 regno + ARM_WCSSF_REGNUM))
428 regcache_raw_collect (regcache, regno + ARM_WCSSF_REGNUM,
429 &regbuf[16 * 8 + regno * 4]);
430
431 for (regno = 0; regno < 4; regno++)
432 if (REG_VALID == regcache_register_status (regcache,
433 regno + ARM_WCGR0_REGNUM))
434 regcache_raw_collect (regcache, regno + ARM_WCGR0_REGNUM,
435 &regbuf[16 * 8 + 2 * 4 + regno * 4]);
436
437 ret = ptrace (PTRACE_SETWMMXREGS, tid, 0, regbuf);
438
439 if (ret < 0)
440 {
441 warning (_("Unable to store WMMX registers."));
442 return;
443 }
444 }
445
446 /* Fetch and store VFP Registers. The kernel object has space for 32
447 64-bit registers, and the FPSCR. This is even when on a VFPv2 or
448 VFPv3D16 target. */
449 #define VFP_REGS_SIZE (32 * 8 + 4)
450
451 static void
452 fetch_vfp_regs (struct regcache *regcache)
453 {
454 char regbuf[VFP_REGS_SIZE];
455 int ret, regno, tid;
456 struct gdbarch *gdbarch = get_regcache_arch (regcache);
457 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
458
459 /* Get the thread id for the ptrace call. */
460 tid = GET_THREAD_ID (inferior_ptid);
461
462 ret = ptrace (PTRACE_GETVFPREGS, tid, 0, regbuf);
463 if (ret < 0)
464 {
465 warning (_("Unable to fetch VFP registers."));
466 return;
467 }
468
469 for (regno = 0; regno < tdep->vfp_register_count; regno++)
470 regcache_raw_supply (regcache, regno + ARM_D0_REGNUM,
471 (char *) regbuf + regno * 8);
472
473 regcache_raw_supply (regcache, ARM_FPSCR_REGNUM,
474 (char *) regbuf + 32 * 8);
475 }
476
477 static void
478 store_vfp_regs (const struct regcache *regcache)
479 {
480 char regbuf[VFP_REGS_SIZE];
481 int ret, regno, tid;
482 struct gdbarch *gdbarch = get_regcache_arch (regcache);
483 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
484
485 /* Get the thread id for the ptrace call. */
486 tid = GET_THREAD_ID (inferior_ptid);
487
488 ret = ptrace (PTRACE_GETVFPREGS, tid, 0, regbuf);
489 if (ret < 0)
490 {
491 warning (_("Unable to fetch VFP registers (for update)."));
492 return;
493 }
494
495 for (regno = 0; regno < tdep->vfp_register_count; regno++)
496 regcache_raw_collect (regcache, regno + ARM_D0_REGNUM,
497 (char *) regbuf + regno * 8);
498
499 regcache_raw_collect (regcache, ARM_FPSCR_REGNUM,
500 (char *) regbuf + 32 * 8);
501
502 ret = ptrace (PTRACE_SETVFPREGS, tid, 0, regbuf);
503
504 if (ret < 0)
505 {
506 warning (_("Unable to store VFP registers."));
507 return;
508 }
509 }
510
511 /* Fetch registers from the child process. Fetch all registers if
512 regno == -1, otherwise fetch all general registers or all floating
513 point registers depending upon the value of regno. */
514
515 static void
516 arm_linux_fetch_inferior_registers (struct target_ops *ops,
517 struct regcache *regcache, int regno)
518 {
519 struct gdbarch *gdbarch = get_regcache_arch (regcache);
520 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
521
522 if (-1 == regno)
523 {
524 fetch_regs (regcache);
525 fetch_fpregs (regcache);
526 if (tdep->have_wmmx_registers)
527 fetch_wmmx_regs (regcache);
528 if (tdep->vfp_register_count > 0)
529 fetch_vfp_regs (regcache);
530 }
531 else
532 {
533 if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
534 fetch_register (regcache, regno);
535 else if (regno >= ARM_F0_REGNUM && regno <= ARM_FPS_REGNUM)
536 fetch_fpregister (regcache, regno);
537 else if (tdep->have_wmmx_registers
538 && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
539 fetch_wmmx_regs (regcache);
540 else if (tdep->vfp_register_count > 0
541 && regno >= ARM_D0_REGNUM
542 && regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
543 fetch_vfp_regs (regcache);
544 }
545 }
546
547 /* Store registers back into the inferior. Store all registers if
548 regno == -1, otherwise store all general registers or all floating
549 point registers depending upon the value of regno. */
550
551 static void
552 arm_linux_store_inferior_registers (struct target_ops *ops,
553 struct regcache *regcache, int regno)
554 {
555 struct gdbarch *gdbarch = get_regcache_arch (regcache);
556 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
557
558 if (-1 == regno)
559 {
560 store_regs (regcache);
561 store_fpregs (regcache);
562 if (tdep->have_wmmx_registers)
563 store_wmmx_regs (regcache);
564 if (tdep->vfp_register_count > 0)
565 store_vfp_regs (regcache);
566 }
567 else
568 {
569 if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
570 store_register (regcache, regno);
571 else if ((regno >= ARM_F0_REGNUM) && (regno <= ARM_FPS_REGNUM))
572 store_fpregister (regcache, regno);
573 else if (tdep->have_wmmx_registers
574 && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
575 store_wmmx_regs (regcache);
576 else if (tdep->vfp_register_count > 0
577 && regno >= ARM_D0_REGNUM
578 && regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
579 store_vfp_regs (regcache);
580 }
581 }
582
583 /* Wrapper functions for the standard regset handling, used by
584 thread debugging. */
585
586 void
587 fill_gregset (const struct regcache *regcache,
588 gdb_gregset_t *gregsetp, int regno)
589 {
590 arm_linux_collect_gregset (NULL, regcache, regno, gregsetp, 0);
591 }
592
593 void
594 supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
595 {
596 arm_linux_supply_gregset (NULL, regcache, -1, gregsetp, 0);
597 }
598
599 void
600 fill_fpregset (const struct regcache *regcache,
601 gdb_fpregset_t *fpregsetp, int regno)
602 {
603 arm_linux_collect_nwfpe (NULL, regcache, regno, fpregsetp, 0);
604 }
605
606 /* Fill GDB's register array with the floating-point register values
607 in *fpregsetp. */
608
609 void
610 supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
611 {
612 arm_linux_supply_nwfpe (NULL, regcache, -1, fpregsetp, 0);
613 }
614
615 /* Fetch the thread-local storage pointer for libthread_db. */
616
617 ps_err_e
618 ps_get_thread_area (const struct ps_prochandle *ph,
619 lwpid_t lwpid, int idx, void **base)
620 {
621 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
622 return PS_ERR;
623
624 /* IDX is the bias from the thread pointer to the beginning of the
625 thread descriptor. It has to be subtracted due to implementation
626 quirks in libthread_db. */
627 *base = (void *) ((char *)*base - idx);
628
629 return PS_OK;
630 }
631
632 static const struct target_desc *
633 arm_linux_read_description (struct target_ops *ops)
634 {
635 CORE_ADDR arm_hwcap = 0;
636
637 if (have_ptrace_getregset == -1)
638 {
639 elf_gregset_t gpregs;
640 struct iovec iov;
641 int tid = GET_THREAD_ID (inferior_ptid);
642
643 iov.iov_base = &gpregs;
644 iov.iov_len = sizeof (gpregs);
645
646 /* Check if PTRACE_GETREGSET works. */
647 if (ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov) < 0)
648 have_ptrace_getregset = 0;
649 else
650 have_ptrace_getregset = 1;
651 }
652
653 if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
654 {
655 return ops->beneath->to_read_description (ops->beneath);
656 }
657
658 if (arm_hwcap & HWCAP_IWMMXT)
659 return tdesc_arm_with_iwmmxt;
660
661 if (arm_hwcap & HWCAP_VFP)
662 {
663 int pid;
664 char *buf;
665 const struct target_desc * result = NULL;
666
667 /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
668 Neon with VFPv3-D32. */
669 if (arm_hwcap & HWCAP_NEON)
670 result = tdesc_arm_with_neon;
671 else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
672 result = tdesc_arm_with_vfpv3;
673 else
674 result = tdesc_arm_with_vfpv2;
675
676 /* Now make sure that the kernel supports reading these
677 registers. Support was added in 2.6.30. */
678 pid = ptid_get_lwp (inferior_ptid);
679 errno = 0;
680 buf = alloca (VFP_REGS_SIZE);
681 if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0
682 && errno == EIO)
683 result = NULL;
684
685 return result;
686 }
687
688 return ops->beneath->to_read_description (ops->beneath);
689 }
690
691 /* Information describing the hardware breakpoint capabilities. */
692 struct arm_linux_hwbp_cap
693 {
694 gdb_byte arch;
695 gdb_byte max_wp_length;
696 gdb_byte wp_count;
697 gdb_byte bp_count;
698 };
699
700 /* Since we cannot dynamically allocate subfields of arm_linux_process_info,
701 assume a maximum number of supported break-/watchpoints. */
702 #define MAX_BPTS 16
703 #define MAX_WPTS 16
704
705 /* Get hold of the Hardware Breakpoint information for the target we are
706 attached to. Returns NULL if the kernel doesn't support Hardware
707 breakpoints at all, or a pointer to the information structure. */
708 static const struct arm_linux_hwbp_cap *
709 arm_linux_get_hwbp_cap (void)
710 {
711 /* The info structure we return. */
712 static struct arm_linux_hwbp_cap info;
713
714 /* Is INFO in a good state? -1 means that no attempt has been made to
715 initialize INFO; 0 means an attempt has been made, but it failed; 1
716 means INFO is in an initialized state. */
717 static int available = -1;
718
719 if (available == -1)
720 {
721 int tid;
722 unsigned int val;
723
724 tid = GET_THREAD_ID (inferior_ptid);
725 if (ptrace (PTRACE_GETHBPREGS, tid, 0, &val) < 0)
726 available = 0;
727 else
728 {
729 info.arch = (gdb_byte)((val >> 24) & 0xff);
730 info.max_wp_length = (gdb_byte)((val >> 16) & 0xff);
731 info.wp_count = (gdb_byte)((val >> 8) & 0xff);
732 info.bp_count = (gdb_byte)(val & 0xff);
733
734 if (info.wp_count > MAX_WPTS)
735 {
736 warning (_("arm-linux-gdb supports %d hardware watchpoints but target \
737 supports %d"), MAX_WPTS, info.wp_count);
738 info.wp_count = MAX_WPTS;
739 }
740
741 if (info.bp_count > MAX_BPTS)
742 {
743 warning (_("arm-linux-gdb supports %d hardware breakpoints but target \
744 supports %d"), MAX_BPTS, info.bp_count);
745 info.bp_count = MAX_BPTS;
746 }
747 available = (info.arch != 0);
748 }
749 }
750
751 return available == 1 ? &info : NULL;
752 }
753
754 /* How many hardware breakpoints are available? */
755 static int
756 arm_linux_get_hw_breakpoint_count (void)
757 {
758 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
759 return cap != NULL ? cap->bp_count : 0;
760 }
761
762 /* How many hardware watchpoints are available? */
763 static int
764 arm_linux_get_hw_watchpoint_count (void)
765 {
766 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
767 return cap != NULL ? cap->wp_count : 0;
768 }
769
770 /* Have we got a free break-/watch-point available for use? Returns -1 if
771 there is not an appropriate resource available, otherwise returns 1. */
772 static int
773 arm_linux_can_use_hw_breakpoint (struct target_ops *self,
774 int type, int cnt, int ot)
775 {
776 if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
777 || type == bp_access_watchpoint || type == bp_watchpoint)
778 {
779 int count = arm_linux_get_hw_watchpoint_count ();
780
781 if (count == 0)
782 return 0;
783 else if (cnt + ot > count)
784 return -1;
785 }
786 else if (type == bp_hardware_breakpoint)
787 {
788 int count = arm_linux_get_hw_breakpoint_count ();
789
790 if (count == 0)
791 return 0;
792 else if (cnt > count)
793 return -1;
794 }
795 else
796 gdb_assert (FALSE);
797
798 return 1;
799 }
800
801 /* Enum describing the different types of ARM hardware break-/watch-points. */
802 typedef enum
803 {
804 arm_hwbp_break = 0,
805 arm_hwbp_load = 1,
806 arm_hwbp_store = 2,
807 arm_hwbp_access = 3
808 } arm_hwbp_type;
809
810 /* Type describing an ARM Hardware Breakpoint Control register value. */
811 typedef unsigned int arm_hwbp_control_t;
812
813 /* Structure used to keep track of hardware break-/watch-points. */
814 struct arm_linux_hw_breakpoint
815 {
816 /* Address to break on, or being watched. */
817 unsigned int address;
818 /* Control register for break-/watch- point. */
819 arm_hwbp_control_t control;
820 };
821
822 /* Structure containing arrays of per process hardware break-/watchpoints
823 for caching address and control information.
824
825 The Linux ptrace interface to hardware break-/watch-points presents the
826 values in a vector centred around 0 (which is used fo generic information).
827 Positive indicies refer to breakpoint addresses/control registers, negative
828 indices to watchpoint addresses/control registers.
829
830 The Linux vector is indexed as follows:
831 -((i << 1) + 2): Control register for watchpoint i.
832 -((i << 1) + 1): Address register for watchpoint i.
833 0: Information register.
834 ((i << 1) + 1): Address register for breakpoint i.
835 ((i << 1) + 2): Control register for breakpoint i.
836
837 This structure is used as a per-thread cache of the state stored by the
838 kernel, so that we don't need to keep calling into the kernel to find a
839 free breakpoint.
840
841 We treat break-/watch-points with their enable bit clear as being deleted.
842 */
843 struct arm_linux_debug_reg_state
844 {
845 /* Hardware breakpoints for this process. */
846 struct arm_linux_hw_breakpoint bpts[MAX_BPTS];
847 /* Hardware watchpoints for this process. */
848 struct arm_linux_hw_breakpoint wpts[MAX_WPTS];
849 };
850
851 /* Per-process arch-specific data we want to keep. */
852 struct arm_linux_process_info
853 {
854 /* Linked list. */
855 struct arm_linux_process_info *next;
856 /* The process identifier. */
857 pid_t pid;
858 /* Hardware break-/watchpoints state information. */
859 struct arm_linux_debug_reg_state state;
860
861 };
862
863 /* Per-thread arch-specific data we want to keep. */
864 struct arch_lwp_info
865 {
866 /* Non-zero if our copy differs from what's recorded in the thread. */
867 char bpts_changed[MAX_BPTS];
868 char wpts_changed[MAX_WPTS];
869 };
870
871 static struct arm_linux_process_info *arm_linux_process_list = NULL;
872
873 /* Find process data for process PID. */
874
875 static struct arm_linux_process_info *
876 arm_linux_find_process_pid (pid_t pid)
877 {
878 struct arm_linux_process_info *proc;
879
880 for (proc = arm_linux_process_list; proc; proc = proc->next)
881 if (proc->pid == pid)
882 return proc;
883
884 return NULL;
885 }
886
887 /* Add process data for process PID. Returns newly allocated info
888 object. */
889
890 static struct arm_linux_process_info *
891 arm_linux_add_process (pid_t pid)
892 {
893 struct arm_linux_process_info *proc;
894
895 proc = xcalloc (1, sizeof (*proc));
896 proc->pid = pid;
897
898 proc->next = arm_linux_process_list;
899 arm_linux_process_list = proc;
900
901 return proc;
902 }
903
904 /* Get data specific info for process PID, creating it if necessary.
905 Never returns NULL. */
906
907 static struct arm_linux_process_info *
908 arm_linux_process_info_get (pid_t pid)
909 {
910 struct arm_linux_process_info *proc;
911
912 proc = arm_linux_find_process_pid (pid);
913 if (proc == NULL)
914 proc = arm_linux_add_process (pid);
915
916 return proc;
917 }
918
919 /* Called whenever GDB is no longer debugging process PID. It deletes
920 data structures that keep track of debug register state. */
921
922 static void
923 arm_linux_forget_process (pid_t pid)
924 {
925 struct arm_linux_process_info *proc, **proc_link;
926
927 proc = arm_linux_process_list;
928 proc_link = &arm_linux_process_list;
929
930 while (proc != NULL)
931 {
932 if (proc->pid == pid)
933 {
934 *proc_link = proc->next;
935
936 xfree (proc);
937 return;
938 }
939
940 proc_link = &proc->next;
941 proc = *proc_link;
942 }
943 }
944
945 /* Get hardware break-/watchpoint state for process PID. */
946
947 static struct arm_linux_debug_reg_state *
948 arm_linux_get_debug_reg_state (pid_t pid)
949 {
950 return &arm_linux_process_info_get (pid)->state;
951 }
952
953 /* Initialize an ARM hardware break-/watch-point control register value.
954 BYTE_ADDRESS_SELECT is the mask of bytes to trigger on; HWBP_TYPE is the
955 type of break-/watch-point; ENABLE indicates whether the point is enabled.
956 */
957 static arm_hwbp_control_t
958 arm_hwbp_control_initialize (unsigned byte_address_select,
959 arm_hwbp_type hwbp_type,
960 int enable)
961 {
962 gdb_assert ((byte_address_select & ~0xffU) == 0);
963 gdb_assert (hwbp_type != arm_hwbp_break
964 || ((byte_address_select & 0xfU) != 0));
965
966 return (byte_address_select << 5) | (hwbp_type << 3) | (3 << 1) | enable;
967 }
968
969 /* Does the breakpoint control value CONTROL have the enable bit set? */
970 static int
971 arm_hwbp_control_is_enabled (arm_hwbp_control_t control)
972 {
973 return control & 0x1;
974 }
975
976 /* Change a breakpoint control word so that it is in the disabled state. */
977 static arm_hwbp_control_t
978 arm_hwbp_control_disable (arm_hwbp_control_t control)
979 {
980 return control & ~0x1;
981 }
982
983 /* Initialise the hardware breakpoint structure P. The breakpoint will be
984 enabled, and will point to the placed address of BP_TGT. */
985 static void
986 arm_linux_hw_breakpoint_initialize (struct gdbarch *gdbarch,
987 struct bp_target_info *bp_tgt,
988 struct arm_linux_hw_breakpoint *p)
989 {
990 unsigned mask;
991 CORE_ADDR address = bp_tgt->placed_address = bp_tgt->reqstd_address;
992
993 /* We have to create a mask for the control register which says which bits
994 of the word pointed to by address to break on. */
995 if (arm_pc_is_thumb (gdbarch, address))
996 {
997 mask = 0x3;
998 address &= ~1;
999 }
1000 else
1001 {
1002 mask = 0xf;
1003 address &= ~3;
1004 }
1005
1006 p->address = (unsigned int) address;
1007 p->control = arm_hwbp_control_initialize (mask, arm_hwbp_break, 1);
1008 }
1009
1010 /* Get the ARM hardware breakpoint type from the RW value we're given when
1011 asked to set a watchpoint. */
1012 static arm_hwbp_type
1013 arm_linux_get_hwbp_type (int rw)
1014 {
1015 if (rw == hw_read)
1016 return arm_hwbp_load;
1017 else if (rw == hw_write)
1018 return arm_hwbp_store;
1019 else
1020 return arm_hwbp_access;
1021 }
1022
1023 /* Initialize the hardware breakpoint structure P for a watchpoint at ADDR
1024 to LEN. The type of watchpoint is given in RW. */
1025 static void
1026 arm_linux_hw_watchpoint_initialize (CORE_ADDR addr, int len, int rw,
1027 struct arm_linux_hw_breakpoint *p)
1028 {
1029 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1030 unsigned mask;
1031
1032 gdb_assert (cap != NULL);
1033 gdb_assert (cap->max_wp_length != 0);
1034
1035 mask = (1 << len) - 1;
1036
1037 p->address = (unsigned int) addr;
1038 p->control = arm_hwbp_control_initialize (mask,
1039 arm_linux_get_hwbp_type (rw), 1);
1040 }
1041
1042 /* Are two break-/watch-points equal? */
1043 static int
1044 arm_linux_hw_breakpoint_equal (const struct arm_linux_hw_breakpoint *p1,
1045 const struct arm_linux_hw_breakpoint *p2)
1046 {
1047 return p1->address == p2->address && p1->control == p2->control;
1048 }
1049
1050 /* Callback to mark a watch-/breakpoint to be updated in all threads of
1051 the current process. */
1052
1053 struct update_registers_data
1054 {
1055 int watch;
1056 int index;
1057 };
1058
1059 static int
1060 update_registers_callback (struct lwp_info *lwp, void *arg)
1061 {
1062 struct update_registers_data *data = (struct update_registers_data *) arg;
1063
1064 if (lwp->arch_private == NULL)
1065 lwp->arch_private = XCNEW (struct arch_lwp_info);
1066
1067 /* The actual update is done later just before resuming the lwp,
1068 we just mark that the registers need updating. */
1069 if (data->watch)
1070 lwp->arch_private->wpts_changed[data->index] = 1;
1071 else
1072 lwp->arch_private->bpts_changed[data->index] = 1;
1073
1074 /* If the lwp isn't stopped, force it to momentarily pause, so
1075 we can update its breakpoint registers. */
1076 if (!lwp->stopped)
1077 linux_stop_lwp (lwp);
1078
1079 return 0;
1080 }
1081
1082 /* Insert the hardware breakpoint (WATCHPOINT = 0) or watchpoint (WATCHPOINT
1083 =1) BPT for thread TID. */
1084 static void
1085 arm_linux_insert_hw_breakpoint1 (const struct arm_linux_hw_breakpoint* bpt,
1086 int watchpoint)
1087 {
1088 int pid;
1089 ptid_t pid_ptid;
1090 gdb_byte count, i;
1091 struct arm_linux_hw_breakpoint* bpts;
1092 struct update_registers_data data;
1093
1094 pid = ptid_get_pid (inferior_ptid);
1095 pid_ptid = pid_to_ptid (pid);
1096
1097 if (watchpoint)
1098 {
1099 count = arm_linux_get_hw_watchpoint_count ();
1100 bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1101 }
1102 else
1103 {
1104 count = arm_linux_get_hw_breakpoint_count ();
1105 bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1106 }
1107
1108 for (i = 0; i < count; ++i)
1109 if (!arm_hwbp_control_is_enabled (bpts[i].control))
1110 {
1111 data.watch = watchpoint;
1112 data.index = i;
1113 bpts[i] = *bpt;
1114 iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1115 break;
1116 }
1117
1118 gdb_assert (i != count);
1119 }
1120
1121 /* Remove the hardware breakpoint (WATCHPOINT = 0) or watchpoint
1122 (WATCHPOINT = 1) BPT for thread TID. */
1123 static void
1124 arm_linux_remove_hw_breakpoint1 (const struct arm_linux_hw_breakpoint *bpt,
1125 int watchpoint)
1126 {
1127 int pid;
1128 gdb_byte count, i;
1129 ptid_t pid_ptid;
1130 struct arm_linux_hw_breakpoint* bpts;
1131 struct update_registers_data data;
1132
1133 pid = ptid_get_pid (inferior_ptid);
1134 pid_ptid = pid_to_ptid (pid);
1135
1136 if (watchpoint)
1137 {
1138 count = arm_linux_get_hw_watchpoint_count ();
1139 bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1140 }
1141 else
1142 {
1143 count = arm_linux_get_hw_breakpoint_count ();
1144 bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1145 }
1146
1147 for (i = 0; i < count; ++i)
1148 if (arm_linux_hw_breakpoint_equal (bpt, bpts + i))
1149 {
1150 data.watch = watchpoint;
1151 data.index = i;
1152 bpts[i].control = arm_hwbp_control_disable (bpts[i].control);
1153 iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1154 break;
1155 }
1156
1157 gdb_assert (i != count);
1158 }
1159
1160 /* Insert a Hardware breakpoint. */
1161 static int
1162 arm_linux_insert_hw_breakpoint (struct target_ops *self,
1163 struct gdbarch *gdbarch,
1164 struct bp_target_info *bp_tgt)
1165 {
1166 struct lwp_info *lp;
1167 struct arm_linux_hw_breakpoint p;
1168
1169 if (arm_linux_get_hw_breakpoint_count () == 0)
1170 return -1;
1171
1172 arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1173
1174 arm_linux_insert_hw_breakpoint1 (&p, 0);
1175
1176 return 0;
1177 }
1178
1179 /* Remove a hardware breakpoint. */
1180 static int
1181 arm_linux_remove_hw_breakpoint (struct target_ops *self,
1182 struct gdbarch *gdbarch,
1183 struct bp_target_info *bp_tgt)
1184 {
1185 struct lwp_info *lp;
1186 struct arm_linux_hw_breakpoint p;
1187
1188 if (arm_linux_get_hw_breakpoint_count () == 0)
1189 return -1;
1190
1191 arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1192
1193 arm_linux_remove_hw_breakpoint1 (&p, 0);
1194
1195 return 0;
1196 }
1197
1198 /* Are we able to use a hardware watchpoint for the LEN bytes starting at
1199 ADDR? */
1200 static int
1201 arm_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
1202 CORE_ADDR addr, int len)
1203 {
1204 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1205 CORE_ADDR max_wp_length, aligned_addr;
1206
1207 /* Can not set watchpoints for zero or negative lengths. */
1208 if (len <= 0)
1209 return 0;
1210
1211 /* Need to be able to use the ptrace interface. */
1212 if (cap == NULL || cap->wp_count == 0)
1213 return 0;
1214
1215 /* Test that the range [ADDR, ADDR + LEN) fits into the largest address
1216 range covered by a watchpoint. */
1217 max_wp_length = (CORE_ADDR)cap->max_wp_length;
1218 aligned_addr = addr & ~(max_wp_length - 1);
1219
1220 if (aligned_addr + max_wp_length < addr + len)
1221 return 0;
1222
1223 /* The current ptrace interface can only handle watchpoints that are a
1224 power of 2. */
1225 if ((len & (len - 1)) != 0)
1226 return 0;
1227
1228 /* All tests passed so we must be able to set a watchpoint. */
1229 return 1;
1230 }
1231
1232 /* Insert a Hardware breakpoint. */
1233 static int
1234 arm_linux_insert_watchpoint (struct target_ops *self,
1235 CORE_ADDR addr, int len, int rw,
1236 struct expression *cond)
1237 {
1238 struct lwp_info *lp;
1239 struct arm_linux_hw_breakpoint p;
1240
1241 if (arm_linux_get_hw_watchpoint_count () == 0)
1242 return -1;
1243
1244 arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1245
1246 arm_linux_insert_hw_breakpoint1 (&p, 1);
1247
1248 return 0;
1249 }
1250
1251 /* Remove a hardware breakpoint. */
1252 static int
1253 arm_linux_remove_watchpoint (struct target_ops *self,
1254 CORE_ADDR addr, int len, int rw,
1255 struct expression *cond)
1256 {
1257 struct lwp_info *lp;
1258 struct arm_linux_hw_breakpoint p;
1259
1260 if (arm_linux_get_hw_watchpoint_count () == 0)
1261 return -1;
1262
1263 arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1264
1265 arm_linux_remove_hw_breakpoint1 (&p, 1);
1266
1267 return 0;
1268 }
1269
1270 /* What was the data address the target was stopped on accessing. */
1271 static int
1272 arm_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
1273 {
1274 siginfo_t siginfo;
1275 int slot;
1276
1277 if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
1278 return 0;
1279
1280 /* This must be a hardware breakpoint. */
1281 if (siginfo.si_signo != SIGTRAP
1282 || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
1283 return 0;
1284
1285 /* We must be able to set hardware watchpoints. */
1286 if (arm_linux_get_hw_watchpoint_count () == 0)
1287 return 0;
1288
1289 slot = siginfo.si_errno;
1290
1291 /* If we are in a positive slot then we're looking at a breakpoint and not
1292 a watchpoint. */
1293 if (slot >= 0)
1294 return 0;
1295
1296 *addr_p = (CORE_ADDR) (uintptr_t) siginfo.si_addr;
1297 return 1;
1298 }
1299
1300 /* Has the target been stopped by hitting a watchpoint? */
1301 static int
1302 arm_linux_stopped_by_watchpoint (struct target_ops *ops)
1303 {
1304 CORE_ADDR addr;
1305 return arm_linux_stopped_data_address (ops, &addr);
1306 }
1307
1308 static int
1309 arm_linux_watchpoint_addr_within_range (struct target_ops *target,
1310 CORE_ADDR addr,
1311 CORE_ADDR start, int length)
1312 {
1313 return start <= addr && start + length - 1 >= addr;
1314 }
1315
1316 /* Handle thread creation. We need to copy the breakpoints and watchpoints
1317 in the parent thread to the child thread. */
1318 static void
1319 arm_linux_new_thread (struct lwp_info *lp)
1320 {
1321 int i;
1322 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
1323
1324 /* Mark that all the hardware breakpoint/watchpoint register pairs
1325 for this thread need to be initialized. */
1326
1327 for (i = 0; i < MAX_BPTS; i++)
1328 {
1329 info->bpts_changed[i] = 1;
1330 info->wpts_changed[i] = 1;
1331 }
1332
1333 lp->arch_private = info;
1334 }
1335
1336 /* Called when resuming a thread.
1337 The hardware debug registers are updated when there is any change. */
1338
1339 static void
1340 arm_linux_prepare_to_resume (struct lwp_info *lwp)
1341 {
1342 int pid, i;
1343 struct arm_linux_hw_breakpoint *bpts, *wpts;
1344 struct arch_lwp_info *arm_lwp_info = lwp->arch_private;
1345
1346 pid = ptid_get_lwp (lwp->ptid);
1347 bpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->bpts;
1348 wpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->wpts;
1349
1350 /* NULL means this is the main thread still going through the shell,
1351 or, no watchpoint has been set yet. In that case, there's
1352 nothing to do. */
1353 if (arm_lwp_info == NULL)
1354 return;
1355
1356 for (i = 0; i < arm_linux_get_hw_breakpoint_count (); i++)
1357 if (arm_lwp_info->bpts_changed[i])
1358 {
1359 errno = 0;
1360 if (arm_hwbp_control_is_enabled (bpts[i].control))
1361 if (ptrace (PTRACE_SETHBPREGS, pid,
1362 (PTRACE_TYPE_ARG3) ((i << 1) + 1), &bpts[i].address) < 0)
1363 perror_with_name (_("Unexpected error setting breakpoint"));
1364
1365 if (bpts[i].control != 0)
1366 if (ptrace (PTRACE_SETHBPREGS, pid,
1367 (PTRACE_TYPE_ARG3) ((i << 1) + 2), &bpts[i].control) < 0)
1368 perror_with_name (_("Unexpected error setting breakpoint"));
1369
1370 arm_lwp_info->bpts_changed[i] = 0;
1371 }
1372
1373 for (i = 0; i < arm_linux_get_hw_watchpoint_count (); i++)
1374 if (arm_lwp_info->wpts_changed[i])
1375 {
1376 errno = 0;
1377 if (arm_hwbp_control_is_enabled (wpts[i].control))
1378 if (ptrace (PTRACE_SETHBPREGS, pid,
1379 (PTRACE_TYPE_ARG3) -((i << 1) + 1), &wpts[i].address) < 0)
1380 perror_with_name (_("Unexpected error setting watchpoint"));
1381
1382 if (wpts[i].control != 0)
1383 if (ptrace (PTRACE_SETHBPREGS, pid,
1384 (PTRACE_TYPE_ARG3) -((i << 1) + 2), &wpts[i].control) < 0)
1385 perror_with_name (_("Unexpected error setting watchpoint"));
1386
1387 arm_lwp_info->wpts_changed[i] = 0;
1388 }
1389 }
1390
1391 /* linux_nat_new_fork hook. */
1392
1393 static void
1394 arm_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
1395 {
1396 pid_t parent_pid;
1397 struct arm_linux_debug_reg_state *parent_state;
1398 struct arm_linux_debug_reg_state *child_state;
1399
1400 /* NULL means no watchpoint has ever been set in the parent. In
1401 that case, there's nothing to do. */
1402 if (parent->arch_private == NULL)
1403 return;
1404
1405 /* GDB core assumes the child inherits the watchpoints/hw
1406 breakpoints of the parent, and will remove them all from the
1407 forked off process. Copy the debug registers mirrors into the
1408 new process so that all breakpoints and watchpoints can be
1409 removed together. */
1410
1411 parent_pid = ptid_get_pid (parent->ptid);
1412 parent_state = arm_linux_get_debug_reg_state (parent_pid);
1413 child_state = arm_linux_get_debug_reg_state (child_pid);
1414 *child_state = *parent_state;
1415 }
1416
1417 void _initialize_arm_linux_nat (void);
1418
1419 void
1420 _initialize_arm_linux_nat (void)
1421 {
1422 struct target_ops *t;
1423
1424 /* Fill in the generic GNU/Linux methods. */
1425 t = linux_target ();
1426
1427 /* Add our register access methods. */
1428 t->to_fetch_registers = arm_linux_fetch_inferior_registers;
1429 t->to_store_registers = arm_linux_store_inferior_registers;
1430
1431 /* Add our hardware breakpoint and watchpoint implementation. */
1432 t->to_can_use_hw_breakpoint = arm_linux_can_use_hw_breakpoint;
1433 t->to_insert_hw_breakpoint = arm_linux_insert_hw_breakpoint;
1434 t->to_remove_hw_breakpoint = arm_linux_remove_hw_breakpoint;
1435 t->to_region_ok_for_hw_watchpoint = arm_linux_region_ok_for_hw_watchpoint;
1436 t->to_insert_watchpoint = arm_linux_insert_watchpoint;
1437 t->to_remove_watchpoint = arm_linux_remove_watchpoint;
1438 t->to_stopped_by_watchpoint = arm_linux_stopped_by_watchpoint;
1439 t->to_stopped_data_address = arm_linux_stopped_data_address;
1440 t->to_watchpoint_addr_within_range = arm_linux_watchpoint_addr_within_range;
1441
1442 t->to_read_description = arm_linux_read_description;
1443
1444 /* Register the target. */
1445 linux_nat_add_target (t);
1446
1447 /* Handle thread creation and exit. */
1448 linux_nat_set_new_thread (t, arm_linux_new_thread);
1449 linux_nat_set_prepare_to_resume (t, arm_linux_prepare_to_resume);
1450
1451 /* Handle process creation and exit. */
1452 linux_nat_set_new_fork (t, arm_linux_new_fork);
1453 linux_nat_set_forget_process (t, arm_linux_forget_process);
1454 }
This page took 0.059281 seconds and 5 git commands to generate.