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