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