1/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
2   Contributed by ARM Ltd.
3
4   This file is part of GDB.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19#include "gdbsupport/common-defs.h"
20#include "gdbsupport/break-common.h"
21#include "gdbsupport/common-regcache.h"
22#include "nat/linux-nat.h"
23#include "aarch64-linux-hw-point.h"
24
25#include <sys/uio.h>
26#include <asm/ptrace.h>
27#include <sys/ptrace.h>
28#include <elf.h>
29
30/* Number of hardware breakpoints/watchpoints the target supports.
31   They are initialized with values obtained via the ptrace calls
32   with NT_ARM_HW_BREAK and NT_ARM_HW_WATCH respectively.  */
33
34int aarch64_num_bp_regs;
35int aarch64_num_wp_regs;
36
37/* True if this kernel does not have the bug described by PR
38   external/20207 (Linux >= 4.10).  A fixed kernel supports any
39   contiguous range of bits in 8-bit byte DR_CONTROL_MASK.  A buggy
40   kernel supports only 0x01, 0x03, 0x0f and 0xff.  We start by
41   assuming the bug is fixed, and then detect the bug at
42   PTRACE_SETREGSET time.  */
43static bool kernel_supports_any_contiguous_range = true;
44
45/* Return starting byte 0..7 incl. of a watchpoint encoded by CTRL.  */
46
47unsigned int
48aarch64_watchpoint_offset (unsigned int ctrl)
49{
50  uint8_t mask = DR_CONTROL_MASK (ctrl);
51  unsigned retval;
52
53  /* Shift out bottom zeros.  */
54  for (retval = 0; mask && (mask & 1) == 0; ++retval)
55    mask >>= 1;
56
57  return retval;
58}
59
60/* Utility function that returns the length in bytes of a watchpoint
61   according to the content of a hardware debug control register CTRL.
62   Any contiguous range of bytes in CTRL is supported.  The returned
63   value can be between 0..8 (inclusive).  */
64
65unsigned int
66aarch64_watchpoint_length (unsigned int ctrl)
67{
68  uint8_t mask = DR_CONTROL_MASK (ctrl);
69  unsigned retval;
70
71  /* Shift out bottom zeros.  */
72  mask >>= aarch64_watchpoint_offset (ctrl);
73
74  /* Count bottom ones.  */
75  for (retval = 0; (mask & 1) != 0; ++retval)
76    mask >>= 1;
77
78  if (mask != 0)
79    error (_("Unexpected hardware watchpoint length register value 0x%x"),
80	   DR_CONTROL_MASK (ctrl));
81
82  return retval;
83}
84
85/* Given the hardware breakpoint or watchpoint type TYPE and its
86   length LEN, return the expected encoding for a hardware
87   breakpoint/watchpoint control register.  */
88
89static unsigned int
90aarch64_point_encode_ctrl_reg (enum target_hw_bp_type type, int offset, int len)
91{
92  unsigned int ctrl, ttype;
93
94  gdb_assert (offset == 0 || kernel_supports_any_contiguous_range);
95  gdb_assert (offset + len <= AARCH64_HWP_MAX_LEN_PER_REG);
96
97  /* type */
98  switch (type)
99    {
100    case hw_write:
101      ttype = 2;
102      break;
103    case hw_read:
104      ttype = 1;
105      break;
106    case hw_access:
107      ttype = 3;
108      break;
109    case hw_execute:
110      ttype = 0;
111      break;
112    default:
113      perror_with_name (_("Unrecognized breakpoint/watchpoint type"));
114    }
115
116  ctrl = ttype << 3;
117
118  /* offset and length bitmask */
119  ctrl |= ((1 << len) - 1) << (5 + offset);
120  /* enabled at el0 */
121  ctrl |= (2 << 1) | 1;
122
123  return ctrl;
124}
125
126/* Addresses to be written to the hardware breakpoint and watchpoint
127   value registers need to be aligned; the alignment is 4-byte and
128   8-type respectively.  Linux kernel rejects any non-aligned address
129   it receives from the related ptrace call.  Furthermore, the kernel
130   currently only supports the following Byte Address Select (BAS)
131   values: 0x1, 0x3, 0xf and 0xff, which means that for a hardware
132   watchpoint to be accepted by the kernel (via ptrace call), its
133   valid length can only be 1 byte, 2 bytes, 4 bytes or 8 bytes.
134   Despite these limitations, the unaligned watchpoint is supported in
135   this port.
136
137   Return 0 for any non-compliant ADDR and/or LEN; return 1 otherwise.  */
138
139static int
140aarch64_point_is_aligned (int is_watchpoint, CORE_ADDR addr, int len)
141{
142  unsigned int alignment = 0;
143
144  if (is_watchpoint)
145    alignment = AARCH64_HWP_ALIGNMENT;
146  else
147    {
148      struct regcache *regcache
149	= get_thread_regcache_for_ptid (current_lwp_ptid ());
150
151      /* Set alignment to 2 only if the current process is 32-bit,
152	 since thumb instruction can be 2-byte aligned.  Otherwise, set
153	 alignment to AARCH64_HBP_ALIGNMENT.  */
154      if (regcache_register_size (regcache, 0) == 8)
155	alignment = AARCH64_HBP_ALIGNMENT;
156      else
157	alignment = 2;
158    }
159
160  if (addr & (alignment - 1))
161    return 0;
162
163  if ((!kernel_supports_any_contiguous_range
164       && len != 8 && len != 4 && len != 2 && len != 1)
165      || (kernel_supports_any_contiguous_range
166	  && (len < 1 || len > 8)))
167    return 0;
168
169  return 1;
170}
171
172/* Given the (potentially unaligned) watchpoint address in ADDR and
173   length in LEN, return the aligned address, offset from that base
174   address, and aligned length in *ALIGNED_ADDR_P, *ALIGNED_OFFSET_P
175   and *ALIGNED_LEN_P, respectively.  The returned values will be
176   valid values to write to the hardware watchpoint value and control
177   registers.
178
179   The given watchpoint may get truncated if more than one hardware
180   register is needed to cover the watched region.  *NEXT_ADDR_P
181   and *NEXT_LEN_P, if non-NULL, will return the address and length
182   of the remaining part of the watchpoint (which can be processed
183   by calling this routine again to generate another aligned address,
184   offset and length tuple.
185
186   Essentially, unaligned watchpoint is achieved by minimally
187   enlarging the watched area to meet the alignment requirement, and
188   if necessary, splitting the watchpoint over several hardware
189   watchpoint registers.
190
191   On kernels that predate the support for Byte Address Select (BAS)
192   in the hardware watchpoint control register, the offset from the
193   base address is always zero, and so in that case the trade-off is
194   that there will be false-positive hits for the read-type or the
195   access-type hardware watchpoints; for the write type, which is more
196   commonly used, there will be no such issues, as the higher-level
197   breakpoint management in gdb always examines the exact watched
198   region for any content change, and transparently resumes a thread
199   from a watchpoint trap if there is no change to the watched region.
200
201   Another limitation is that because the watched region is enlarged,
202   the watchpoint fault address discovered by
203   aarch64_stopped_data_address may be outside of the original watched
204   region, especially when the triggering instruction is accessing a
205   larger region.  When the fault address is not within any known
206   range, watchpoints_triggered in gdb will get confused, as the
207   higher-level watchpoint management is only aware of original
208   watched regions, and will think that some unknown watchpoint has
209   been triggered.  To prevent such a case,
210   aarch64_stopped_data_address implementations in gdb and gdbserver
211   try to match the trapped address with a watched region, and return
212   an address within the latter. */
213
214static void
215aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
216			  int *aligned_offset_p, int *aligned_len_p,
217			  CORE_ADDR *next_addr_p, int *next_len_p,
218			  CORE_ADDR *next_addr_orig_p)
219{
220  int aligned_len;
221  unsigned int offset, aligned_offset;
222  CORE_ADDR aligned_addr;
223  const unsigned int alignment = AARCH64_HWP_ALIGNMENT;
224  const unsigned int max_wp_len = AARCH64_HWP_MAX_LEN_PER_REG;
225
226  /* As assumed by the algorithm.  */
227  gdb_assert (alignment == max_wp_len);
228
229  if (len <= 0)
230    return;
231
232  /* The address put into the hardware watchpoint value register must
233     be aligned.  */
234  offset = addr & (alignment - 1);
235  aligned_addr = addr - offset;
236  aligned_offset
237    = kernel_supports_any_contiguous_range ? addr & (alignment - 1) : 0;
238
239  gdb_assert (offset >= 0 && offset < alignment);
240  gdb_assert (aligned_addr >= 0 && aligned_addr <= addr);
241  gdb_assert (offset + len > 0);
242
243  if (offset + len >= max_wp_len)
244    {
245      /* Need more than one watchpoint register; truncate at the
246	 alignment boundary.  */
247      aligned_len
248	= max_wp_len - (kernel_supports_any_contiguous_range ? offset : 0);
249      len -= (max_wp_len - offset);
250      addr += (max_wp_len - offset);
251      gdb_assert ((addr & (alignment - 1)) == 0);
252    }
253  else
254    {
255      /* Find the smallest valid length that is large enough to
256	 accommodate this watchpoint.  */
257      static const unsigned char
258	aligned_len_array[AARCH64_HWP_MAX_LEN_PER_REG] =
259	{ 1, 2, 4, 4, 8, 8, 8, 8 };
260
261      aligned_len = (kernel_supports_any_contiguous_range
262		     ? len : aligned_len_array[offset + len - 1]);
263      addr += len;
264      len = 0;
265    }
266
267  if (aligned_addr_p)
268    *aligned_addr_p = aligned_addr;
269  if (aligned_offset_p)
270    *aligned_offset_p = aligned_offset;
271  if (aligned_len_p)
272    *aligned_len_p = aligned_len;
273  if (next_addr_p)
274    *next_addr_p = addr;
275  if (next_len_p)
276    *next_len_p = len;
277  if (next_addr_orig_p)
278    *next_addr_orig_p = align_down (*next_addr_orig_p + alignment, alignment);
279}
280
281/* Helper for aarch64_notify_debug_reg_change.  Records the
282   information about the change of one hardware breakpoint/watchpoint
283   setting for the thread LWP.
284   N.B.  The actual updating of hardware debug registers is not
285   carried out until the moment the thread is resumed.  */
286
287static int
288debug_reg_change_callback (struct lwp_info *lwp, int is_watchpoint,
289			   unsigned int idx)
290{
291  int tid = ptid_of_lwp (lwp).lwp ();
292  struct arch_lwp_info *info = lwp_arch_private_info (lwp);
293  dr_changed_t *dr_changed_ptr;
294  dr_changed_t dr_changed;
295
296  if (info == NULL)
297    {
298      info = XCNEW (struct arch_lwp_info);
299      lwp_set_arch_private_info (lwp, info);
300    }
301
302  if (show_debug_regs)
303    {
304      debug_printf ("debug_reg_change_callback: \n\tOn entry:\n");
305      debug_printf ("\ttid%d, dr_changed_bp=0x%s, "
306		    "dr_changed_wp=0x%s\n", tid,
307		    phex (info->dr_changed_bp, 8),
308		    phex (info->dr_changed_wp, 8));
309    }
310
311  dr_changed_ptr = is_watchpoint ? &info->dr_changed_wp
312    : &info->dr_changed_bp;
313  dr_changed = *dr_changed_ptr;
314
315  gdb_assert (idx >= 0
316	      && (idx <= (is_watchpoint ? aarch64_num_wp_regs
317			  : aarch64_num_bp_regs)));
318
319  /* The actual update is done later just before resuming the lwp,
320     we just mark that one register pair needs updating.  */
321  DR_MARK_N_CHANGED (dr_changed, idx);
322  *dr_changed_ptr = dr_changed;
323
324  /* If the lwp isn't stopped, force it to momentarily pause, so
325     we can update its debug registers.  */
326  if (!lwp_is_stopped (lwp))
327    linux_stop_lwp (lwp);
328
329  if (show_debug_regs)
330    {
331      debug_printf ("\tOn exit:\n\ttid%d, dr_changed_bp=0x%s, "
332		    "dr_changed_wp=0x%s\n", tid,
333		    phex (info->dr_changed_bp, 8),
334		    phex (info->dr_changed_wp, 8));
335    }
336
337  return 0;
338}
339
340/* Notify each thread that their IDXth breakpoint/watchpoint register
341   pair needs to be updated.  The message will be recorded in each
342   thread's arch-specific data area, the actual updating will be done
343   when the thread is resumed.  */
344
345static void
346aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state,
347				 int is_watchpoint, unsigned int idx)
348{
349  ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
350
351  iterate_over_lwps (pid_ptid, [=] (struct lwp_info *info)
352			       {
353				 return debug_reg_change_callback (info,
354								   is_watchpoint,
355								   idx);
356			       });
357}
358
359/* Reconfigure STATE to be compatible with Linux kernels with the PR
360   external/20207 bug.  This is called when
361   KERNEL_SUPPORTS_ANY_CONTIGUOUS_RANGE transitions to false.  Note we
362   don't try to support combining watchpoints with matching (and thus
363   shared) masks, as it's too late when we get here.  On buggy
364   kernels, GDB will try to first setup the perfect matching ranges,
365   which will run out of registers before this function can merge
366   them.  It doesn't look like worth the effort to improve that, given
367   eventually buggy kernels will be phased out.  */
368
369static void
370aarch64_downgrade_regs (struct aarch64_debug_reg_state *state)
371{
372  for (int i = 0; i < aarch64_num_wp_regs; ++i)
373    if ((state->dr_ctrl_wp[i] & 1) != 0)
374      {
375	gdb_assert (state->dr_ref_count_wp[i] != 0);
376	uint8_t mask_orig = (state->dr_ctrl_wp[i] >> 5) & 0xff;
377	gdb_assert (mask_orig != 0);
378	static const uint8_t old_valid[] = { 0x01, 0x03, 0x0f, 0xff };
379	uint8_t mask = 0;
380	for (const uint8_t old_mask : old_valid)
381	  if (mask_orig <= old_mask)
382	    {
383	      mask = old_mask;
384	      break;
385	    }
386	gdb_assert (mask != 0);
387
388	/* No update needed for this watchpoint?  */
389	if (mask == mask_orig)
390	  continue;
391	state->dr_ctrl_wp[i] |= mask << 5;
392	state->dr_addr_wp[i]
393	  = align_down (state->dr_addr_wp[i], AARCH64_HWP_ALIGNMENT);
394
395	/* Try to match duplicate entries.  */
396	for (int j = 0; j < i; ++j)
397	  if ((state->dr_ctrl_wp[j] & 1) != 0
398	      && state->dr_addr_wp[j] == state->dr_addr_wp[i]
399	      && state->dr_addr_orig_wp[j] == state->dr_addr_orig_wp[i]
400	      && state->dr_ctrl_wp[j] == state->dr_ctrl_wp[i])
401	    {
402	      state->dr_ref_count_wp[j] += state->dr_ref_count_wp[i];
403	      state->dr_ref_count_wp[i] = 0;
404	      state->dr_addr_wp[i] = 0;
405	      state->dr_addr_orig_wp[i] = 0;
406	      state->dr_ctrl_wp[i] &= ~1;
407	      break;
408	    }
409
410	aarch64_notify_debug_reg_change (state, 1 /* is_watchpoint */, i);
411      }
412}
413
414/* Record the insertion of one breakpoint/watchpoint, as represented
415   by ADDR and CTRL, in the process' arch-specific data area *STATE.  */
416
417static int
418aarch64_dr_state_insert_one_point (struct aarch64_debug_reg_state *state,
419				   enum target_hw_bp_type type,
420				   CORE_ADDR addr, int offset, int len,
421				   CORE_ADDR addr_orig)
422{
423  int i, idx, num_regs, is_watchpoint;
424  unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
425  CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
426
427  /* Set up state pointers.  */
428  is_watchpoint = (type != hw_execute);
429  gdb_assert (aarch64_point_is_aligned (is_watchpoint, addr, len));
430  if (is_watchpoint)
431    {
432      num_regs = aarch64_num_wp_regs;
433      dr_addr_p = state->dr_addr_wp;
434      dr_addr_orig_p = state->dr_addr_orig_wp;
435      dr_ctrl_p = state->dr_ctrl_wp;
436      dr_ref_count = state->dr_ref_count_wp;
437    }
438  else
439    {
440      num_regs = aarch64_num_bp_regs;
441      dr_addr_p = state->dr_addr_bp;
442      dr_addr_orig_p = nullptr;
443      dr_ctrl_p = state->dr_ctrl_bp;
444      dr_ref_count = state->dr_ref_count_bp;
445    }
446
447  ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
448
449  /* Find an existing or free register in our cache.  */
450  idx = -1;
451  for (i = 0; i < num_regs; ++i)
452    {
453      if ((dr_ctrl_p[i] & 1) == 0)
454	{
455	  gdb_assert (dr_ref_count[i] == 0);
456	  idx = i;
457	  /* no break; continue hunting for an exising one.  */
458	}
459      else if (dr_addr_p[i] == addr
460	       && (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
461	       && dr_ctrl_p[i] == ctrl)
462	{
463	  gdb_assert (dr_ref_count[i] != 0);
464	  idx = i;
465	  break;
466	}
467    }
468
469  /* No space.  */
470  if (idx == -1)
471    return -1;
472
473  /* Update our cache.  */
474  if ((dr_ctrl_p[idx] & 1) == 0)
475    {
476      /* new entry */
477      dr_addr_p[idx] = addr;
478      if (dr_addr_orig_p != nullptr)
479	dr_addr_orig_p[idx] = addr_orig;
480      dr_ctrl_p[idx] = ctrl;
481      dr_ref_count[idx] = 1;
482      /* Notify the change.  */
483      aarch64_notify_debug_reg_change (state, is_watchpoint, idx);
484    }
485  else
486    {
487      /* existing entry */
488      dr_ref_count[idx]++;
489    }
490
491  return 0;
492}
493
494/* Record the removal of one breakpoint/watchpoint, as represented by
495   ADDR and CTRL, in the process' arch-specific data area *STATE.  */
496
497static int
498aarch64_dr_state_remove_one_point (struct aarch64_debug_reg_state *state,
499				   enum target_hw_bp_type type,
500				   CORE_ADDR addr, int offset, int len,
501				   CORE_ADDR addr_orig)
502{
503  int i, num_regs, is_watchpoint;
504  unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
505  CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
506
507  /* Set up state pointers.  */
508  is_watchpoint = (type != hw_execute);
509  if (is_watchpoint)
510    {
511      num_regs = aarch64_num_wp_regs;
512      dr_addr_p = state->dr_addr_wp;
513      dr_addr_orig_p = state->dr_addr_orig_wp;
514      dr_ctrl_p = state->dr_ctrl_wp;
515      dr_ref_count = state->dr_ref_count_wp;
516    }
517  else
518    {
519      num_regs = aarch64_num_bp_regs;
520      dr_addr_p = state->dr_addr_bp;
521      dr_addr_orig_p = nullptr;
522      dr_ctrl_p = state->dr_ctrl_bp;
523      dr_ref_count = state->dr_ref_count_bp;
524    }
525
526  ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
527
528  /* Find the entry that matches the ADDR and CTRL.  */
529  for (i = 0; i < num_regs; ++i)
530    if (dr_addr_p[i] == addr
531	&& (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
532	&& dr_ctrl_p[i] == ctrl)
533      {
534	gdb_assert (dr_ref_count[i] != 0);
535	break;
536      }
537
538  /* Not found.  */
539  if (i == num_regs)
540    return -1;
541
542  /* Clear our cache.  */
543  if (--dr_ref_count[i] == 0)
544    {
545      /* Clear the enable bit.  */
546      ctrl &= ~1;
547      dr_addr_p[i] = 0;
548      if (dr_addr_orig_p != nullptr)
549	dr_addr_orig_p[i] = 0;
550      dr_ctrl_p[i] = ctrl;
551      /* Notify the change.  */
552      aarch64_notify_debug_reg_change (state, is_watchpoint, i);
553    }
554
555  return 0;
556}
557
558int
559aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr,
560			   int len, int is_insert,
561			   struct aarch64_debug_reg_state *state)
562{
563  if (is_insert)
564    {
565      /* The hardware breakpoint on AArch64 should always be 4-byte
566	 aligned, but on AArch32, it can be 2-byte aligned.  Note that
567	 we only check the alignment on inserting breakpoint because
568	 aarch64_point_is_aligned needs the inferior_ptid inferior's
569	 regcache to decide whether the inferior is 32-bit or 64-bit.
570	 However when GDB follows the parent process and detach breakpoints
571	 from child process, inferior_ptid is the child ptid, but the
572	 child inferior doesn't exist in GDB's view yet.  */
573      if (!aarch64_point_is_aligned (0 /* is_watchpoint */ , addr, len))
574	return -1;
575
576      return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, -1);
577    }
578  else
579    return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, -1);
580}
581
582/* This is essentially the same as aarch64_handle_breakpoint, apart
583   from that it is an aligned watchpoint to be handled.  */
584
585static int
586aarch64_handle_aligned_watchpoint (enum target_hw_bp_type type,
587				   CORE_ADDR addr, int len, int is_insert,
588				   struct aarch64_debug_reg_state *state)
589{
590  if (is_insert)
591    return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, addr);
592  else
593    return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, addr);
594}
595
596/* Insert/remove unaligned watchpoint by calling
597   aarch64_align_watchpoint repeatedly until the whole watched region,
598   as represented by ADDR and LEN, has been properly aligned and ready
599   to be written to one or more hardware watchpoint registers.
600   IS_INSERT indicates whether this is an insertion or a deletion.
601   Return 0 if succeed.  */
602
603static int
604aarch64_handle_unaligned_watchpoint (enum target_hw_bp_type type,
605				     CORE_ADDR addr, int len, int is_insert,
606				     struct aarch64_debug_reg_state *state)
607{
608  CORE_ADDR addr_orig = addr;
609
610  while (len > 0)
611    {
612      CORE_ADDR aligned_addr;
613      int aligned_offset, aligned_len, ret;
614      CORE_ADDR addr_orig_next = addr_orig;
615
616      aarch64_align_watchpoint (addr, len, &aligned_addr, &aligned_offset,
617				&aligned_len, &addr, &len, &addr_orig_next);
618
619      if (is_insert)
620	ret = aarch64_dr_state_insert_one_point (state, type, aligned_addr,
621						 aligned_offset,
622						 aligned_len, addr_orig);
623      else
624	ret = aarch64_dr_state_remove_one_point (state, type, aligned_addr,
625						 aligned_offset,
626						 aligned_len, addr_orig);
627
628      if (show_debug_regs)
629	debug_printf ("handle_unaligned_watchpoint: is_insert: %d\n"
630		      "                             "
631		      "aligned_addr: %s, aligned_len: %d\n"
632		      "                                "
633		      "addr_orig: %s\n"
634		      "                                "
635		      "next_addr: %s,    next_len: %d\n"
636		      "                           "
637		      "addr_orig_next: %s\n",
638		      is_insert, core_addr_to_string_nz (aligned_addr),
639		      aligned_len, core_addr_to_string_nz (addr_orig),
640		      core_addr_to_string_nz (addr), len,
641		      core_addr_to_string_nz (addr_orig_next));
642
643      addr_orig = addr_orig_next;
644
645      if (ret != 0)
646	return ret;
647    }
648
649  return 0;
650}
651
652int
653aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
654			   int len, int is_insert,
655			   struct aarch64_debug_reg_state *state)
656{
657  if (aarch64_point_is_aligned (1 /* is_watchpoint */ , addr, len))
658    return aarch64_handle_aligned_watchpoint (type, addr, len, is_insert,
659					      state);
660  else
661    return aarch64_handle_unaligned_watchpoint (type, addr, len, is_insert,
662						state);
663}
664
665/* Call ptrace to set the thread TID's hardware breakpoint/watchpoint
666   registers with data from *STATE.  */
667
668void
669aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
670			      int tid, int watchpoint)
671{
672  int i, count;
673  struct iovec iov;
674  struct user_hwdebug_state regs;
675  const CORE_ADDR *addr;
676  const unsigned int *ctrl;
677
678  memset (&regs, 0, sizeof (regs));
679  iov.iov_base = &regs;
680  count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
681  addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
682  ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
683  if (count == 0)
684    return;
685  iov.iov_len = (offsetof (struct user_hwdebug_state, dbg_regs)
686		 + count * sizeof (regs.dbg_regs[0]));
687
688  for (i = 0; i < count; i++)
689    {
690      regs.dbg_regs[i].addr = addr[i];
691      regs.dbg_regs[i].ctrl = ctrl[i];
692    }
693
694  if (ptrace (PTRACE_SETREGSET, tid,
695	      watchpoint ? NT_ARM_HW_WATCH : NT_ARM_HW_BREAK,
696	      (void *) &iov))
697    {
698      /* Handle Linux kernels with the PR external/20207 bug.  */
699      if (watchpoint && errno == EINVAL
700	  && kernel_supports_any_contiguous_range)
701	{
702	  kernel_supports_any_contiguous_range = false;
703	  aarch64_downgrade_regs (state);
704	  aarch64_linux_set_debug_regs (state, tid, watchpoint);
705	  return;
706	}
707      error (_("Unexpected error setting hardware debug registers"));
708    }
709}
710
711/* See nat/aarch64-linux-hw-point.h.  */
712
713bool
714aarch64_linux_any_set_debug_regs_state (aarch64_debug_reg_state *state,
715					bool watchpoint)
716{
717  int count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
718  if (count == 0)
719    return false;
720
721  const CORE_ADDR *addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
722  const unsigned int *ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
723
724  for (int i = 0; i < count; i++)
725    if (addr[i] != 0 || ctrl[i] != 0)
726      return true;
727
728  return false;
729}
730
731/* Print the values of the cached breakpoint/watchpoint registers.  */
732
733void
734aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
735			      const char *func, CORE_ADDR addr,
736			      int len, enum target_hw_bp_type type)
737{
738  int i;
739
740  debug_printf ("%s", func);
741  if (addr || len)
742    debug_printf (" (addr=0x%08lx, len=%d, type=%s)",
743		  (unsigned long) addr, len,
744		  type == hw_write ? "hw-write-watchpoint"
745		  : (type == hw_read ? "hw-read-watchpoint"
746		     : (type == hw_access ? "hw-access-watchpoint"
747			: (type == hw_execute ? "hw-breakpoint"
748			   : "??unknown??"))));
749  debug_printf (":\n");
750
751  debug_printf ("\tBREAKPOINTs:\n");
752  for (i = 0; i < aarch64_num_bp_regs; i++)
753    debug_printf ("\tBP%d: addr=%s, ctrl=0x%08x, ref.count=%d\n",
754		  i, core_addr_to_string_nz (state->dr_addr_bp[i]),
755		  state->dr_ctrl_bp[i], state->dr_ref_count_bp[i]);
756
757  debug_printf ("\tWATCHPOINTs:\n");
758  for (i = 0; i < aarch64_num_wp_regs; i++)
759    debug_printf ("\tWP%d: addr=%s (orig=%s), ctrl=0x%08x, ref.count=%d\n",
760		  i, core_addr_to_string_nz (state->dr_addr_wp[i]),
761		  core_addr_to_string_nz (state->dr_addr_orig_wp[i]),
762		  state->dr_ctrl_wp[i], state->dr_ref_count_wp[i]);
763}
764
765/* Get the hardware debug register capacity information from the
766   process represented by TID.  */
767
768void
769aarch64_linux_get_debug_reg_capacity (int tid)
770{
771  struct iovec iov;
772  struct user_hwdebug_state dreg_state;
773
774  iov.iov_base = &dreg_state;
775  iov.iov_len = sizeof (dreg_state);
776
777  /* Get hardware watchpoint register info.  */
778  if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_HW_WATCH, &iov) == 0
779      && (AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8
780	  || AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8_1
781	  || AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8_2))
782    {
783      aarch64_num_wp_regs = AARCH64_DEBUG_NUM_SLOTS (dreg_state.dbg_info);
784      if (aarch64_num_wp_regs > AARCH64_HWP_MAX_NUM)
785	{
786	  warning (_("Unexpected number of hardware watchpoint registers"
787		     " reported by ptrace, got %d, expected %d."),
788		   aarch64_num_wp_regs, AARCH64_HWP_MAX_NUM);
789	  aarch64_num_wp_regs = AARCH64_HWP_MAX_NUM;
790	}
791    }
792  else
793    {
794      warning (_("Unable to determine the number of hardware watchpoints"
795		 " available."));
796      aarch64_num_wp_regs = 0;
797    }
798
799  /* Get hardware breakpoint register info.  */
800  if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_HW_BREAK, &iov) == 0
801      && (AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8
802	  || AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8_1
803	  || AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8_2))
804    {
805      aarch64_num_bp_regs = AARCH64_DEBUG_NUM_SLOTS (dreg_state.dbg_info);
806      if (aarch64_num_bp_regs > AARCH64_HBP_MAX_NUM)
807	{
808	  warning (_("Unexpected number of hardware breakpoint registers"
809		     " reported by ptrace, got %d, expected %d."),
810		   aarch64_num_bp_regs, AARCH64_HBP_MAX_NUM);
811	  aarch64_num_bp_regs = AARCH64_HBP_MAX_NUM;
812	}
813    }
814  else
815    {
816      warning (_("Unable to determine the number of hardware breakpoints"
817		 " available."));
818      aarch64_num_bp_regs = 0;
819    }
820}
821
822/* Return true if we can watch a memory region that starts address
823   ADDR and whose length is LEN in bytes.  */
824
825int
826aarch64_linux_region_ok_for_watchpoint (CORE_ADDR addr, int len)
827{
828  CORE_ADDR aligned_addr;
829
830  /* Can not set watchpoints for zero or negative lengths.  */
831  if (len <= 0)
832    return 0;
833
834  /* Must have hardware watchpoint debug register(s).  */
835  if (aarch64_num_wp_regs == 0)
836    return 0;
837
838  /* We support unaligned watchpoint address and arbitrary length,
839     as long as the size of the whole watched area after alignment
840     doesn't exceed size of the total area that all watchpoint debug
841     registers can watch cooperatively.
842
843     This is a very relaxed rule, but unfortunately there are
844     limitations, e.g. false-positive hits, due to limited support of
845     hardware debug registers in the kernel.  See comment above
846     aarch64_align_watchpoint for more information.  */
847
848  aligned_addr = addr & ~(AARCH64_HWP_MAX_LEN_PER_REG - 1);
849  if (aligned_addr + aarch64_num_wp_regs * AARCH64_HWP_MAX_LEN_PER_REG
850      < addr + len)
851    return 0;
852
853  /* All tests passed so we are likely to be able to set the watchpoint.
854     The reason that it is 'likely' rather than 'must' is because
855     we don't check the current usage of the watchpoint registers, and
856     there may not be enough registers available for this watchpoint.
857     Ideally we should check the cached debug register state, however
858     the checking is costly.  */
859  return 1;
860}
861