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