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