* aarch64-linux-nat.c: Replace PIDGET with ptid_get_pid.
[deliverable/binutils-gdb.git] / gdb / aarch64-linux-nat.c
1 /* Native-dependent code for GNU/Linux AArch64.
2
3 Copyright (C) 2011-2013 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22
23 #include "inferior.h"
24 #include "gdbcore.h"
25 #include "regcache.h"
26 #include "linux-nat.h"
27 #include "target-descriptions.h"
28 #include "auxv.h"
29 #include "gdbcmd.h"
30 #include "aarch64-tdep.h"
31 #include "aarch64-linux-tdep.h"
32 #include "elf/common.h"
33
34 #include <sys/ptrace.h>
35 #include <sys/utsname.h>
36
37 #include "gregset.h"
38
39 #include "features/aarch64.c"
40
41 /* Defines ps_err_e, struct ps_prochandle. */
42 #include "gdb_proc_service.h"
43
44 #ifndef TRAP_HWBKPT
45 #define TRAP_HWBKPT 0x0004
46 #endif
47
48 /* On GNU/Linux, threads are implemented as pseudo-processes, in which
49 case we may be tracing more than one process at a time. In that
50 case, inferior_ptid will contain the main process ID and the
51 individual thread (process) ID. get_thread_id () is used to get
52 the thread id if it's available, and the process id otherwise. */
53
54 static int
55 get_thread_id (ptid_t ptid)
56 {
57 int tid = ptid_get_lwp (ptid);
58
59 if (0 == tid)
60 tid = ptid_get_pid (ptid);
61 return tid;
62 }
63
64 /* Macro definitions, data structures, and code for the hardware
65 breakpoint and hardware watchpoint support follow. We use the
66 following abbreviations throughout the code:
67
68 hw - hardware
69 bp - breakpoint
70 wp - watchpoint */
71
72 /* Maximum number of hardware breakpoint and watchpoint registers.
73 Neither of these values may exceed the width of dr_changed_t
74 measured in bits. */
75
76 #define AARCH64_HBP_MAX_NUM 16
77 #define AARCH64_HWP_MAX_NUM 16
78
79 /* Alignment requirement in bytes for addresses written to
80 hardware breakpoint and watchpoint value registers.
81
82 A ptrace call attempting to set an address that does not meet the
83 alignment criteria will fail. Limited support has been provided in
84 this port for unaligned watchpoints, such that from a GDB user
85 perspective, an unaligned watchpoint may be requested.
86
87 This is achieved by minimally enlarging the watched area to meet the
88 alignment requirement, and if necessary, splitting the watchpoint
89 over several hardware watchpoint registers. */
90
91 #define AARCH64_HBP_ALIGNMENT 4
92 #define AARCH64_HWP_ALIGNMENT 8
93
94 /* The maximum length of a memory region that can be watched by one
95 hardware watchpoint register. */
96
97 #define AARCH64_HWP_MAX_LEN_PER_REG 8
98
99 /* ptrace hardware breakpoint resource info is formatted as follows:
100
101 31 24 16 8 0
102 +---------------+--------------+---------------+---------------+
103 | RESERVED | RESERVED | DEBUG_ARCH | NUM_SLOTS |
104 +---------------+--------------+---------------+---------------+ */
105
106
107 /* Macros to extract fields from the hardware debug information word. */
108 #define AARCH64_DEBUG_NUM_SLOTS(x) ((x) & 0xff)
109 #define AARCH64_DEBUG_ARCH(x) (((x) >> 8) & 0xff)
110
111 /* Macro for the expected version of the ARMv8-A debug architecture. */
112 #define AARCH64_DEBUG_ARCH_V8 0x6
113
114 /* Number of hardware breakpoints/watchpoints the target supports.
115 They are initialized with values obtained via the ptrace calls
116 with NT_ARM_HW_BREAK and NT_ARM_HW_WATCH respectively. */
117
118 static int aarch64_num_bp_regs;
119 static int aarch64_num_wp_regs;
120
121 /* Debugging of hardware breakpoint/watchpoint support. */
122
123 static int debug_hw_points;
124
125 /* Each bit of a variable of this type is used to indicate whether a
126 hardware breakpoint or watchpoint setting has been changed since
127 the last update.
128
129 Bit N corresponds to the Nth hardware breakpoint or watchpoint
130 setting which is managed in aarch64_debug_reg_state, where N is
131 valid between 0 and the total number of the hardware breakpoint or
132 watchpoint debug registers minus 1.
133
134 When bit N is 1, the corresponding breakpoint or watchpoint setting
135 has changed, and therefore the corresponding hardware debug
136 register needs to be updated via the ptrace interface.
137
138 In the per-thread arch-specific data area, we define two such
139 variables for per-thread hardware breakpoint and watchpoint
140 settings respectively.
141
142 This type is part of the mechanism which helps reduce the number of
143 ptrace calls to the kernel, i.e. avoid asking the kernel to write
144 to the debug registers with unchanged values. */
145
146 typedef unsigned LONGEST dr_changed_t;
147
148 /* Set each of the lower M bits of X to 1; assert X is wide enough. */
149
150 #define DR_MARK_ALL_CHANGED(x, m) \
151 do \
152 { \
153 gdb_assert (sizeof ((x)) * 8 >= (m)); \
154 (x) = (((dr_changed_t)1 << (m)) - 1); \
155 } while (0)
156
157 #define DR_MARK_N_CHANGED(x, n) \
158 do \
159 { \
160 (x) |= ((dr_changed_t)1 << (n)); \
161 } while (0)
162
163 #define DR_CLEAR_CHANGED(x) \
164 do \
165 { \
166 (x) = 0; \
167 } while (0)
168
169 #define DR_HAS_CHANGED(x) ((x) != 0)
170 #define DR_N_HAS_CHANGED(x, n) ((x) & ((dr_changed_t)1 << (n)))
171
172 /* Structure for managing the hardware breakpoint/watchpoint resources.
173 DR_ADDR_* stores the address, DR_CTRL_* stores the control register
174 content, and DR_REF_COUNT_* counts the numbers of references to the
175 corresponding bp/wp, by which way the limited hardware resources
176 are not wasted on duplicated bp/wp settings (though so far gdb has
177 done a good job by not sending duplicated bp/wp requests). */
178
179 struct aarch64_debug_reg_state
180 {
181 /* hardware breakpoint */
182 CORE_ADDR dr_addr_bp[AARCH64_HBP_MAX_NUM];
183 unsigned int dr_ctrl_bp[AARCH64_HBP_MAX_NUM];
184 unsigned int dr_ref_count_bp[AARCH64_HBP_MAX_NUM];
185
186 /* hardware watchpoint */
187 CORE_ADDR dr_addr_wp[AARCH64_HWP_MAX_NUM];
188 unsigned int dr_ctrl_wp[AARCH64_HWP_MAX_NUM];
189 unsigned int dr_ref_count_wp[AARCH64_HWP_MAX_NUM];
190 };
191
192 /* Per-process data. We don't bind this to a per-inferior registry
193 because of targets like x86 GNU/Linux that need to keep track of
194 processes that aren't bound to any inferior (e.g., fork children,
195 checkpoints). */
196
197 struct aarch64_process_info
198 {
199 /* Linked list. */
200 struct aarch64_process_info *next;
201
202 /* The process identifier. */
203 pid_t pid;
204
205 /* Copy of aarch64 hardware debug registers. */
206 struct aarch64_debug_reg_state state;
207 };
208
209 static struct aarch64_process_info *aarch64_process_list = NULL;
210
211 /* Find process data for process PID. */
212
213 static struct aarch64_process_info *
214 aarch64_find_process_pid (pid_t pid)
215 {
216 struct aarch64_process_info *proc;
217
218 for (proc = aarch64_process_list; proc; proc = proc->next)
219 if (proc->pid == pid)
220 return proc;
221
222 return NULL;
223 }
224
225 /* Add process data for process PID. Returns newly allocated info
226 object. */
227
228 static struct aarch64_process_info *
229 aarch64_add_process (pid_t pid)
230 {
231 struct aarch64_process_info *proc;
232
233 proc = xcalloc (1, sizeof (*proc));
234 proc->pid = pid;
235
236 proc->next = aarch64_process_list;
237 aarch64_process_list = proc;
238
239 return proc;
240 }
241
242 /* Get data specific info for process PID, creating it if necessary.
243 Never returns NULL. */
244
245 static struct aarch64_process_info *
246 aarch64_process_info_get (pid_t pid)
247 {
248 struct aarch64_process_info *proc;
249
250 proc = aarch64_find_process_pid (pid);
251 if (proc == NULL)
252 proc = aarch64_add_process (pid);
253
254 return proc;
255 }
256
257 /* Called whenever GDB is no longer debugging process PID. It deletes
258 data structures that keep track of debug register state. */
259
260 static void
261 aarch64_forget_process (pid_t pid)
262 {
263 struct aarch64_process_info *proc, **proc_link;
264
265 proc = aarch64_process_list;
266 proc_link = &aarch64_process_list;
267
268 while (proc != NULL)
269 {
270 if (proc->pid == pid)
271 {
272 *proc_link = proc->next;
273
274 xfree (proc);
275 return;
276 }
277
278 proc_link = &proc->next;
279 proc = *proc_link;
280 }
281 }
282
283 /* Get debug registers state for process PID. */
284
285 static struct aarch64_debug_reg_state *
286 aarch64_get_debug_reg_state (pid_t pid)
287 {
288 return &aarch64_process_info_get (pid)->state;
289 }
290
291 /* Per-thread arch-specific data we want to keep. */
292
293 struct arch_lwp_info
294 {
295 /* When bit N is 1, it indicates the Nth hardware breakpoint or
296 watchpoint register pair needs to be updated when the thread is
297 resumed; see aarch64_linux_prepare_to_resume. */
298 dr_changed_t dr_changed_bp;
299 dr_changed_t dr_changed_wp;
300 };
301
302 /* Call ptrace to set the thread TID's hardware breakpoint/watchpoint
303 registers with data from *STATE. */
304
305 static void
306 aarch64_linux_set_debug_regs (const struct aarch64_debug_reg_state *state,
307 int tid, int watchpoint)
308 {
309 int i, count;
310 struct iovec iov;
311 struct user_hwdebug_state regs;
312 const CORE_ADDR *addr;
313 const unsigned int *ctrl;
314
315 memset (&regs, 0, sizeof (regs));
316 iov.iov_base = &regs;
317 iov.iov_len = sizeof (regs);
318 count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
319 addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
320 ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
321
322 for (i = 0; i < count; i++)
323 {
324 regs.dbg_regs[i].addr = addr[i];
325 regs.dbg_regs[i].ctrl = ctrl[i];
326 }
327
328 if (ptrace (PTRACE_SETREGSET, tid,
329 watchpoint ? NT_ARM_HW_WATCH : NT_ARM_HW_BREAK,
330 (void *) &iov))
331 error (_("Unexpected error setting hardware debug registers"));
332 }
333
334 struct aarch64_dr_update_callback_param
335 {
336 int is_watchpoint;
337 unsigned int idx;
338 };
339
340 /* Callback for iterate_over_lwps. Records the
341 information about the change of one hardware breakpoint/watchpoint
342 setting for the thread LWP.
343 The information is passed in via PTR.
344 N.B. The actual updating of hardware debug registers is not
345 carried out until the moment the thread is resumed. */
346
347 static int
348 debug_reg_change_callback (struct lwp_info *lwp, void *ptr)
349 {
350 struct aarch64_dr_update_callback_param *param_p
351 = (struct aarch64_dr_update_callback_param *) ptr;
352 int pid = get_thread_id (lwp->ptid);
353 int idx = param_p->idx;
354 int is_watchpoint = param_p->is_watchpoint;
355 struct arch_lwp_info *info = lwp->arch_private;
356 dr_changed_t *dr_changed_ptr;
357 dr_changed_t dr_changed;
358
359 if (info == NULL)
360 info = lwp->arch_private = XCNEW (struct arch_lwp_info);
361
362 if (debug_hw_points)
363 {
364 fprintf_unfiltered (gdb_stdlog,
365 "debug_reg_change_callback: \n\tOn entry:\n");
366 fprintf_unfiltered (gdb_stdlog,
367 "\tpid%d, dr_changed_bp=0x%s, "
368 "dr_changed_wp=0x%s\n",
369 pid, phex (info->dr_changed_bp, 8),
370 phex (info->dr_changed_wp, 8));
371 }
372
373 dr_changed_ptr = is_watchpoint ? &info->dr_changed_wp
374 : &info->dr_changed_bp;
375 dr_changed = *dr_changed_ptr;
376
377 gdb_assert (idx >= 0
378 && (idx <= (is_watchpoint ? aarch64_num_wp_regs
379 : aarch64_num_bp_regs)));
380
381 /* The actual update is done later just before resuming the lwp,
382 we just mark that one register pair needs updating. */
383 DR_MARK_N_CHANGED (dr_changed, idx);
384 *dr_changed_ptr = dr_changed;
385
386 /* If the lwp isn't stopped, force it to momentarily pause, so
387 we can update its debug registers. */
388 if (!lwp->stopped)
389 linux_stop_lwp (lwp);
390
391 if (debug_hw_points)
392 {
393 fprintf_unfiltered (gdb_stdlog,
394 "\tOn exit:\n\tpid%d, dr_changed_bp=0x%s, "
395 "dr_changed_wp=0x%s\n",
396 pid, phex (info->dr_changed_bp, 8),
397 phex (info->dr_changed_wp, 8));
398 }
399
400 /* Continue the iteration. */
401 return 0;
402 }
403
404 /* Notify each thread that their IDXth breakpoint/watchpoint register
405 pair needs to be updated. The message will be recorded in each
406 thread's arch-specific data area, the actual updating will be done
407 when the thread is resumed. */
408
409 static void
410 aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state,
411 int is_watchpoint, unsigned int idx)
412 {
413 struct aarch64_dr_update_callback_param param;
414 ptid_t pid_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
415
416 param.is_watchpoint = is_watchpoint;
417 param.idx = idx;
418
419 iterate_over_lwps (pid_ptid, debug_reg_change_callback, (void *) &param);
420 }
421
422 /* Print the values of the cached breakpoint/watchpoint registers. */
423
424 static void
425 aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
426 const char *func, CORE_ADDR addr,
427 int len, int type)
428 {
429 int i;
430
431 fprintf_unfiltered (gdb_stdlog, "%s", func);
432 if (addr || len)
433 fprintf_unfiltered (gdb_stdlog, " (addr=0x%08lx, len=%d, type=%s)",
434 (unsigned long) addr, len,
435 type == hw_write ? "hw-write-watchpoint"
436 : (type == hw_read ? "hw-read-watchpoint"
437 : (type == hw_access ? "hw-access-watchpoint"
438 : (type == hw_execute ? "hw-breakpoint"
439 : "??unknown??"))));
440 fprintf_unfiltered (gdb_stdlog, ":\n");
441
442 fprintf_unfiltered (gdb_stdlog, "\tBREAKPOINTs:\n");
443 for (i = 0; i < aarch64_num_bp_regs; i++)
444 fprintf_unfiltered (gdb_stdlog,
445 "\tBP%d: addr=0x%08lx, ctrl=0x%08x, ref.count=%d\n",
446 i, state->dr_addr_bp[i],
447 state->dr_ctrl_bp[i], state->dr_ref_count_bp[i]);
448
449 fprintf_unfiltered (gdb_stdlog, "\tWATCHPOINTs:\n");
450 for (i = 0; i < aarch64_num_wp_regs; i++)
451 fprintf_unfiltered (gdb_stdlog,
452 "\tWP%d: addr=0x%08lx, ctrl=0x%08x, ref.count=%d\n",
453 i, state->dr_addr_wp[i],
454 state->dr_ctrl_wp[i], state->dr_ref_count_wp[i]);
455 }
456
457 /* Fill GDB's register array with the general-purpose register values
458 from the current thread. */
459
460 static void
461 fetch_gregs_from_thread (struct regcache *regcache)
462 {
463 int ret, regno, tid;
464 elf_gregset_t regs;
465 struct iovec iovec;
466
467 tid = get_thread_id (inferior_ptid);
468
469 iovec.iov_base = &regs;
470 iovec.iov_len = sizeof (regs);
471
472 ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec);
473 if (ret < 0)
474 perror_with_name (_("Unable to fetch general registers."));
475
476 for (regno = AARCH64_X0_REGNUM; regno <= AARCH64_CPSR_REGNUM; regno++)
477 regcache_raw_supply (regcache, regno,
478 (char *) &regs[regno - AARCH64_X0_REGNUM]);
479 }
480
481 /* Store to the current thread the valid general-purpose register
482 values in the GDB's register array. */
483
484 static void
485 store_gregs_to_thread (const struct regcache *regcache)
486 {
487 int ret, regno, tid;
488 elf_gregset_t regs;
489 struct iovec iovec;
490
491 tid = get_thread_id (inferior_ptid);
492
493 iovec.iov_base = &regs;
494 iovec.iov_len = sizeof (regs);
495
496 ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec);
497 if (ret < 0)
498 perror_with_name (_("Unable to fetch general registers."));
499
500 for (regno = AARCH64_X0_REGNUM; regno <= AARCH64_CPSR_REGNUM; regno++)
501 if (REG_VALID == regcache_register_status (regcache, regno))
502 regcache_raw_collect (regcache, regno,
503 (char *) &regs[regno - AARCH64_X0_REGNUM]);
504
505 ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iovec);
506 if (ret < 0)
507 perror_with_name (_("Unable to store general registers."));
508 }
509
510 /* Fill GDB's register array with the fp/simd register values
511 from the current thread. */
512
513 static void
514 fetch_fpregs_from_thread (struct regcache *regcache)
515 {
516 int ret, regno, tid;
517 elf_fpregset_t regs;
518 struct iovec iovec;
519
520 tid = get_thread_id (inferior_ptid);
521
522 iovec.iov_base = &regs;
523 iovec.iov_len = sizeof (regs);
524
525 ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec);
526 if (ret < 0)
527 perror_with_name (_("Unable to fetch FP/SIMD registers."));
528
529 for (regno = AARCH64_V0_REGNUM; regno <= AARCH64_V31_REGNUM; regno++)
530 regcache_raw_supply (regcache, regno,
531 (char *) &regs.vregs[regno - AARCH64_V0_REGNUM]);
532
533 regcache_raw_supply (regcache, AARCH64_FPSR_REGNUM, (char *) &regs.fpsr);
534 regcache_raw_supply (regcache, AARCH64_FPCR_REGNUM, (char *) &regs.fpcr);
535 }
536
537 /* Store to the current thread the valid fp/simd register
538 values in the GDB's register array. */
539
540 static void
541 store_fpregs_to_thread (const struct regcache *regcache)
542 {
543 int ret, regno, tid;
544 elf_fpregset_t regs;
545 struct iovec iovec;
546
547 tid = get_thread_id (inferior_ptid);
548
549 iovec.iov_base = &regs;
550 iovec.iov_len = sizeof (regs);
551
552 ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec);
553 if (ret < 0)
554 perror_with_name (_("Unable to fetch FP/SIMD registers."));
555
556 for (regno = AARCH64_V0_REGNUM; regno <= AARCH64_V31_REGNUM; regno++)
557 if (REG_VALID == regcache_register_status (regcache, regno))
558 regcache_raw_collect (regcache, regno,
559 (char *) &regs.vregs[regno - AARCH64_V0_REGNUM]);
560
561 if (REG_VALID == regcache_register_status (regcache, AARCH64_FPSR_REGNUM))
562 regcache_raw_collect (regcache, AARCH64_FPSR_REGNUM, (char *) &regs.fpsr);
563 if (REG_VALID == regcache_register_status (regcache, AARCH64_FPCR_REGNUM))
564 regcache_raw_collect (regcache, AARCH64_FPCR_REGNUM, (char *) &regs.fpcr);
565
566 ret = ptrace (PTRACE_SETREGSET, tid, NT_FPREGSET, &iovec);
567 if (ret < 0)
568 perror_with_name (_("Unable to store FP/SIMD registers."));
569 }
570
571 /* Implement the "to_fetch_register" target_ops method. */
572
573 static void
574 aarch64_linux_fetch_inferior_registers (struct target_ops *ops,
575 struct regcache *regcache,
576 int regno)
577 {
578 if (regno == -1)
579 {
580 fetch_gregs_from_thread (regcache);
581 fetch_fpregs_from_thread (regcache);
582 }
583 else if (regno < AARCH64_V0_REGNUM)
584 fetch_gregs_from_thread (regcache);
585 else
586 fetch_fpregs_from_thread (regcache);
587 }
588
589 /* Implement the "to_store_register" target_ops method. */
590
591 static void
592 aarch64_linux_store_inferior_registers (struct target_ops *ops,
593 struct regcache *regcache,
594 int regno)
595 {
596 if (regno == -1)
597 {
598 store_gregs_to_thread (regcache);
599 store_fpregs_to_thread (regcache);
600 }
601 else if (regno < AARCH64_V0_REGNUM)
602 store_gregs_to_thread (regcache);
603 else
604 store_fpregs_to_thread (regcache);
605 }
606
607 /* Fill register REGNO (if it is a general-purpose register) in
608 *GREGSETPS with the value in GDB's register array. If REGNO is -1,
609 do this for all registers. */
610
611 void
612 fill_gregset (const struct regcache *regcache,
613 gdb_gregset_t *gregsetp, int regno)
614 {
615 gdb_byte *gregs_buf = (gdb_byte *) gregsetp;
616 int i;
617
618 for (i = AARCH64_X0_REGNUM; i <= AARCH64_CPSR_REGNUM; i++)
619 if (regno == -1 || regno == i)
620 regcache_raw_collect (regcache, i,
621 gregs_buf + X_REGISTER_SIZE
622 * (i - AARCH64_X0_REGNUM));
623 }
624
625 /* Fill GDB's register array with the general-purpose register values
626 in *GREGSETP. */
627
628 void
629 supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
630 {
631 aarch64_linux_supply_gregset (regcache, (const gdb_byte *) gregsetp);
632 }
633
634 /* Fill register REGNO (if it is a floating-point register) in
635 *FPREGSETP with the value in GDB's register array. If REGNO is -1,
636 do this for all registers. */
637
638 void
639 fill_fpregset (const struct regcache *regcache,
640 gdb_fpregset_t *fpregsetp, int regno)
641 {
642 gdb_byte *fpregs_buf = (gdb_byte *) fpregsetp;
643 int i;
644
645 for (i = AARCH64_V0_REGNUM; i <= AARCH64_V31_REGNUM; i++)
646 if (regno == -1 || regno == i)
647 regcache_raw_collect (regcache, i,
648 fpregs_buf + V_REGISTER_SIZE
649 * (i - AARCH64_V0_REGNUM));
650
651 if (regno == -1 || regno == AARCH64_FPSR_REGNUM)
652 regcache_raw_collect (regcache, AARCH64_FPSR_REGNUM,
653 fpregs_buf + V_REGISTER_SIZE * 32);
654
655 if (regno == -1 || regno == AARCH64_FPCR_REGNUM)
656 regcache_raw_collect (regcache, AARCH64_FPCR_REGNUM,
657 fpregs_buf + V_REGISTER_SIZE * 32 + 4);
658 }
659
660 /* Fill GDB's register array with the floating-point register values
661 in *FPREGSETP. */
662
663 void
664 supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
665 {
666 aarch64_linux_supply_fpregset (regcache, (const gdb_byte *) fpregsetp);
667 }
668
669 /* Called when resuming a thread.
670 The hardware debug registers are updated when there is any change. */
671
672 static void
673 aarch64_linux_prepare_to_resume (struct lwp_info *lwp)
674 {
675 struct arch_lwp_info *info = lwp->arch_private;
676
677 /* NULL means this is the main thread still going through the shell,
678 or, no watchpoint has been set yet. In that case, there's
679 nothing to do. */
680 if (info == NULL)
681 return;
682
683 if (DR_HAS_CHANGED (info->dr_changed_bp)
684 || DR_HAS_CHANGED (info->dr_changed_wp))
685 {
686 int tid = ptid_get_lwp (lwp->ptid);
687 struct aarch64_debug_reg_state *state
688 = aarch64_get_debug_reg_state (ptid_get_pid (lwp->ptid));
689
690 if (debug_hw_points)
691 fprintf_unfiltered (gdb_stdlog, "prepare_to_resume thread %d\n", tid);
692
693 /* Watchpoints. */
694 if (DR_HAS_CHANGED (info->dr_changed_wp))
695 {
696 aarch64_linux_set_debug_regs (state, tid, 1);
697 DR_CLEAR_CHANGED (info->dr_changed_wp);
698 }
699
700 /* Breakpoints. */
701 if (DR_HAS_CHANGED (info->dr_changed_bp))
702 {
703 aarch64_linux_set_debug_regs (state, tid, 0);
704 DR_CLEAR_CHANGED (info->dr_changed_bp);
705 }
706 }
707 }
708
709 static void
710 aarch64_linux_new_thread (struct lwp_info *lp)
711 {
712 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
713
714 /* Mark that all the hardware breakpoint/watchpoint register pairs
715 for this thread need to be initialized. */
716 DR_MARK_ALL_CHANGED (info->dr_changed_bp, aarch64_num_bp_regs);
717 DR_MARK_ALL_CHANGED (info->dr_changed_wp, aarch64_num_wp_regs);
718
719 lp->arch_private = info;
720 }
721
722 /* linux_nat_new_fork hook. */
723
724 static void
725 aarch64_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
726 {
727 pid_t parent_pid;
728 struct aarch64_debug_reg_state *parent_state;
729 struct aarch64_debug_reg_state *child_state;
730
731 /* NULL means no watchpoint has ever been set in the parent. In
732 that case, there's nothing to do. */
733 if (parent->arch_private == NULL)
734 return;
735
736 /* GDB core assumes the child inherits the watchpoints/hw
737 breakpoints of the parent, and will remove them all from the
738 forked off process. Copy the debug registers mirrors into the
739 new process so that all breakpoints and watchpoints can be
740 removed together. */
741
742 parent_pid = ptid_get_pid (parent->ptid);
743 parent_state = aarch64_get_debug_reg_state (parent_pid);
744 child_state = aarch64_get_debug_reg_state (child_pid);
745 *child_state = *parent_state;
746 }
747 \f
748
749 /* Called by libthread_db. Returns a pointer to the thread local
750 storage (or its descriptor). */
751
752 ps_err_e
753 ps_get_thread_area (const struct ps_prochandle *ph,
754 lwpid_t lwpid, int idx, void **base)
755 {
756 struct iovec iovec;
757 uint64_t reg;
758
759 iovec.iov_base = &reg;
760 iovec.iov_len = sizeof (reg);
761
762 if (ptrace (PTRACE_GETREGSET, lwpid, NT_ARM_TLS, &iovec) != 0)
763 return PS_ERR;
764
765 /* IDX is the bias from the thread pointer to the beginning of the
766 thread descriptor. It has to be subtracted due to implementation
767 quirks in libthread_db. */
768 *base = (void *) (reg - idx);
769
770 return PS_OK;
771 }
772 \f
773
774 /* Get the hardware debug register capacity information. */
775
776 static void
777 aarch64_linux_get_debug_reg_capacity (void)
778 {
779 int tid;
780 struct iovec iov;
781 struct user_hwdebug_state dreg_state;
782
783 tid = get_thread_id (inferior_ptid);
784 iov.iov_base = &dreg_state;
785 iov.iov_len = sizeof (dreg_state);
786
787 /* Get hardware watchpoint register info. */
788 if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_HW_WATCH, &iov) == 0
789 && AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8)
790 {
791 aarch64_num_wp_regs = AARCH64_DEBUG_NUM_SLOTS (dreg_state.dbg_info);
792 if (aarch64_num_wp_regs > AARCH64_HWP_MAX_NUM)
793 {
794 warning (_("Unexpected number of hardware watchpoint registers"
795 " reported by ptrace, got %d, expected %d."),
796 aarch64_num_wp_regs, AARCH64_HWP_MAX_NUM);
797 aarch64_num_wp_regs = AARCH64_HWP_MAX_NUM;
798 }
799 }
800 else
801 {
802 warning (_("Unable to determine the number of hardware watchpoints"
803 " available."));
804 aarch64_num_wp_regs = 0;
805 }
806
807 /* Get hardware breakpoint register info. */
808 if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_HW_BREAK, &iov) == 0
809 && AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8)
810 {
811 aarch64_num_bp_regs = AARCH64_DEBUG_NUM_SLOTS (dreg_state.dbg_info);
812 if (aarch64_num_bp_regs > AARCH64_HBP_MAX_NUM)
813 {
814 warning (_("Unexpected number of hardware breakpoint registers"
815 " reported by ptrace, got %d, expected %d."),
816 aarch64_num_bp_regs, AARCH64_HBP_MAX_NUM);
817 aarch64_num_bp_regs = AARCH64_HBP_MAX_NUM;
818 }
819 }
820 else
821 {
822 warning (_("Unable to determine the number of hardware breakpoints"
823 " available."));
824 aarch64_num_bp_regs = 0;
825 }
826 }
827
828 static void (*super_post_startup_inferior) (ptid_t ptid);
829
830 /* Implement the "to_post_startup_inferior" target_ops method. */
831
832 static void
833 aarch64_linux_child_post_startup_inferior (ptid_t ptid)
834 {
835 aarch64_forget_process (ptid_get_pid (ptid));
836 aarch64_linux_get_debug_reg_capacity ();
837 super_post_startup_inferior (ptid);
838 }
839
840 /* Implement the "to_read_description" target_ops method. */
841
842 static const struct target_desc *
843 aarch64_linux_read_description (struct target_ops *ops)
844 {
845 initialize_tdesc_aarch64 ();
846 return tdesc_aarch64;
847 }
848
849 /* Given the (potentially unaligned) watchpoint address in ADDR and
850 length in LEN, return the aligned address and aligned length in
851 *ALIGNED_ADDR_P and *ALIGNED_LEN_P, respectively. The returned
852 aligned address and length will be valid values to write to the
853 hardware watchpoint value and control registers.
854
855 The given watchpoint may get truncated if more than one hardware
856 register is needed to cover the watched region. *NEXT_ADDR_P
857 and *NEXT_LEN_P, if non-NULL, will return the address and length
858 of the remaining part of the watchpoint (which can be processed
859 by calling this routine again to generate another aligned address
860 and length pair.
861
862 See the comment above the function of the same name in
863 gdbserver/linux-aarch64-low.c for more information. */
864
865 static void
866 aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
867 int *aligned_len_p, CORE_ADDR *next_addr_p,
868 int *next_len_p)
869 {
870 int aligned_len;
871 unsigned int offset;
872 CORE_ADDR aligned_addr;
873 const unsigned int alignment = AARCH64_HWP_ALIGNMENT;
874 const unsigned int max_wp_len = AARCH64_HWP_MAX_LEN_PER_REG;
875
876 /* As assumed by the algorithm. */
877 gdb_assert (alignment == max_wp_len);
878
879 if (len <= 0)
880 return;
881
882 /* Address to be put into the hardware watchpoint value register
883 must be aligned. */
884 offset = addr & (alignment - 1);
885 aligned_addr = addr - offset;
886
887 gdb_assert (offset >= 0 && offset < alignment);
888 gdb_assert (aligned_addr >= 0 && aligned_addr <= addr);
889 gdb_assert (offset + len > 0);
890
891 if (offset + len >= max_wp_len)
892 {
893 /* Need more than one watchpoint registers; truncate it at the
894 alignment boundary. */
895 aligned_len = max_wp_len;
896 len -= (max_wp_len - offset);
897 addr += (max_wp_len - offset);
898 gdb_assert ((addr & (alignment - 1)) == 0);
899 }
900 else
901 {
902 /* Find the smallest valid length that is large enough to
903 accommodate this watchpoint. */
904 static const unsigned char
905 aligned_len_array[AARCH64_HWP_MAX_LEN_PER_REG] =
906 { 1, 2, 4, 4, 8, 8, 8, 8 };
907
908 aligned_len = aligned_len_array[offset + len - 1];
909 addr += len;
910 len = 0;
911 }
912
913 if (aligned_addr_p)
914 *aligned_addr_p = aligned_addr;
915 if (aligned_len_p)
916 *aligned_len_p = aligned_len;
917 if (next_addr_p)
918 *next_addr_p = addr;
919 if (next_len_p)
920 *next_len_p = len;
921 }
922
923 /* Returns the number of hardware watchpoints of type TYPE that we can
924 set. Value is positive if we can set CNT watchpoints, zero if
925 setting watchpoints of type TYPE is not supported, and negative if
926 CNT is more than the maximum number of watchpoints of type TYPE
927 that we can support. TYPE is one of bp_hardware_watchpoint,
928 bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
929 CNT is the number of such watchpoints used so far (including this
930 one). OTHERTYPE is non-zero if other types of watchpoints are
931 currently enabled.
932
933 We always return 1 here because we don't have enough information
934 about possible overlap of addresses that they want to watch. As an
935 extreme example, consider the case where all the watchpoints watch
936 the same address and the same region length: then we can handle a
937 virtually unlimited number of watchpoints, due to debug register
938 sharing implemented via reference counts. */
939
940 static int
941 aarch64_linux_can_use_hw_breakpoint (int type, int cnt, int othertype)
942 {
943 return 1;
944 }
945
946 /* ptrace expects control registers to be formatted as follows:
947
948 31 13 5 3 1 0
949 +--------------------------------+----------+------+------+----+
950 | RESERVED (SBZ) | LENGTH | TYPE | PRIV | EN |
951 +--------------------------------+----------+------+------+----+
952
953 The TYPE field is ignored for breakpoints. */
954
955 #define DR_CONTROL_ENABLED(ctrl) (((ctrl) & 0x1) == 1)
956 #define DR_CONTROL_LENGTH(ctrl) (((ctrl) >> 5) & 0xff)
957
958 /* Utility function that returns the length in bytes of a watchpoint
959 according to the content of a hardware debug control register CTRL.
960 Note that the kernel currently only supports the following Byte
961 Address Select (BAS) values: 0x1, 0x3, 0xf and 0xff, which means
962 that for a hardware watchpoint, its valid length can only be 1
963 byte, 2 bytes, 4 bytes or 8 bytes. */
964
965 static inline unsigned int
966 aarch64_watchpoint_length (unsigned int ctrl)
967 {
968 switch (DR_CONTROL_LENGTH (ctrl))
969 {
970 case 0x01:
971 return 1;
972 case 0x03:
973 return 2;
974 case 0x0f:
975 return 4;
976 case 0xff:
977 return 8;
978 default:
979 return 0;
980 }
981 }
982
983 /* Given the hardware breakpoint or watchpoint type TYPE and its
984 length LEN, return the expected encoding for a hardware
985 breakpoint/watchpoint control register. */
986
987 static unsigned int
988 aarch64_point_encode_ctrl_reg (int type, int len)
989 {
990 unsigned int ctrl, ttype;
991
992 /* type */
993 switch (type)
994 {
995 case hw_write:
996 ttype = 2;
997 break;
998 case hw_read:
999 ttype = 1;
1000 break;
1001 case hw_access:
1002 ttype = 3;
1003 break;
1004 case hw_execute:
1005 ttype = 0;
1006 break;
1007 default:
1008 perror_with_name (_("Unrecognized breakpoint/watchpoint type"));
1009 }
1010 ctrl = ttype << 3;
1011
1012 /* length bitmask */
1013 ctrl |= ((1 << len) - 1) << 5;
1014 /* enabled at el0 */
1015 ctrl |= (2 << 1) | 1;
1016
1017 return ctrl;
1018 }
1019
1020 /* Addresses to be written to the hardware breakpoint and watchpoint
1021 value registers need to be aligned; the alignment is 4-byte and
1022 8-type respectively. Linux kernel rejects any non-aligned address
1023 it receives from the related ptrace call. Furthermore, the kernel
1024 currently only supports the following Byte Address Select (BAS)
1025 values: 0x1, 0x3, 0xf and 0xff, which means that for a hardware
1026 watchpoint to be accepted by the kernel (via ptrace call), its
1027 valid length can only be 1 byte, 2 bytes, 4 bytes or 8 bytes.
1028 Despite these limitations, the unaligned watchpoint is supported in
1029 this port.
1030
1031 Return 0 for any non-compliant ADDR and/or LEN; return 1 otherwise. */
1032
1033 static int
1034 aarch64_point_is_aligned (int is_watchpoint, CORE_ADDR addr, int len)
1035 {
1036 unsigned int alignment = is_watchpoint ? AARCH64_HWP_ALIGNMENT
1037 : AARCH64_HBP_ALIGNMENT;
1038
1039 if (addr & (alignment - 1))
1040 return 0;
1041
1042 if (len != 8 && len != 4 && len != 2 && len != 1)
1043 return 0;
1044
1045 return 1;
1046 }
1047
1048 /* Record the insertion of one breakpoint/watchpoint, as represented
1049 by ADDR and CTRL, in the cached debug register state area *STATE. */
1050
1051 static int
1052 aarch64_dr_state_insert_one_point (struct aarch64_debug_reg_state *state,
1053 int type, CORE_ADDR addr, int len)
1054 {
1055 int i, idx, num_regs, is_watchpoint;
1056 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
1057 CORE_ADDR *dr_addr_p;
1058
1059 /* Set up state pointers. */
1060 is_watchpoint = (type != hw_execute);
1061 gdb_assert (aarch64_point_is_aligned (is_watchpoint, addr, len));
1062 if (is_watchpoint)
1063 {
1064 num_regs = aarch64_num_wp_regs;
1065 dr_addr_p = state->dr_addr_wp;
1066 dr_ctrl_p = state->dr_ctrl_wp;
1067 dr_ref_count = state->dr_ref_count_wp;
1068 }
1069 else
1070 {
1071 num_regs = aarch64_num_bp_regs;
1072 dr_addr_p = state->dr_addr_bp;
1073 dr_ctrl_p = state->dr_ctrl_bp;
1074 dr_ref_count = state->dr_ref_count_bp;
1075 }
1076
1077 ctrl = aarch64_point_encode_ctrl_reg (type, len);
1078
1079 /* Find an existing or free register in our cache. */
1080 idx = -1;
1081 for (i = 0; i < num_regs; ++i)
1082 {
1083 if ((dr_ctrl_p[i] & 1) == 0)
1084 {
1085 gdb_assert (dr_ref_count[i] == 0);
1086 idx = i;
1087 /* no break; continue hunting for an existing one. */
1088 }
1089 else if (dr_addr_p[i] == addr && dr_ctrl_p[i] == ctrl)
1090 {
1091 gdb_assert (dr_ref_count[i] != 0);
1092 idx = i;
1093 break;
1094 }
1095 }
1096
1097 /* No space. */
1098 if (idx == -1)
1099 return -1;
1100
1101 /* Update our cache. */
1102 if ((dr_ctrl_p[idx] & 1) == 0)
1103 {
1104 /* new entry */
1105 dr_addr_p[idx] = addr;
1106 dr_ctrl_p[idx] = ctrl;
1107 dr_ref_count[idx] = 1;
1108 /* Notify the change. */
1109 aarch64_notify_debug_reg_change (state, is_watchpoint, idx);
1110 }
1111 else
1112 {
1113 /* existing entry */
1114 dr_ref_count[idx]++;
1115 }
1116
1117 return 0;
1118 }
1119
1120 /* Record the removal of one breakpoint/watchpoint, as represented by
1121 ADDR and CTRL, in the cached debug register state area *STATE. */
1122
1123 static int
1124 aarch64_dr_state_remove_one_point (struct aarch64_debug_reg_state *state,
1125 int type, CORE_ADDR addr, int len)
1126 {
1127 int i, num_regs, is_watchpoint;
1128 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
1129 CORE_ADDR *dr_addr_p;
1130
1131 /* Set up state pointers. */
1132 is_watchpoint = (type != hw_execute);
1133 gdb_assert (aarch64_point_is_aligned (is_watchpoint, addr, len));
1134 if (is_watchpoint)
1135 {
1136 num_regs = aarch64_num_wp_regs;
1137 dr_addr_p = state->dr_addr_wp;
1138 dr_ctrl_p = state->dr_ctrl_wp;
1139 dr_ref_count = state->dr_ref_count_wp;
1140 }
1141 else
1142 {
1143 num_regs = aarch64_num_bp_regs;
1144 dr_addr_p = state->dr_addr_bp;
1145 dr_ctrl_p = state->dr_ctrl_bp;
1146 dr_ref_count = state->dr_ref_count_bp;
1147 }
1148
1149 ctrl = aarch64_point_encode_ctrl_reg (type, len);
1150
1151 /* Find the entry that matches the ADDR and CTRL. */
1152 for (i = 0; i < num_regs; ++i)
1153 if (dr_addr_p[i] == addr && dr_ctrl_p[i] == ctrl)
1154 {
1155 gdb_assert (dr_ref_count[i] != 0);
1156 break;
1157 }
1158
1159 /* Not found. */
1160 if (i == num_regs)
1161 return -1;
1162
1163 /* Clear our cache. */
1164 if (--dr_ref_count[i] == 0)
1165 {
1166 /* Clear the enable bit. */
1167 ctrl &= ~1;
1168 dr_addr_p[i] = 0;
1169 dr_ctrl_p[i] = ctrl;
1170 /* Notify the change. */
1171 aarch64_notify_debug_reg_change (state, is_watchpoint, i);
1172 }
1173
1174 return 0;
1175 }
1176
1177 /* Implement insertion and removal of a single breakpoint. */
1178
1179 static int
1180 aarch64_handle_breakpoint (int type, CORE_ADDR addr, int len, int is_insert)
1181 {
1182 struct aarch64_debug_reg_state *state;
1183
1184 /* The hardware breakpoint on AArch64 should always be 4-byte
1185 aligned. */
1186 if (!aarch64_point_is_aligned (0 /* is_watchpoint */ , addr, len))
1187 return -1;
1188
1189 state = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1190
1191 if (is_insert)
1192 return aarch64_dr_state_insert_one_point (state, type, addr, len);
1193 else
1194 return aarch64_dr_state_remove_one_point (state, type, addr, len);
1195 }
1196
1197 /* Insert a hardware-assisted breakpoint at BP_TGT->placed_address.
1198 Return 0 on success, -1 on failure. */
1199
1200 static int
1201 aarch64_linux_insert_hw_breakpoint (struct gdbarch *gdbarch,
1202 struct bp_target_info *bp_tgt)
1203 {
1204 int ret;
1205 CORE_ADDR addr = bp_tgt->placed_address;
1206 const int len = 4;
1207 const int type = hw_execute;
1208
1209 if (debug_hw_points)
1210 fprintf_unfiltered
1211 (gdb_stdlog,
1212 "insert_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
1213 (unsigned long) addr, len);
1214
1215 ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */);
1216
1217 if (debug_hw_points > 1)
1218 {
1219 struct aarch64_debug_reg_state *state
1220 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1221
1222 aarch64_show_debug_reg_state (state,
1223 "insert_hw_watchpoint", addr, len, type);
1224 }
1225
1226 return ret;
1227 }
1228
1229 /* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
1230 Return 0 on success, -1 on failure. */
1231
1232 static int
1233 aarch64_linux_remove_hw_breakpoint (struct gdbarch *gdbarch,
1234 struct bp_target_info *bp_tgt)
1235 {
1236 int ret;
1237 CORE_ADDR addr = bp_tgt->placed_address;
1238 const int len = 4;
1239 const int type = hw_execute;
1240
1241 if (debug_hw_points)
1242 fprintf_unfiltered
1243 (gdb_stdlog, "remove_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
1244 (unsigned long) addr, len);
1245
1246 ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */);
1247
1248 if (debug_hw_points > 1)
1249 {
1250 struct aarch64_debug_reg_state *state
1251 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1252
1253 aarch64_show_debug_reg_state (state,
1254 "remove_hw_watchpoint", addr, len, type);
1255 }
1256
1257 return ret;
1258 }
1259
1260 /* This is essentially the same as aarch64_handle_breakpoint, apart
1261 from that it is an aligned watchpoint to be handled. */
1262
1263 static int
1264 aarch64_handle_aligned_watchpoint (int type, CORE_ADDR addr, int len,
1265 int is_insert)
1266 {
1267 struct aarch64_debug_reg_state *state
1268 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1269
1270 if (is_insert)
1271 return aarch64_dr_state_insert_one_point (state, type, addr, len);
1272 else
1273 return aarch64_dr_state_remove_one_point (state, type, addr, len);
1274 }
1275
1276 /* Insert/remove unaligned watchpoint by calling
1277 aarch64_align_watchpoint repeatedly until the whole watched region,
1278 as represented by ADDR and LEN, has been properly aligned and ready
1279 to be written to one or more hardware watchpoint registers.
1280 IS_INSERT indicates whether this is an insertion or a deletion.
1281 Return 0 if succeed. */
1282
1283 static int
1284 aarch64_handle_unaligned_watchpoint (int type, CORE_ADDR addr, int len,
1285 int is_insert)
1286 {
1287 struct aarch64_debug_reg_state *state
1288 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1289
1290 while (len > 0)
1291 {
1292 CORE_ADDR aligned_addr;
1293 int aligned_len, ret;
1294
1295 aarch64_align_watchpoint (addr, len, &aligned_addr, &aligned_len,
1296 &addr, &len);
1297
1298 if (is_insert)
1299 ret = aarch64_dr_state_insert_one_point (state, type, aligned_addr,
1300 aligned_len);
1301 else
1302 ret = aarch64_dr_state_remove_one_point (state, type, aligned_addr,
1303 aligned_len);
1304
1305 if (debug_hw_points)
1306 fprintf_unfiltered (gdb_stdlog,
1307 "handle_unaligned_watchpoint: is_insert: %d\n"
1308 " aligned_addr: 0x%08lx, aligned_len: %d\n"
1309 " next_addr: 0x%08lx, next_len: %d\n",
1310 is_insert, aligned_addr, aligned_len, addr, len);
1311
1312 if (ret != 0)
1313 return ret;
1314 }
1315
1316 return 0;
1317 }
1318
1319 /* Implements insertion and removal of a single watchpoint. */
1320
1321 static int
1322 aarch64_handle_watchpoint (int type, CORE_ADDR addr, int len, int is_insert)
1323 {
1324 if (aarch64_point_is_aligned (1 /* is_watchpoint */ , addr, len))
1325 return aarch64_handle_aligned_watchpoint (type, addr, len, is_insert);
1326 else
1327 return aarch64_handle_unaligned_watchpoint (type, addr, len, is_insert);
1328 }
1329
1330 /* Implement the "to_insert_watchpoint" target_ops method.
1331
1332 Insert a watchpoint to watch a memory region which starts at
1333 address ADDR and whose length is LEN bytes. Watch memory accesses
1334 of the type TYPE. Return 0 on success, -1 on failure. */
1335
1336 static int
1337 aarch64_linux_insert_watchpoint (CORE_ADDR addr, int len, int type,
1338 struct expression *cond)
1339 {
1340 int ret;
1341
1342 if (debug_hw_points)
1343 fprintf_unfiltered (gdb_stdlog,
1344 "insert_watchpoint on entry (addr=0x%08lx, len=%d)\n",
1345 (unsigned long) addr, len);
1346
1347 gdb_assert (type != hw_execute);
1348
1349 ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */);
1350
1351 if (debug_hw_points > 1)
1352 {
1353 struct aarch64_debug_reg_state *state
1354 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1355
1356 aarch64_show_debug_reg_state (state,
1357 "insert_watchpoint", addr, len, type);
1358 }
1359
1360 return ret;
1361 }
1362
1363 /* Implement the "to_remove_watchpoint" target_ops method.
1364 Remove a watchpoint that watched the memory region which starts at
1365 address ADDR, whose length is LEN bytes, and for accesses of the
1366 type TYPE. Return 0 on success, -1 on failure. */
1367
1368 static int
1369 aarch64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type,
1370 struct expression *cond)
1371 {
1372 int ret;
1373
1374 if (debug_hw_points)
1375 fprintf_unfiltered (gdb_stdlog,
1376 "remove_watchpoint on entry (addr=0x%08lx, len=%d)\n",
1377 (unsigned long) addr, len);
1378
1379 gdb_assert (type != hw_execute);
1380
1381 ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */);
1382
1383 if (debug_hw_points > 1)
1384 {
1385 struct aarch64_debug_reg_state *state
1386 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1387
1388 aarch64_show_debug_reg_state (state,
1389 "remove_watchpoint", addr, len, type);
1390 }
1391
1392 return ret;
1393 }
1394
1395 /* Implement the "to_region_ok_for_hw_watchpoint" target_ops method. */
1396
1397 static int
1398 aarch64_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
1399 {
1400 CORE_ADDR aligned_addr;
1401
1402 /* Can not set watchpoints for zero or negative lengths. */
1403 if (len <= 0)
1404 return 0;
1405
1406 /* Must have hardware watchpoint debug register(s). */
1407 if (aarch64_num_wp_regs == 0)
1408 return 0;
1409
1410 /* We support unaligned watchpoint address and arbitrary length,
1411 as long as the size of the whole watched area after alignment
1412 doesn't exceed size of the total area that all watchpoint debug
1413 registers can watch cooperatively.
1414
1415 This is a very relaxed rule, but unfortunately there are
1416 limitations, e.g. false-positive hits, due to limited support of
1417 hardware debug registers in the kernel. See comment above
1418 aarch64_align_watchpoint for more information. */
1419
1420 aligned_addr = addr & ~(AARCH64_HWP_MAX_LEN_PER_REG - 1);
1421 if (aligned_addr + aarch64_num_wp_regs * AARCH64_HWP_MAX_LEN_PER_REG
1422 < addr + len)
1423 return 0;
1424
1425 /* All tests passed so we are likely to be able to set the watchpoint.
1426 The reason that it is 'likely' rather than 'must' is because
1427 we don't check the current usage of the watchpoint registers, and
1428 there may not be enough registers available for this watchpoint.
1429 Ideally we should check the cached debug register state, however
1430 the checking is costly. */
1431 return 1;
1432 }
1433
1434 /* Implement the "to_stopped_data_address" target_ops method. */
1435
1436 static int
1437 aarch64_linux_stopped_data_address (struct target_ops *target,
1438 CORE_ADDR *addr_p)
1439 {
1440 siginfo_t siginfo;
1441 int i, tid;
1442 struct aarch64_debug_reg_state *state;
1443
1444 if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
1445 return 0;
1446
1447 /* This must be a hardware breakpoint. */
1448 if (siginfo.si_signo != SIGTRAP
1449 || (siginfo.si_code & 0xffff) != TRAP_HWBKPT)
1450 return 0;
1451
1452 /* Check if the address matches any watched address. */
1453 state = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
1454 for (i = aarch64_num_wp_regs - 1; i >= 0; --i)
1455 {
1456 const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]);
1457 const CORE_ADDR addr_trap = (CORE_ADDR) siginfo.si_addr;
1458 const CORE_ADDR addr_watch = state->dr_addr_wp[i];
1459
1460 if (state->dr_ref_count_wp[i]
1461 && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i])
1462 && addr_trap >= addr_watch
1463 && addr_trap < addr_watch + len)
1464 {
1465 *addr_p = addr_trap;
1466 return 1;
1467 }
1468 }
1469
1470 return 0;
1471 }
1472
1473 /* Implement the "to_stopped_by_watchpoint" target_ops method. */
1474
1475 static int
1476 aarch64_linux_stopped_by_watchpoint (void)
1477 {
1478 CORE_ADDR addr;
1479
1480 return aarch64_linux_stopped_data_address (&current_target, &addr);
1481 }
1482
1483 /* Implement the "to_watchpoint_addr_within_range" target_ops method. */
1484
1485 static int
1486 aarch64_linux_watchpoint_addr_within_range (struct target_ops *target,
1487 CORE_ADDR addr,
1488 CORE_ADDR start, int length)
1489 {
1490 return start <= addr && start + length - 1 >= addr;
1491 }
1492
1493 /* Define AArch64 maintenance commands. */
1494
1495 static void
1496 add_show_debug_regs_command (void)
1497 {
1498 /* A maintenance command to enable printing the internal DRi mirror
1499 variables. */
1500 add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
1501 &debug_hw_points, _("\
1502 Set whether to show variables that mirror the AArch64 debug registers."), _("\
1503 Show whether to show variables that mirror the AArch64 debug registers."), _("\
1504 Use \"on\" to enable, \"off\" to disable.\n\
1505 If enabled, the debug registers values are shown when GDB inserts\n\
1506 or removes a hardware breakpoint or watchpoint, and when the inferior\n\
1507 triggers a breakpoint or watchpoint."),
1508 NULL,
1509 NULL,
1510 &maintenance_set_cmdlist,
1511 &maintenance_show_cmdlist);
1512 }
1513
1514 /* -Wmissing-prototypes. */
1515 void _initialize_aarch64_linux_nat (void);
1516
1517 void
1518 _initialize_aarch64_linux_nat (void)
1519 {
1520 struct target_ops *t;
1521
1522 /* Fill in the generic GNU/Linux methods. */
1523 t = linux_target ();
1524
1525 add_show_debug_regs_command ();
1526
1527 /* Add our register access methods. */
1528 t->to_fetch_registers = aarch64_linux_fetch_inferior_registers;
1529 t->to_store_registers = aarch64_linux_store_inferior_registers;
1530
1531 t->to_read_description = aarch64_linux_read_description;
1532
1533 t->to_can_use_hw_breakpoint = aarch64_linux_can_use_hw_breakpoint;
1534 t->to_insert_hw_breakpoint = aarch64_linux_insert_hw_breakpoint;
1535 t->to_remove_hw_breakpoint = aarch64_linux_remove_hw_breakpoint;
1536 t->to_region_ok_for_hw_watchpoint =
1537 aarch64_linux_region_ok_for_hw_watchpoint;
1538 t->to_insert_watchpoint = aarch64_linux_insert_watchpoint;
1539 t->to_remove_watchpoint = aarch64_linux_remove_watchpoint;
1540 t->to_stopped_by_watchpoint = aarch64_linux_stopped_by_watchpoint;
1541 t->to_stopped_data_address = aarch64_linux_stopped_data_address;
1542 t->to_watchpoint_addr_within_range =
1543 aarch64_linux_watchpoint_addr_within_range;
1544
1545 /* Override the GNU/Linux inferior startup hook. */
1546 super_post_startup_inferior = t->to_post_startup_inferior;
1547 t->to_post_startup_inferior = aarch64_linux_child_post_startup_inferior;
1548
1549 /* Register the target. */
1550 linux_nat_add_target (t);
1551 linux_nat_set_new_thread (t, aarch64_linux_new_thread);
1552 linux_nat_set_new_fork (t, aarch64_linux_new_fork);
1553 linux_nat_set_forget_process (t, aarch64_forget_process);
1554 linux_nat_set_prepare_to_resume (t, aarch64_linux_prepare_to_resume);
1555 }
This page took 0.063738 seconds and 4 git commands to generate.