Remove global variable arm_linux_has_wmmx_registers in arm-linux-nat.c
[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 (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
638 {
639 return ops->beneath->to_read_description (ops->beneath);
640 }
641
642 if (arm_hwcap & HWCAP_IWMMXT)
643 return tdesc_arm_with_iwmmxt;
644
645 if (arm_hwcap & HWCAP_VFP)
646 {
647 int pid;
648 char *buf;
649 const struct target_desc * result = NULL;
650
651 /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
652 Neon with VFPv3-D32. */
653 if (arm_hwcap & HWCAP_NEON)
654 result = tdesc_arm_with_neon;
655 else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
656 result = tdesc_arm_with_vfpv3;
657 else
658 result = tdesc_arm_with_vfpv2;
659
660 /* Now make sure that the kernel supports reading these
661 registers. Support was added in 2.6.30. */
662 pid = ptid_get_lwp (inferior_ptid);
663 errno = 0;
664 buf = alloca (VFP_REGS_SIZE);
665 if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0
666 && errno == EIO)
667 result = NULL;
668
669 return result;
670 }
671
672 return ops->beneath->to_read_description (ops->beneath);
673 }
674
675 /* Information describing the hardware breakpoint capabilities. */
676 struct arm_linux_hwbp_cap
677 {
678 gdb_byte arch;
679 gdb_byte max_wp_length;
680 gdb_byte wp_count;
681 gdb_byte bp_count;
682 };
683
684 /* Since we cannot dynamically allocate subfields of arm_linux_process_info,
685 assume a maximum number of supported break-/watchpoints. */
686 #define MAX_BPTS 16
687 #define MAX_WPTS 16
688
689 /* Get hold of the Hardware Breakpoint information for the target we are
690 attached to. Returns NULL if the kernel doesn't support Hardware
691 breakpoints at all, or a pointer to the information structure. */
692 static const struct arm_linux_hwbp_cap *
693 arm_linux_get_hwbp_cap (void)
694 {
695 /* The info structure we return. */
696 static struct arm_linux_hwbp_cap info;
697
698 /* Is INFO in a good state? -1 means that no attempt has been made to
699 initialize INFO; 0 means an attempt has been made, but it failed; 1
700 means INFO is in an initialized state. */
701 static int available = -1;
702
703 if (available == -1)
704 {
705 int tid;
706 unsigned int val;
707
708 tid = GET_THREAD_ID (inferior_ptid);
709 if (ptrace (PTRACE_GETHBPREGS, tid, 0, &val) < 0)
710 available = 0;
711 else
712 {
713 info.arch = (gdb_byte)((val >> 24) & 0xff);
714 info.max_wp_length = (gdb_byte)((val >> 16) & 0xff);
715 info.wp_count = (gdb_byte)((val >> 8) & 0xff);
716 info.bp_count = (gdb_byte)(val & 0xff);
717
718 if (info.wp_count > MAX_WPTS)
719 {
720 warning (_("arm-linux-gdb supports %d hardware watchpoints but target \
721 supports %d"), MAX_WPTS, info.wp_count);
722 info.wp_count = MAX_WPTS;
723 }
724
725 if (info.bp_count > MAX_BPTS)
726 {
727 warning (_("arm-linux-gdb supports %d hardware breakpoints but target \
728 supports %d"), MAX_BPTS, info.bp_count);
729 info.bp_count = MAX_BPTS;
730 }
731 available = (info.arch != 0);
732 }
733 }
734
735 return available == 1 ? &info : NULL;
736 }
737
738 /* How many hardware breakpoints are available? */
739 static int
740 arm_linux_get_hw_breakpoint_count (void)
741 {
742 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
743 return cap != NULL ? cap->bp_count : 0;
744 }
745
746 /* How many hardware watchpoints are available? */
747 static int
748 arm_linux_get_hw_watchpoint_count (void)
749 {
750 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
751 return cap != NULL ? cap->wp_count : 0;
752 }
753
754 /* Have we got a free break-/watch-point available for use? Returns -1 if
755 there is not an appropriate resource available, otherwise returns 1. */
756 static int
757 arm_linux_can_use_hw_breakpoint (struct target_ops *self,
758 int type, int cnt, int ot)
759 {
760 if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
761 || type == bp_access_watchpoint || type == bp_watchpoint)
762 {
763 int count = arm_linux_get_hw_watchpoint_count ();
764
765 if (count == 0)
766 return 0;
767 else if (cnt + ot > count)
768 return -1;
769 }
770 else if (type == bp_hardware_breakpoint)
771 {
772 int count = arm_linux_get_hw_breakpoint_count ();
773
774 if (count == 0)
775 return 0;
776 else if (cnt > count)
777 return -1;
778 }
779 else
780 gdb_assert (FALSE);
781
782 return 1;
783 }
784
785 /* Enum describing the different types of ARM hardware break-/watch-points. */
786 typedef enum
787 {
788 arm_hwbp_break = 0,
789 arm_hwbp_load = 1,
790 arm_hwbp_store = 2,
791 arm_hwbp_access = 3
792 } arm_hwbp_type;
793
794 /* Type describing an ARM Hardware Breakpoint Control register value. */
795 typedef unsigned int arm_hwbp_control_t;
796
797 /* Structure used to keep track of hardware break-/watch-points. */
798 struct arm_linux_hw_breakpoint
799 {
800 /* Address to break on, or being watched. */
801 unsigned int address;
802 /* Control register for break-/watch- point. */
803 arm_hwbp_control_t control;
804 };
805
806 /* Structure containing arrays of per process hardware break-/watchpoints
807 for caching address and control information.
808
809 The Linux ptrace interface to hardware break-/watch-points presents the
810 values in a vector centred around 0 (which is used fo generic information).
811 Positive indicies refer to breakpoint addresses/control registers, negative
812 indices to watchpoint addresses/control registers.
813
814 The Linux vector is indexed as follows:
815 -((i << 1) + 2): Control register for watchpoint i.
816 -((i << 1) + 1): Address register for watchpoint i.
817 0: Information register.
818 ((i << 1) + 1): Address register for breakpoint i.
819 ((i << 1) + 2): Control register for breakpoint i.
820
821 This structure is used as a per-thread cache of the state stored by the
822 kernel, so that we don't need to keep calling into the kernel to find a
823 free breakpoint.
824
825 We treat break-/watch-points with their enable bit clear as being deleted.
826 */
827 struct arm_linux_debug_reg_state
828 {
829 /* Hardware breakpoints for this process. */
830 struct arm_linux_hw_breakpoint bpts[MAX_BPTS];
831 /* Hardware watchpoints for this process. */
832 struct arm_linux_hw_breakpoint wpts[MAX_WPTS];
833 };
834
835 /* Per-process arch-specific data we want to keep. */
836 struct arm_linux_process_info
837 {
838 /* Linked list. */
839 struct arm_linux_process_info *next;
840 /* The process identifier. */
841 pid_t pid;
842 /* Hardware break-/watchpoints state information. */
843 struct arm_linux_debug_reg_state state;
844
845 };
846
847 /* Per-thread arch-specific data we want to keep. */
848 struct arch_lwp_info
849 {
850 /* Non-zero if our copy differs from what's recorded in the thread. */
851 char bpts_changed[MAX_BPTS];
852 char wpts_changed[MAX_WPTS];
853 };
854
855 static struct arm_linux_process_info *arm_linux_process_list = NULL;
856
857 /* Find process data for process PID. */
858
859 static struct arm_linux_process_info *
860 arm_linux_find_process_pid (pid_t pid)
861 {
862 struct arm_linux_process_info *proc;
863
864 for (proc = arm_linux_process_list; proc; proc = proc->next)
865 if (proc->pid == pid)
866 return proc;
867
868 return NULL;
869 }
870
871 /* Add process data for process PID. Returns newly allocated info
872 object. */
873
874 static struct arm_linux_process_info *
875 arm_linux_add_process (pid_t pid)
876 {
877 struct arm_linux_process_info *proc;
878
879 proc = xcalloc (1, sizeof (*proc));
880 proc->pid = pid;
881
882 proc->next = arm_linux_process_list;
883 arm_linux_process_list = proc;
884
885 return proc;
886 }
887
888 /* Get data specific info for process PID, creating it if necessary.
889 Never returns NULL. */
890
891 static struct arm_linux_process_info *
892 arm_linux_process_info_get (pid_t pid)
893 {
894 struct arm_linux_process_info *proc;
895
896 proc = arm_linux_find_process_pid (pid);
897 if (proc == NULL)
898 proc = arm_linux_add_process (pid);
899
900 return proc;
901 }
902
903 /* Called whenever GDB is no longer debugging process PID. It deletes
904 data structures that keep track of debug register state. */
905
906 static void
907 arm_linux_forget_process (pid_t pid)
908 {
909 struct arm_linux_process_info *proc, **proc_link;
910
911 proc = arm_linux_process_list;
912 proc_link = &arm_linux_process_list;
913
914 while (proc != NULL)
915 {
916 if (proc->pid == pid)
917 {
918 *proc_link = proc->next;
919
920 xfree (proc);
921 return;
922 }
923
924 proc_link = &proc->next;
925 proc = *proc_link;
926 }
927 }
928
929 /* Get hardware break-/watchpoint state for process PID. */
930
931 static struct arm_linux_debug_reg_state *
932 arm_linux_get_debug_reg_state (pid_t pid)
933 {
934 return &arm_linux_process_info_get (pid)->state;
935 }
936
937 /* Initialize an ARM hardware break-/watch-point control register value.
938 BYTE_ADDRESS_SELECT is the mask of bytes to trigger on; HWBP_TYPE is the
939 type of break-/watch-point; ENABLE indicates whether the point is enabled.
940 */
941 static arm_hwbp_control_t
942 arm_hwbp_control_initialize (unsigned byte_address_select,
943 arm_hwbp_type hwbp_type,
944 int enable)
945 {
946 gdb_assert ((byte_address_select & ~0xffU) == 0);
947 gdb_assert (hwbp_type != arm_hwbp_break
948 || ((byte_address_select & 0xfU) != 0));
949
950 return (byte_address_select << 5) | (hwbp_type << 3) | (3 << 1) | enable;
951 }
952
953 /* Does the breakpoint control value CONTROL have the enable bit set? */
954 static int
955 arm_hwbp_control_is_enabled (arm_hwbp_control_t control)
956 {
957 return control & 0x1;
958 }
959
960 /* Change a breakpoint control word so that it is in the disabled state. */
961 static arm_hwbp_control_t
962 arm_hwbp_control_disable (arm_hwbp_control_t control)
963 {
964 return control & ~0x1;
965 }
966
967 /* Initialise the hardware breakpoint structure P. The breakpoint will be
968 enabled, and will point to the placed address of BP_TGT. */
969 static void
970 arm_linux_hw_breakpoint_initialize (struct gdbarch *gdbarch,
971 struct bp_target_info *bp_tgt,
972 struct arm_linux_hw_breakpoint *p)
973 {
974 unsigned mask;
975 CORE_ADDR address = bp_tgt->placed_address = bp_tgt->reqstd_address;
976
977 /* We have to create a mask for the control register which says which bits
978 of the word pointed to by address to break on. */
979 if (arm_pc_is_thumb (gdbarch, address))
980 {
981 mask = 0x3;
982 address &= ~1;
983 }
984 else
985 {
986 mask = 0xf;
987 address &= ~3;
988 }
989
990 p->address = (unsigned int) address;
991 p->control = arm_hwbp_control_initialize (mask, arm_hwbp_break, 1);
992 }
993
994 /* Get the ARM hardware breakpoint type from the RW value we're given when
995 asked to set a watchpoint. */
996 static arm_hwbp_type
997 arm_linux_get_hwbp_type (int rw)
998 {
999 if (rw == hw_read)
1000 return arm_hwbp_load;
1001 else if (rw == hw_write)
1002 return arm_hwbp_store;
1003 else
1004 return arm_hwbp_access;
1005 }
1006
1007 /* Initialize the hardware breakpoint structure P for a watchpoint at ADDR
1008 to LEN. The type of watchpoint is given in RW. */
1009 static void
1010 arm_linux_hw_watchpoint_initialize (CORE_ADDR addr, int len, int rw,
1011 struct arm_linux_hw_breakpoint *p)
1012 {
1013 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1014 unsigned mask;
1015
1016 gdb_assert (cap != NULL);
1017 gdb_assert (cap->max_wp_length != 0);
1018
1019 mask = (1 << len) - 1;
1020
1021 p->address = (unsigned int) addr;
1022 p->control = arm_hwbp_control_initialize (mask,
1023 arm_linux_get_hwbp_type (rw), 1);
1024 }
1025
1026 /* Are two break-/watch-points equal? */
1027 static int
1028 arm_linux_hw_breakpoint_equal (const struct arm_linux_hw_breakpoint *p1,
1029 const struct arm_linux_hw_breakpoint *p2)
1030 {
1031 return p1->address == p2->address && p1->control == p2->control;
1032 }
1033
1034 /* Callback to mark a watch-/breakpoint to be updated in all threads of
1035 the current process. */
1036
1037 struct update_registers_data
1038 {
1039 int watch;
1040 int index;
1041 };
1042
1043 static int
1044 update_registers_callback (struct lwp_info *lwp, void *arg)
1045 {
1046 struct update_registers_data *data = (struct update_registers_data *) arg;
1047
1048 if (lwp->arch_private == NULL)
1049 lwp->arch_private = XCNEW (struct arch_lwp_info);
1050
1051 /* The actual update is done later just before resuming the lwp,
1052 we just mark that the registers need updating. */
1053 if (data->watch)
1054 lwp->arch_private->wpts_changed[data->index] = 1;
1055 else
1056 lwp->arch_private->bpts_changed[data->index] = 1;
1057
1058 /* If the lwp isn't stopped, force it to momentarily pause, so
1059 we can update its breakpoint registers. */
1060 if (!lwp->stopped)
1061 linux_stop_lwp (lwp);
1062
1063 return 0;
1064 }
1065
1066 /* Insert the hardware breakpoint (WATCHPOINT = 0) or watchpoint (WATCHPOINT
1067 =1) BPT for thread TID. */
1068 static void
1069 arm_linux_insert_hw_breakpoint1 (const struct arm_linux_hw_breakpoint* bpt,
1070 int watchpoint)
1071 {
1072 int pid;
1073 ptid_t pid_ptid;
1074 gdb_byte count, i;
1075 struct arm_linux_hw_breakpoint* bpts;
1076 struct update_registers_data data;
1077
1078 pid = ptid_get_pid (inferior_ptid);
1079 pid_ptid = pid_to_ptid (pid);
1080
1081 if (watchpoint)
1082 {
1083 count = arm_linux_get_hw_watchpoint_count ();
1084 bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1085 }
1086 else
1087 {
1088 count = arm_linux_get_hw_breakpoint_count ();
1089 bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1090 }
1091
1092 for (i = 0; i < count; ++i)
1093 if (!arm_hwbp_control_is_enabled (bpts[i].control))
1094 {
1095 data.watch = watchpoint;
1096 data.index = i;
1097 bpts[i] = *bpt;
1098 iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1099 break;
1100 }
1101
1102 gdb_assert (i != count);
1103 }
1104
1105 /* Remove the hardware breakpoint (WATCHPOINT = 0) or watchpoint
1106 (WATCHPOINT = 1) BPT for thread TID. */
1107 static void
1108 arm_linux_remove_hw_breakpoint1 (const struct arm_linux_hw_breakpoint *bpt,
1109 int watchpoint)
1110 {
1111 int pid;
1112 gdb_byte count, i;
1113 ptid_t pid_ptid;
1114 struct arm_linux_hw_breakpoint* bpts;
1115 struct update_registers_data data;
1116
1117 pid = ptid_get_pid (inferior_ptid);
1118 pid_ptid = pid_to_ptid (pid);
1119
1120 if (watchpoint)
1121 {
1122 count = arm_linux_get_hw_watchpoint_count ();
1123 bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1124 }
1125 else
1126 {
1127 count = arm_linux_get_hw_breakpoint_count ();
1128 bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1129 }
1130
1131 for (i = 0; i < count; ++i)
1132 if (arm_linux_hw_breakpoint_equal (bpt, bpts + i))
1133 {
1134 data.watch = watchpoint;
1135 data.index = i;
1136 bpts[i].control = arm_hwbp_control_disable (bpts[i].control);
1137 iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1138 break;
1139 }
1140
1141 gdb_assert (i != count);
1142 }
1143
1144 /* Insert a Hardware breakpoint. */
1145 static int
1146 arm_linux_insert_hw_breakpoint (struct target_ops *self,
1147 struct gdbarch *gdbarch,
1148 struct bp_target_info *bp_tgt)
1149 {
1150 struct lwp_info *lp;
1151 struct arm_linux_hw_breakpoint p;
1152
1153 if (arm_linux_get_hw_breakpoint_count () == 0)
1154 return -1;
1155
1156 arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1157
1158 arm_linux_insert_hw_breakpoint1 (&p, 0);
1159
1160 return 0;
1161 }
1162
1163 /* Remove a hardware breakpoint. */
1164 static int
1165 arm_linux_remove_hw_breakpoint (struct target_ops *self,
1166 struct gdbarch *gdbarch,
1167 struct bp_target_info *bp_tgt)
1168 {
1169 struct lwp_info *lp;
1170 struct arm_linux_hw_breakpoint p;
1171
1172 if (arm_linux_get_hw_breakpoint_count () == 0)
1173 return -1;
1174
1175 arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1176
1177 arm_linux_remove_hw_breakpoint1 (&p, 0);
1178
1179 return 0;
1180 }
1181
1182 /* Are we able to use a hardware watchpoint for the LEN bytes starting at
1183 ADDR? */
1184 static int
1185 arm_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
1186 CORE_ADDR addr, int len)
1187 {
1188 const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1189 CORE_ADDR max_wp_length, aligned_addr;
1190
1191 /* Can not set watchpoints for zero or negative lengths. */
1192 if (len <= 0)
1193 return 0;
1194
1195 /* Need to be able to use the ptrace interface. */
1196 if (cap == NULL || cap->wp_count == 0)
1197 return 0;
1198
1199 /* Test that the range [ADDR, ADDR + LEN) fits into the largest address
1200 range covered by a watchpoint. */
1201 max_wp_length = (CORE_ADDR)cap->max_wp_length;
1202 aligned_addr = addr & ~(max_wp_length - 1);
1203
1204 if (aligned_addr + max_wp_length < addr + len)
1205 return 0;
1206
1207 /* The current ptrace interface can only handle watchpoints that are a
1208 power of 2. */
1209 if ((len & (len - 1)) != 0)
1210 return 0;
1211
1212 /* All tests passed so we must be able to set a watchpoint. */
1213 return 1;
1214 }
1215
1216 /* Insert a Hardware breakpoint. */
1217 static int
1218 arm_linux_insert_watchpoint (struct target_ops *self,
1219 CORE_ADDR addr, int len, int rw,
1220 struct expression *cond)
1221 {
1222 struct lwp_info *lp;
1223 struct arm_linux_hw_breakpoint p;
1224
1225 if (arm_linux_get_hw_watchpoint_count () == 0)
1226 return -1;
1227
1228 arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1229
1230 arm_linux_insert_hw_breakpoint1 (&p, 1);
1231
1232 return 0;
1233 }
1234
1235 /* Remove a hardware breakpoint. */
1236 static int
1237 arm_linux_remove_watchpoint (struct target_ops *self,
1238 CORE_ADDR addr, int len, int rw,
1239 struct expression *cond)
1240 {
1241 struct lwp_info *lp;
1242 struct arm_linux_hw_breakpoint p;
1243
1244 if (arm_linux_get_hw_watchpoint_count () == 0)
1245 return -1;
1246
1247 arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1248
1249 arm_linux_remove_hw_breakpoint1 (&p, 1);
1250
1251 return 0;
1252 }
1253
1254 /* What was the data address the target was stopped on accessing. */
1255 static int
1256 arm_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
1257 {
1258 siginfo_t siginfo;
1259 int slot;
1260
1261 if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
1262 return 0;
1263
1264 /* This must be a hardware breakpoint. */
1265 if (siginfo.si_signo != SIGTRAP
1266 || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
1267 return 0;
1268
1269 /* We must be able to set hardware watchpoints. */
1270 if (arm_linux_get_hw_watchpoint_count () == 0)
1271 return 0;
1272
1273 slot = siginfo.si_errno;
1274
1275 /* If we are in a positive slot then we're looking at a breakpoint and not
1276 a watchpoint. */
1277 if (slot >= 0)
1278 return 0;
1279
1280 *addr_p = (CORE_ADDR) (uintptr_t) siginfo.si_addr;
1281 return 1;
1282 }
1283
1284 /* Has the target been stopped by hitting a watchpoint? */
1285 static int
1286 arm_linux_stopped_by_watchpoint (struct target_ops *ops)
1287 {
1288 CORE_ADDR addr;
1289 return arm_linux_stopped_data_address (ops, &addr);
1290 }
1291
1292 static int
1293 arm_linux_watchpoint_addr_within_range (struct target_ops *target,
1294 CORE_ADDR addr,
1295 CORE_ADDR start, int length)
1296 {
1297 return start <= addr && start + length - 1 >= addr;
1298 }
1299
1300 /* Handle thread creation. We need to copy the breakpoints and watchpoints
1301 in the parent thread to the child thread. */
1302 static void
1303 arm_linux_new_thread (struct lwp_info *lp)
1304 {
1305 int i;
1306 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
1307
1308 /* Mark that all the hardware breakpoint/watchpoint register pairs
1309 for this thread need to be initialized. */
1310
1311 for (i = 0; i < MAX_BPTS; i++)
1312 {
1313 info->bpts_changed[i] = 1;
1314 info->wpts_changed[i] = 1;
1315 }
1316
1317 lp->arch_private = info;
1318 }
1319
1320 /* Called when resuming a thread.
1321 The hardware debug registers are updated when there is any change. */
1322
1323 static void
1324 arm_linux_prepare_to_resume (struct lwp_info *lwp)
1325 {
1326 int pid, i;
1327 struct arm_linux_hw_breakpoint *bpts, *wpts;
1328 struct arch_lwp_info *arm_lwp_info = lwp->arch_private;
1329
1330 pid = ptid_get_lwp (lwp->ptid);
1331 bpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->bpts;
1332 wpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->wpts;
1333
1334 /* NULL means this is the main thread still going through the shell,
1335 or, no watchpoint has been set yet. In that case, there's
1336 nothing to do. */
1337 if (arm_lwp_info == NULL)
1338 return;
1339
1340 for (i = 0; i < arm_linux_get_hw_breakpoint_count (); i++)
1341 if (arm_lwp_info->bpts_changed[i])
1342 {
1343 errno = 0;
1344 if (arm_hwbp_control_is_enabled (bpts[i].control))
1345 if (ptrace (PTRACE_SETHBPREGS, pid,
1346 (PTRACE_TYPE_ARG3) ((i << 1) + 1), &bpts[i].address) < 0)
1347 perror_with_name (_("Unexpected error setting breakpoint"));
1348
1349 if (bpts[i].control != 0)
1350 if (ptrace (PTRACE_SETHBPREGS, pid,
1351 (PTRACE_TYPE_ARG3) ((i << 1) + 2), &bpts[i].control) < 0)
1352 perror_with_name (_("Unexpected error setting breakpoint"));
1353
1354 arm_lwp_info->bpts_changed[i] = 0;
1355 }
1356
1357 for (i = 0; i < arm_linux_get_hw_watchpoint_count (); i++)
1358 if (arm_lwp_info->wpts_changed[i])
1359 {
1360 errno = 0;
1361 if (arm_hwbp_control_is_enabled (wpts[i].control))
1362 if (ptrace (PTRACE_SETHBPREGS, pid,
1363 (PTRACE_TYPE_ARG3) -((i << 1) + 1), &wpts[i].address) < 0)
1364 perror_with_name (_("Unexpected error setting watchpoint"));
1365
1366 if (wpts[i].control != 0)
1367 if (ptrace (PTRACE_SETHBPREGS, pid,
1368 (PTRACE_TYPE_ARG3) -((i << 1) + 2), &wpts[i].control) < 0)
1369 perror_with_name (_("Unexpected error setting watchpoint"));
1370
1371 arm_lwp_info->wpts_changed[i] = 0;
1372 }
1373 }
1374
1375 /* linux_nat_new_fork hook. */
1376
1377 static void
1378 arm_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
1379 {
1380 pid_t parent_pid;
1381 struct arm_linux_debug_reg_state *parent_state;
1382 struct arm_linux_debug_reg_state *child_state;
1383
1384 /* NULL means no watchpoint has ever been set in the parent. In
1385 that case, there's nothing to do. */
1386 if (parent->arch_private == NULL)
1387 return;
1388
1389 /* GDB core assumes the child inherits the watchpoints/hw
1390 breakpoints of the parent, and will remove them all from the
1391 forked off process. Copy the debug registers mirrors into the
1392 new process so that all breakpoints and watchpoints can be
1393 removed together. */
1394
1395 parent_pid = ptid_get_pid (parent->ptid);
1396 parent_state = arm_linux_get_debug_reg_state (parent_pid);
1397 child_state = arm_linux_get_debug_reg_state (child_pid);
1398 *child_state = *parent_state;
1399 }
1400
1401 void _initialize_arm_linux_nat (void);
1402
1403 void
1404 _initialize_arm_linux_nat (void)
1405 {
1406 struct target_ops *t;
1407
1408 /* Fill in the generic GNU/Linux methods. */
1409 t = linux_target ();
1410
1411 /* Add our register access methods. */
1412 t->to_fetch_registers = arm_linux_fetch_inferior_registers;
1413 t->to_store_registers = arm_linux_store_inferior_registers;
1414
1415 /* Add our hardware breakpoint and watchpoint implementation. */
1416 t->to_can_use_hw_breakpoint = arm_linux_can_use_hw_breakpoint;
1417 t->to_insert_hw_breakpoint = arm_linux_insert_hw_breakpoint;
1418 t->to_remove_hw_breakpoint = arm_linux_remove_hw_breakpoint;
1419 t->to_region_ok_for_hw_watchpoint = arm_linux_region_ok_for_hw_watchpoint;
1420 t->to_insert_watchpoint = arm_linux_insert_watchpoint;
1421 t->to_remove_watchpoint = arm_linux_remove_watchpoint;
1422 t->to_stopped_by_watchpoint = arm_linux_stopped_by_watchpoint;
1423 t->to_stopped_data_address = arm_linux_stopped_data_address;
1424 t->to_watchpoint_addr_within_range = arm_linux_watchpoint_addr_within_range;
1425
1426 t->to_read_description = arm_linux_read_description;
1427
1428 /* Register the target. */
1429 linux_nat_add_target (t);
1430
1431 /* Handle thread creation and exit. */
1432 linux_nat_set_new_thread (t, arm_linux_new_thread);
1433 linux_nat_set_prepare_to_resume (t, arm_linux_prepare_to_resume);
1434
1435 /* Handle process creation and exit. */
1436 linux_nat_set_new_fork (t, arm_linux_new_fork);
1437 linux_nat_set_forget_process (t, arm_linux_forget_process);
1438 }
This page took 0.06053 seconds and 5 git commands to generate.