Update Copyright year range in all files maintained by GDB.
[external/binutils.git] / gdb / s390-linux-nat.c
1 /* S390 native-dependent code for GDB, the GNU debugger.
2    Copyright (C) 2001-2014 Free Software Foundation, Inc.
3
4    Contributed by D.J. Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
5    for IBM Deutschland Entwicklung GmbH, IBM Corporation.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 #include "defs.h"
23 #include "regcache.h"
24 #include "inferior.h"
25 #include "target.h"
26 #include "linux-nat.h"
27 #include "auxv.h"
28 #include "gregset.h"
29
30 #include "s390-linux-tdep.h"
31 #include "elf/common.h"
32
33 #include <asm/ptrace.h>
34 #include <sys/ptrace.h>
35 #include <asm/types.h>
36 #include <sys/procfs.h>
37 #include <sys/ucontext.h>
38 #include <elf.h>
39
40 #ifndef PTRACE_GETREGSET
41 #define PTRACE_GETREGSET 0x4204
42 #endif
43
44 #ifndef PTRACE_SETREGSET
45 #define PTRACE_SETREGSET 0x4205
46 #endif
47
48 static int have_regset_last_break = 0;
49 static int have_regset_system_call = 0;
50 static int have_regset_tdb = 0;
51
52 /* Map registers to gregset/ptrace offsets.
53    These arrays are defined in s390-tdep.c.  */
54
55 #ifdef __s390x__
56 #define regmap_gregset s390x_regmap_gregset
57 #else
58 #define regmap_gregset s390_regmap_gregset
59 #endif
60
61 #define regmap_fpregset s390_regmap_fpregset
62
63 /* Fill the regset described by MAP into REGCACHE, using the values
64    from REGP.  The MAP array represents each register as a pair
65    (offset, regno) of short integers and is terminated with -1. */
66
67 static void
68 s390_native_supply (struct regcache *regcache, const short *map,
69                     const gdb_byte *regp)
70 {
71   for (; map[0] >= 0; map += 2)
72     regcache_raw_supply (regcache, map[1], regp ? regp + map[0] : NULL);
73 }
74
75 /* Collect the register REGNO out of the regset described by MAP from
76    REGCACHE into REGP.  If REGNO == -1, do this for all registers in
77    this regset. */
78
79 static void
80 s390_native_collect (const struct regcache *regcache, const short *map,
81                      int regno, gdb_byte *regp)
82 {
83   for (; map[0] >= 0; map += 2)
84     if (regno == -1 || regno == map[1])
85       regcache_raw_collect (regcache, map[1], regp + map[0]);
86 }
87
88 /* Fill GDB's register array with the general-purpose register values
89    in *REGP.
90
91    When debugging a 32-bit executable running under a 64-bit kernel,
92    we have to fix up the 64-bit registers we get from the kernel to
93    make them look like 32-bit registers.  */
94
95 void
96 supply_gregset (struct regcache *regcache, const gregset_t *regp)
97 {
98 #ifdef __s390x__
99   struct gdbarch *gdbarch = get_regcache_arch (regcache);
100   if (gdbarch_ptr_bit (gdbarch) == 32)
101     {
102       enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
103       ULONGEST pswm = 0, pswa = 0;
104       gdb_byte buf[4];
105       const short *map;
106
107       for (map = regmap_gregset; map[0] >= 0; map += 2)
108         {
109           const gdb_byte *p = (const gdb_byte *) regp + map[0];
110           int regno = map[1];
111
112           if (regno == S390_PSWM_REGNUM)
113             pswm = extract_unsigned_integer (p, 8, byte_order);
114           else if (regno == S390_PSWA_REGNUM)
115             pswa = extract_unsigned_integer (p, 8, byte_order);
116           else
117             {
118               if ((regno >= S390_R0_REGNUM && regno <= S390_R15_REGNUM)
119                   || regno == S390_ORIG_R2_REGNUM)
120                 p += 4;
121               regcache_raw_supply (regcache, regno, p);
122             }
123         }
124
125       store_unsigned_integer (buf, 4, byte_order, (pswm >> 32) | 0x80000);
126       regcache_raw_supply (regcache, S390_PSWM_REGNUM, buf);
127       store_unsigned_integer (buf, 4, byte_order,
128                               (pswa & 0x7fffffff) | (pswm & 0x80000000));
129       regcache_raw_supply (regcache, S390_PSWA_REGNUM, buf);
130       return;
131     }
132 #endif
133
134   s390_native_supply (regcache, regmap_gregset, (const gdb_byte *) regp);
135 }
136
137 /* Fill register REGNO (if it is a general-purpose register) in
138    *REGP with the value in GDB's register array.  If REGNO is -1,
139    do this for all registers.  */
140
141 void
142 fill_gregset (const struct regcache *regcache, gregset_t *regp, int regno)
143 {
144 #ifdef __s390x__
145   struct gdbarch *gdbarch = get_regcache_arch (regcache);
146   if (gdbarch_ptr_bit (gdbarch) == 32)
147     {
148       gdb_byte *psw_p[2];
149       const short *map;
150
151       for (map = regmap_gregset; map[0] >= 0; map += 2)
152         {
153           gdb_byte *p = (gdb_byte *) regp + map[0];
154           int reg = map[1];
155
156           if (reg >= S390_PSWM_REGNUM && reg <= S390_PSWA_REGNUM)
157             psw_p[reg - S390_PSWM_REGNUM] = p;
158
159           else if (regno == -1 || regno == reg)
160             {
161               if ((reg >= S390_R0_REGNUM && reg <= S390_R15_REGNUM)
162                   || reg == S390_ORIG_R2_REGNUM)
163                 {
164                   memset (p, 0, 4);
165                   p += 4;
166                 }
167               regcache_raw_collect (regcache, reg, p + 4);
168             }
169         }
170
171       if (regno == -1
172           || regno == S390_PSWM_REGNUM || regno == S390_PSWA_REGNUM)
173         {
174           enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
175           ULONGEST pswa, pswm;
176           gdb_byte buf[4];
177
178           regcache_raw_collect (regcache, S390_PSWM_REGNUM, buf);
179           pswm = extract_unsigned_integer (buf, 4, byte_order);
180           regcache_raw_collect (regcache, S390_PSWA_REGNUM, buf);
181           pswa = extract_unsigned_integer (buf, 4, byte_order);
182
183           if (regno == -1 || regno == S390_PSWM_REGNUM)
184             store_unsigned_integer (psw_p[0], 8, byte_order,
185                                     ((pswm & 0xfff7ffff) << 32) |
186                                     (pswa & 0x80000000));
187           if (regno == -1 || regno == S390_PSWA_REGNUM)
188             store_unsigned_integer (psw_p[1], 8, byte_order,
189                                     pswa & 0x7fffffff);
190         }
191       return;
192     }
193 #endif
194
195   s390_native_collect (regcache, regmap_gregset, regno, (gdb_byte *) regp);
196 }
197
198 /* Fill GDB's register array with the floating-point register values
199    in *REGP.  */
200 void
201 supply_fpregset (struct regcache *regcache, const fpregset_t *regp)
202 {
203   s390_native_supply (regcache, regmap_fpregset, (const gdb_byte *) regp);
204 }
205
206 /* Fill register REGNO (if it is a general-purpose register) in
207    *REGP with the value in GDB's register array.  If REGNO is -1,
208    do this for all registers.  */
209 void
210 fill_fpregset (const struct regcache *regcache, fpregset_t *regp, int regno)
211 {
212   s390_native_collect (regcache, regmap_fpregset, regno, (gdb_byte *) regp);
213 }
214
215 /* Find the TID for the current inferior thread to use with ptrace.  */
216 static int
217 s390_inferior_tid (void)
218 {
219   /* GNU/Linux LWP ID's are process ID's.  */
220   int tid = ptid_get_lwp (inferior_ptid);
221   if (tid == 0)
222     tid = ptid_get_pid (inferior_ptid); /* Not a threaded program.  */
223
224   return tid;
225 }
226
227 /* Fetch all general-purpose registers from process/thread TID and
228    store their values in GDB's register cache.  */
229 static void
230 fetch_regs (struct regcache *regcache, int tid)
231 {
232   gregset_t regs;
233   ptrace_area parea;
234
235   parea.len = sizeof (regs);
236   parea.process_addr = (addr_t) &regs;
237   parea.kernel_addr = offsetof (struct user_regs_struct, psw);
238   if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea) < 0)
239     perror_with_name (_("Couldn't get registers"));
240
241   supply_gregset (regcache, (const gregset_t *) &regs);
242 }
243
244 /* Store all valid general-purpose registers in GDB's register cache
245    into the process/thread specified by TID.  */
246 static void
247 store_regs (const struct regcache *regcache, int tid, int regnum)
248 {
249   gregset_t regs;
250   ptrace_area parea;
251
252   parea.len = sizeof (regs);
253   parea.process_addr = (addr_t) &regs;
254   parea.kernel_addr = offsetof (struct user_regs_struct, psw);
255   if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea) < 0)
256     perror_with_name (_("Couldn't get registers"));
257
258   fill_gregset (regcache, &regs, regnum);
259
260   if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea) < 0)
261     perror_with_name (_("Couldn't write registers"));
262 }
263
264 /* Fetch all floating-point registers from process/thread TID and store
265    their values in GDB's register cache.  */
266 static void
267 fetch_fpregs (struct regcache *regcache, int tid)
268 {
269   fpregset_t fpregs;
270   ptrace_area parea;
271
272   parea.len = sizeof (fpregs);
273   parea.process_addr = (addr_t) &fpregs;
274   parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
275   if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea) < 0)
276     perror_with_name (_("Couldn't get floating point status"));
277
278   supply_fpregset (regcache, (const fpregset_t *) &fpregs);
279 }
280
281 /* Store all valid floating-point registers in GDB's register cache
282    into the process/thread specified by TID.  */
283 static void
284 store_fpregs (const struct regcache *regcache, int tid, int regnum)
285 {
286   fpregset_t fpregs;
287   ptrace_area parea;
288
289   parea.len = sizeof (fpregs);
290   parea.process_addr = (addr_t) &fpregs;
291   parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
292   if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea) < 0)
293     perror_with_name (_("Couldn't get floating point status"));
294
295   fill_fpregset (regcache, &fpregs, regnum);
296
297   if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea) < 0)
298     perror_with_name (_("Couldn't write floating point status"));
299 }
300
301 /* Fetch all registers in the kernel's register set whose number is REGSET,
302    whose size is REGSIZE, and whose layout is described by REGMAP, from
303    process/thread TID and store their values in GDB's register cache.  */
304 static void
305 fetch_regset (struct regcache *regcache, int tid,
306               int regset, int regsize, const short *regmap)
307 {
308   gdb_byte *buf = alloca (regsize);
309   struct iovec iov;
310
311   iov.iov_base = buf;
312   iov.iov_len = regsize;
313
314   if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) < 0)
315     {
316       if (errno == ENODATA)
317         s390_native_supply (regcache, regmap, NULL);
318       else
319         perror_with_name (_("Couldn't get register set"));
320     }
321   else
322     s390_native_supply (regcache, regmap, buf);
323 }
324
325 /* Store all registers in the kernel's register set whose number is REGSET,
326    whose size is REGSIZE, and whose layout is described by REGMAP, from
327    GDB's register cache back to process/thread TID.  */
328 static void
329 store_regset (struct regcache *regcache, int tid,
330               int regset, int regsize, const short *regmap)
331 {
332   gdb_byte *buf = alloca (regsize);
333   struct iovec iov;
334
335   iov.iov_base = buf;
336   iov.iov_len = regsize;
337
338   if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) < 0)
339     perror_with_name (_("Couldn't get register set"));
340
341   s390_native_collect (regcache, regmap, -1, buf);
342
343   if (ptrace (PTRACE_SETREGSET, tid, (long) regset, (long) &iov) < 0)
344     perror_with_name (_("Couldn't set register set"));
345 }
346
347 /* Check whether the kernel provides a register set with number REGSET
348    of size REGSIZE for process/thread TID.  */
349 static int
350 check_regset (int tid, int regset, int regsize)
351 {
352   gdb_byte *buf = alloca (regsize);
353   struct iovec iov;
354
355   iov.iov_base = buf;
356   iov.iov_len = regsize;
357
358   if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) >= 0
359       || errno == ENODATA)
360     return 1;
361   return 0;
362 }
363
364 /* Fetch register REGNUM from the child process.  If REGNUM is -1, do
365    this for all registers.  */
366 static void
367 s390_linux_fetch_inferior_registers (struct target_ops *ops,
368                                      struct regcache *regcache, int regnum)
369 {
370   int tid = s390_inferior_tid ();
371
372   if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
373     fetch_regs (regcache, tid);
374
375   if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
376     fetch_fpregs (regcache, tid);
377
378   if (have_regset_last_break)
379     if (regnum == -1 || regnum == S390_LAST_BREAK_REGNUM)
380       fetch_regset (regcache, tid, NT_S390_LAST_BREAK, 8,
381                     (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32
382                      ? s390_regmap_last_break : s390x_regmap_last_break));
383
384   if (have_regset_system_call)
385     if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
386       fetch_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
387                     s390_regmap_system_call);
388
389   if (have_regset_tdb)
390     if (regnum == -1 || S390_IS_TDBREGSET_REGNUM (regnum))
391       fetch_regset (regcache, tid, NT_S390_TDB, s390_sizeof_tdbregset,
392                     s390_regmap_tdb);
393 }
394
395 /* Store register REGNUM back into the child process.  If REGNUM is
396    -1, do this for all registers.  */
397 static void
398 s390_linux_store_inferior_registers (struct target_ops *ops,
399                                      struct regcache *regcache, int regnum)
400 {
401   int tid = s390_inferior_tid ();
402
403   if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
404     store_regs (regcache, tid, regnum);
405
406   if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
407     store_fpregs (regcache, tid, regnum);
408
409   /* S390_LAST_BREAK_REGNUM is read-only.  */
410
411   if (have_regset_system_call)
412     if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
413       store_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
414                     s390_regmap_system_call);
415 }
416
417
418 /* Hardware-assisted watchpoint handling.  */
419
420 /* We maintain a list of all currently active watchpoints in order
421    to properly handle watchpoint removal.
422
423    The only thing we actually need is the total address space area
424    spanned by the watchpoints.  */
425
426 struct watch_area
427 {
428   struct watch_area *next;
429   CORE_ADDR lo_addr;
430   CORE_ADDR hi_addr;
431 };
432
433 static struct watch_area *watch_base = NULL;
434
435 static int
436 s390_stopped_by_watchpoint (void)
437 {
438   per_lowcore_bits per_lowcore;
439   ptrace_area parea;
440   int result;
441
442   /* Speed up common case.  */
443   if (!watch_base)
444     return 0;
445
446   parea.len = sizeof (per_lowcore);
447   parea.process_addr = (addr_t) & per_lowcore;
448   parea.kernel_addr = offsetof (struct user_regs_struct, per_info.lowcore);
449   if (ptrace (PTRACE_PEEKUSR_AREA, s390_inferior_tid (), &parea) < 0)
450     perror_with_name (_("Couldn't retrieve watchpoint status"));
451
452   result = (per_lowcore.perc_storage_alteration == 1
453             && per_lowcore.perc_store_real_address == 0);
454
455   if (result)
456     {
457       /* Do not report this watchpoint again.  */
458       memset (&per_lowcore, 0, sizeof (per_lowcore));
459       if (ptrace (PTRACE_POKEUSR_AREA, s390_inferior_tid (), &parea) < 0)
460         perror_with_name (_("Couldn't clear watchpoint status"));
461     }
462
463   return result;
464 }
465
466 static void
467 s390_fix_watch_points (struct lwp_info *lp)
468 {
469   int tid;
470
471   per_struct per_info;
472   ptrace_area parea;
473
474   CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
475   struct watch_area *area;
476
477   tid = ptid_get_lwp (lp->ptid);
478   if (tid == 0)
479     tid = ptid_get_pid (lp->ptid);
480
481   for (area = watch_base; area; area = area->next)
482     {
483       watch_lo_addr = min (watch_lo_addr, area->lo_addr);
484       watch_hi_addr = max (watch_hi_addr, area->hi_addr);
485     }
486
487   parea.len = sizeof (per_info);
488   parea.process_addr = (addr_t) & per_info;
489   parea.kernel_addr = offsetof (struct user_regs_struct, per_info);
490   if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea) < 0)
491     perror_with_name (_("Couldn't retrieve watchpoint status"));
492
493   if (watch_base)
494     {
495       per_info.control_regs.bits.em_storage_alteration = 1;
496       per_info.control_regs.bits.storage_alt_space_ctl = 1;
497     }
498   else
499     {
500       per_info.control_regs.bits.em_storage_alteration = 0;
501       per_info.control_regs.bits.storage_alt_space_ctl = 0;
502     }
503   per_info.starting_addr = watch_lo_addr;
504   per_info.ending_addr = watch_hi_addr;
505
506   if (ptrace (PTRACE_POKEUSR_AREA, tid, &parea) < 0)
507     perror_with_name (_("Couldn't modify watchpoint status"));
508 }
509
510 static int
511 s390_insert_watchpoint (CORE_ADDR addr, int len, int type,
512                         struct expression *cond)
513 {
514   struct lwp_info *lp;
515   struct watch_area *area = xmalloc (sizeof (struct watch_area));
516
517   if (!area)
518     return -1;
519
520   area->lo_addr = addr;
521   area->hi_addr = addr + len - 1;
522
523   area->next = watch_base;
524   watch_base = area;
525
526   ALL_LWPS (lp)
527     s390_fix_watch_points (lp);
528   return 0;
529 }
530
531 static int
532 s390_remove_watchpoint (CORE_ADDR addr, int len, int type,
533                         struct expression *cond)
534 {
535   struct lwp_info *lp;
536   struct watch_area *area, **parea;
537
538   for (parea = &watch_base; *parea; parea = &(*parea)->next)
539     if ((*parea)->lo_addr == addr
540         && (*parea)->hi_addr == addr + len - 1)
541       break;
542
543   if (!*parea)
544     {
545       fprintf_unfiltered (gdb_stderr,
546                           "Attempt to remove nonexistent watchpoint.\n");
547       return -1;
548     }
549
550   area = *parea;
551   *parea = area->next;
552   xfree (area);
553
554   ALL_LWPS (lp)
555     s390_fix_watch_points (lp);
556   return 0;
557 }
558
559 static int
560 s390_can_use_hw_breakpoint (int type, int cnt, int othertype)
561 {
562   return type == bp_hardware_watchpoint;
563 }
564
565 static int
566 s390_region_ok_for_hw_watchpoint (CORE_ADDR addr, int cnt)
567 {
568   return 1;
569 }
570
571 static int
572 s390_target_wordsize (void)
573 {
574   int wordsize = 4;
575
576   /* Check for 64-bit inferior process.  This is the case when the host is
577      64-bit, and in addition bit 32 of the PSW mask is set.  */
578 #ifdef __s390x__
579   long pswm;
580
581   errno = 0;
582   pswm = (long) ptrace (PTRACE_PEEKUSER, s390_inferior_tid (), PT_PSWMASK, 0);
583   if (errno == 0 && (pswm & 0x100000000ul) != 0)
584     wordsize = 8;
585 #endif
586
587   return wordsize;
588 }
589
590 static int
591 s390_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
592                  gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
593 {
594   int sizeof_auxv_field = s390_target_wordsize ();
595   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
596   gdb_byte *ptr = *readptr;
597
598   if (endptr == ptr)
599     return 0;
600
601   if (endptr - ptr < sizeof_auxv_field * 2)
602     return -1;
603
604   *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
605   ptr += sizeof_auxv_field;
606   *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
607   ptr += sizeof_auxv_field;
608
609   *readptr = ptr;
610   return 1;
611 }
612
613 #ifdef __s390x__
614 static unsigned long
615 s390_get_hwcap (void)
616 {
617   CORE_ADDR field;
618
619   if (target_auxv_search (&current_target, AT_HWCAP, &field))
620     return (unsigned long) field;
621
622   return 0;
623 }
624 #endif
625
626 static const struct target_desc *
627 s390_read_description (struct target_ops *ops)
628 {
629   int tid = s390_inferior_tid ();
630
631   have_regset_last_break
632     = check_regset (tid, NT_S390_LAST_BREAK, 8);
633   have_regset_system_call
634     = check_regset (tid, NT_S390_SYSTEM_CALL, 4);
635
636 #ifdef __s390x__
637   /* If GDB itself is compiled as 64-bit, we are running on a machine in
638      z/Architecture mode.  If the target is running in 64-bit addressing
639      mode, report s390x architecture.  If the target is running in 31-bit
640      addressing mode, but the kernel supports using 64-bit registers in
641      that mode, report s390 architecture with 64-bit GPRs.  */
642
643   have_regset_tdb = (s390_get_hwcap () & HWCAP_S390_TE) ?
644     check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset) : 0;
645
646   if (s390_target_wordsize () == 8)
647     return (have_regset_tdb ? tdesc_s390x_te_linux64 :
648             have_regset_system_call? tdesc_s390x_linux64v2 :
649             have_regset_last_break? tdesc_s390x_linux64v1 :
650             tdesc_s390x_linux64);
651
652   if (s390_get_hwcap () & HWCAP_S390_HIGH_GPRS)
653     return (have_regset_tdb ? tdesc_s390_te_linux64 :
654             have_regset_system_call? tdesc_s390_linux64v2 :
655             have_regset_last_break? tdesc_s390_linux64v1 :
656             tdesc_s390_linux64);
657 #endif
658
659   /* If GDB itself is compiled as 31-bit, or if we're running a 31-bit inferior
660      on a 64-bit kernel that does not support using 64-bit registers in 31-bit
661      mode, report s390 architecture with 32-bit GPRs.  */
662   return (have_regset_system_call? tdesc_s390_linux32v2 :
663           have_regset_last_break? tdesc_s390_linux32v1 :
664           tdesc_s390_linux32);
665 }
666
667 void _initialize_s390_nat (void);
668
669 void
670 _initialize_s390_nat (void)
671 {
672   struct target_ops *t;
673
674   /* Fill in the generic GNU/Linux methods.  */
675   t = linux_target ();
676
677   /* Add our register access methods.  */
678   t->to_fetch_registers = s390_linux_fetch_inferior_registers;
679   t->to_store_registers = s390_linux_store_inferior_registers;
680
681   /* Add our watchpoint methods.  */
682   t->to_can_use_hw_breakpoint = s390_can_use_hw_breakpoint;
683   t->to_region_ok_for_hw_watchpoint = s390_region_ok_for_hw_watchpoint;
684   t->to_have_continuable_watchpoint = 1;
685   t->to_stopped_by_watchpoint = s390_stopped_by_watchpoint;
686   t->to_insert_watchpoint = s390_insert_watchpoint;
687   t->to_remove_watchpoint = s390_remove_watchpoint;
688
689   /* Detect target architecture.  */
690   t->to_read_description = s390_read_description;
691   t->to_auxv_parse = s390_auxv_parse;
692
693   /* Register the target.  */
694   linux_nat_add_target (t);
695   linux_nat_set_new_thread (t, s390_fix_watch_points);
696 }