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