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