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