Silence ARI warning about floatformat_to_double
[deliverable/binutils-gdb.git] / gdb / nat / aarch64-linux-hw-point.c
CommitLineData
42a4f53d 1/* Copyright (C) 2009-2019 Free Software Foundation, Inc.
554717a3
YQ
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
268a13a5
TT
19#include "gdbsupport/common-defs.h"
20#include "gdbsupport/break-common.h"
21#include "gdbsupport/common-regcache.h"
5e35436e 22#include "nat/linux-nat.h"
554717a3
YQ
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
a3b60e45
JK
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
554717a3
YQ
60/* Utility function that returns the length in bytes of a watchpoint
61 according to the content of a hardware debug control register CTRL.
a3b60e45
JK
62 Any contiguous range of bytes in CTRL is supported. The returned
63 value can be between 0..8 (inclusive). */
554717a3
YQ
64
65unsigned int
66aarch64_watchpoint_length (unsigned int ctrl)
67{
a3b60e45
JK
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;
554717a3
YQ
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
a3b60e45 90aarch64_point_encode_ctrl_reg (enum target_hw_bp_type type, int offset, int len)
554717a3
YQ
91{
92 unsigned int ctrl, ttype;
93
a3b60e45
JK
94 gdb_assert (offset == 0 || kernel_supports_any_contiguous_range);
95 gdb_assert (offset + len <= AARCH64_HWP_MAX_LEN_PER_REG);
96
554717a3
YQ
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
a3b60e45
JK
118 /* offset and length bitmask */
119 ctrl |= ((1 << len) - 1) << (5 + offset);
554717a3
YQ
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{
8d689ee5
YQ
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 }
554717a3
YQ
159
160 if (addr & (alignment - 1))
161 return 0;
162
a3b60e45
JK
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)))
554717a3
YQ
167 return 0;
168
169 return 1;
170}
171
172/* Given the (potentially unaligned) watchpoint address in ADDR and
a3b60e45
JK
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.
554717a3
YQ
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
a3b60e45
JK
183 by calling this routine again to generate another aligned address,
184 offset and length tuple.
554717a3
YQ
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
a3b60e45
JK
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.
554717a3
YQ
200
201 Another limitation is that because the watched region is enlarged,
a3b60e45 202 the watchpoint fault address discovered by
554717a3
YQ
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
a3b60e45
JK
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. */
554717a3
YQ
213
214static void
215aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
a3b60e45
JK
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)
554717a3
YQ
219{
220 int aligned_len;
a3b60e45 221 unsigned int offset, aligned_offset;
554717a3
YQ
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
a3b60e45
JK
232 /* The address put into the hardware watchpoint value register must
233 be aligned. */
554717a3
YQ
234 offset = addr & (alignment - 1);
235 aligned_addr = addr - offset;
a3b60e45
JK
236 aligned_offset
237 = kernel_supports_any_contiguous_range ? addr & (alignment - 1) : 0;
554717a3
YQ
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 {
a3b60e45 245 /* Need more than one watchpoint register; truncate at the
554717a3 246 alignment boundary. */
a3b60e45
JK
247 aligned_len
248 = max_wp_len - (kernel_supports_any_contiguous_range ? offset : 0);
554717a3
YQ
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
a3b60e45
JK
261 aligned_len = (kernel_supports_any_contiguous_range
262 ? len : aligned_len_array[offset + len - 1]);
554717a3
YQ
263 addr += len;
264 len = 0;
265 }
266
267 if (aligned_addr_p)
268 *aligned_addr_p = aligned_addr;
a3b60e45
JK
269 if (aligned_offset_p)
270 *aligned_offset_p = aligned_offset;
554717a3
YQ
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;
a3b60e45
JK
277 if (next_addr_orig_p)
278 *next_addr_orig_p = align_down (*next_addr_orig_p + alignment, alignment);
554717a3
YQ
279}
280
d3a70e03 281/* Helper for aarch64_notify_debug_reg_change. Records the
5e35436e
YQ
282 information about the change of one hardware breakpoint/watchpoint
283 setting for the thread LWP.
5e35436e
YQ
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
d3a70e03
TT
288debug_reg_change_callback (struct lwp_info *lwp, int is_watchpoint,
289 unsigned int idx)
5e35436e 290{
e38504b3 291 int tid = ptid_of_lwp (lwp).lwp ();
5e35436e
YQ
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");
dfe7f77c
YQ
305 debug_printf ("\ttid%d, dr_changed_bp=0x%s, "
306 "dr_changed_wp=0x%s\n", tid,
5e35436e
YQ
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 {
dfe7f77c
YQ
331 debug_printf ("\tOn exit:\n\ttid%d, dr_changed_bp=0x%s, "
332 "dr_changed_wp=0x%s\n", tid,
5e35436e
YQ
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{
e99b03dc 349 ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
5e35436e 350
d3a70e03
TT
351 iterate_over_lwps (pid_ptid, [=] (struct lwp_info *info)
352 {
353 return debug_reg_change_callback (info,
354 is_watchpoint,
355 idx);
356 });
5e35436e
YQ
357}
358
a3b60e45
JK
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
554717a3
YQ
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,
a3b60e45
JK
420 CORE_ADDR addr, int offset, int len,
421 CORE_ADDR addr_orig)
554717a3
YQ
422{
423 int i, idx, num_regs, is_watchpoint;
424 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
a3b60e45 425 CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
554717a3
YQ
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;
a3b60e45 434 dr_addr_orig_p = state->dr_addr_orig_wp;
554717a3
YQ
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;
a3b60e45 442 dr_addr_orig_p = nullptr;
554717a3
YQ
443 dr_ctrl_p = state->dr_ctrl_bp;
444 dr_ref_count = state->dr_ref_count_bp;
445 }
446
a3b60e45 447 ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
554717a3
YQ
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 }
a3b60e45
JK
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)
554717a3
YQ
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;
a3b60e45
JK
478 if (dr_addr_orig_p != nullptr)
479 dr_addr_orig_p[idx] = addr_orig;
554717a3
YQ
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,
a3b60e45
JK
500 CORE_ADDR addr, int offset, int len,
501 CORE_ADDR addr_orig)
554717a3
YQ
502{
503 int i, num_regs, is_watchpoint;
504 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
a3b60e45 505 CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
554717a3
YQ
506
507 /* Set up state pointers. */
508 is_watchpoint = (type != hw_execute);
554717a3
YQ
509 if (is_watchpoint)
510 {
511 num_regs = aarch64_num_wp_regs;
512 dr_addr_p = state->dr_addr_wp;
a3b60e45 513 dr_addr_orig_p = state->dr_addr_orig_wp;
554717a3
YQ
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;
a3b60e45 521 dr_addr_orig_p = nullptr;
554717a3
YQ
522 dr_ctrl_p = state->dr_ctrl_bp;
523 dr_ref_count = state->dr_ref_count_bp;
524 }
525
a3b60e45 526 ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
554717a3
YQ
527
528 /* Find the entry that matches the ADDR and CTRL. */
529 for (i = 0; i < num_regs; ++i)
a3b60e45
JK
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)
554717a3
YQ
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;
a3b60e45
JK
548 if (dr_addr_orig_p != nullptr)
549 dr_addr_orig_p[i] = 0;
554717a3
YQ
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{
554717a3 563 if (is_insert)
805035d7
YQ
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
a3b60e45 576 return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, -1);
805035d7 577 }
554717a3 578 else
a3b60e45 579 return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, -1);
554717a3
YQ
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)
a3b60e45 591 return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, addr);
554717a3 592 else
a3b60e45 593 return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, addr);
554717a3
YQ
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{
a3b60e45
JK
608 CORE_ADDR addr_orig = addr;
609
554717a3
YQ
610 while (len > 0)
611 {
612 CORE_ADDR aligned_addr;
a3b60e45
JK
613 int aligned_offset, aligned_len, ret;
614 CORE_ADDR addr_orig_next = addr_orig;
554717a3 615
a3b60e45
JK
616 aarch64_align_watchpoint (addr, len, &aligned_addr, &aligned_offset,
617 &aligned_len, &addr, &len, &addr_orig_next);
554717a3
YQ
618
619 if (is_insert)
620 ret = aarch64_dr_state_insert_one_point (state, type, aligned_addr,
a3b60e45
JK
621 aligned_offset,
622 aligned_len, addr_orig);
554717a3
YQ
623 else
624 ret = aarch64_dr_state_remove_one_point (state, type, aligned_addr,
a3b60e45
JK
625 aligned_offset,
626 aligned_len, addr_orig);
554717a3
YQ
627
628 if (show_debug_regs)
3675a06a
YQ
629 debug_printf ("handle_unaligned_watchpoint: is_insert: %d\n"
630 " "
631 "aligned_addr: %s, aligned_len: %d\n"
632 " "
a3b60e45
JK
633 "addr_orig: %s\n"
634 " "
635 "next_addr: %s, next_len: %d\n"
636 " "
637 "addr_orig_next: %s\n",
3675a06a 638 is_insert, core_addr_to_string_nz (aligned_addr),
a3b60e45
JK
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;
554717a3
YQ
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
a3b60e45 669aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
554717a3
YQ
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;
bb82e934
SM
685 iov.iov_len = (offsetof (struct user_hwdebug_state, dbg_regs)
686 + count * sizeof (regs.dbg_regs[0]));
554717a3
YQ
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))
a3b60e45
JK
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 }
554717a3
YQ
709}
710
754e3168
AH
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
554717a3
YQ
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++)
a3b60e45 759 debug_printf ("\tWP%d: addr=%s (orig=%s), ctrl=0x%08x, ref.count=%d\n",
554717a3 760 i, core_addr_to_string_nz (state->dr_addr_wp[i]),
a3b60e45 761 core_addr_to_string_nz (state->dr_addr_orig_wp[i]),
554717a3
YQ
762 state->dr_ctrl_wp[i], state->dr_ref_count_wp[i]);
763}
af1b22f3
YQ
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
49ecef2a
AP
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))
af1b22f3
YQ
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
49ecef2a
AP
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))
af1b22f3
YQ
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}
39edd165
YQ
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}
This page took 0.504648 seconds and 4 git commands to generate.