X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fs390-linux-nat.c;h=9ec806f5b591e98a2042e6de2761a7da63928ef5;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=2b205df9de89a6d0cb79219815b1f120c6b10028;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c index 2b205df9de..9ec806f5b5 100644 --- a/gdb/s390-linux-nat.c +++ b/gdb/s390-linux-nat.c @@ -1,5 +1,5 @@ /* S390 native-dependent code for GDB, the GNU debugger. - Copyright (C) 2001-2017 Free Software Foundation, Inc. + Copyright (C) 2001-2020 Free Software Foundation, Inc. Contributed by D.J. Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) for IBM Deutschland Entwicklung GmbH, IBM Corporation. @@ -30,6 +30,7 @@ #include "nat/linux-ptrace.h" #include "gdbcmd.h" +#include "s390-tdep.h" #include "s390-linux-tdep.h" #include "elf/common.h" @@ -40,6 +41,9 @@ #include #include #include +#include "inf-ptrace.h" +#include "linux-tdep.h" +#include "gdbarch.h" /* Per-thread arch-specific data. */ @@ -53,6 +57,7 @@ static int have_regset_last_break = 0; static int have_regset_system_call = 0; static int have_regset_tdb = 0; static int have_regset_vxrs = 0; +static int have_regset_gs = 0; /* Register map for 32-bit executables running under a 64-bit kernel. */ @@ -105,6 +110,41 @@ static const struct regset s390_64_gregset = #define PER_CONTROL_SUSPENSION PER_BIT (41) #define PER_CONTROL_ALTERATION PER_BIT (42) +class s390_linux_nat_target final : public linux_nat_target +{ +public: + /* Add our register access methods. */ + void fetch_registers (struct regcache *, int) override; + void store_registers (struct regcache *, int) override; + + /* Add our watchpoint methods. */ + int can_use_hw_breakpoint (enum bptype, int, int) override; + int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) + override; + int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) + override; + int region_ok_for_hw_watchpoint (CORE_ADDR, int) override; + bool stopped_by_watchpoint () override; + int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type, + struct expression *) override; + int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type, + struct expression *) override; + + /* Detect target architecture. */ + const struct target_desc *read_description () override; + int auxv_parse (gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) + override; + + /* Override linux_nat_target low methods. */ + void low_new_thread (struct lwp_info *lp) override; + void low_delete_thread (struct arch_lwp_info *lp) override; + void low_prepare_to_resume (struct lwp_info *lp) override; + void low_new_fork (struct lwp_info *parent, pid_t child_pid) override; + void low_forget_process (pid_t pid) override; +}; + +static s390_linux_nat_target the_s390_linux_nat_target; /* Fill GDB's register array with the general-purpose register values in *REGP. @@ -117,7 +157,7 @@ void supply_gregset (struct regcache *regcache, const gregset_t *regp) { #ifdef __s390x__ - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (gdbarch_ptr_bit (gdbarch) == 32) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -131,10 +171,10 @@ supply_gregset (struct regcache *regcache, const gregset_t *regp) pswa = extract_unsigned_integer ((const gdb_byte *) regp + S390_PSWA_OFFSET, 8, byte_order); store_unsigned_integer (buf, 4, byte_order, (pswm >> 32) | 0x80000); - regcache_raw_supply (regcache, S390_PSWM_REGNUM, buf); + regcache->raw_supply (S390_PSWM_REGNUM, buf); store_unsigned_integer (buf, 4, byte_order, (pswa & 0x7fffffff) | (pswm & 0x80000000)); - regcache_raw_supply (regcache, S390_PSWA_REGNUM, buf); + regcache->raw_supply (S390_PSWA_REGNUM, buf); return; } #endif @@ -151,7 +191,7 @@ void fill_gregset (const struct regcache *regcache, gregset_t *regp, int regno) { #ifdef __s390x__ - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (gdbarch_ptr_bit (gdbarch) == 32) { regcache_collect_regset (&s390_64_gregset, regcache, regno, @@ -171,14 +211,14 @@ fill_gregset (const struct regcache *regcache, gregset_t *regp, int regno) if (regno == -1 || regno == S390_PSWM_REGNUM) { pswm &= 0x80000000; - regcache_raw_collect (regcache, S390_PSWM_REGNUM, buf); + regcache->raw_collect (S390_PSWM_REGNUM, buf); pswm |= (extract_unsigned_integer (buf, 4, byte_order) & 0xfff7ffff) << 32; } if (regno == -1 || regno == S390_PSWA_REGNUM) { - regcache_raw_collect (regcache, S390_PSWA_REGNUM, buf); + regcache->raw_collect (S390_PSWA_REGNUM, buf); pswa = extract_unsigned_integer (buf, 4, byte_order); pswm ^= (pswm ^ pswa) & 0x80000000; pswa &= 0x7fffffff; @@ -219,9 +259,9 @@ static int s390_inferior_tid (void) { /* GNU/Linux LWP ID's are process ID's. */ - int tid = ptid_get_lwp (inferior_ptid); + int tid = inferior_ptid.lwp (); if (tid == 0) - tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */ + tid = inferior_ptid.pid (); /* Not a threaded program. */ return tid; } @@ -366,11 +406,10 @@ check_regset (int tid, int regset, int regsize) /* Fetch register REGNUM from the child process. If REGNUM is -1, do this for all registers. */ -static void -s390_linux_fetch_inferior_registers (struct target_ops *ops, - struct regcache *regcache, int regnum) +void +s390_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum) { - int tid = s390_inferior_tid (); + pid_t tid = get_ptrace_pid (regcache->ptid ()); if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum)) fetch_regs (regcache, tid); @@ -381,7 +420,7 @@ s390_linux_fetch_inferior_registers (struct target_ops *ops, if (have_regset_last_break) if (regnum == -1 || regnum == S390_LAST_BREAK_REGNUM) fetch_regset (regcache, tid, NT_S390_LAST_BREAK, 8, - (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32 + (gdbarch_ptr_bit (regcache->arch ()) == 32 ? &s390_last_break_regset : &s390x_last_break_regset)); if (have_regset_system_call) @@ -405,15 +444,26 @@ s390_linux_fetch_inferior_registers (struct target_ops *ops, fetch_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16, &s390_vxrs_high_regset); } + + if (have_regset_gs) + { + if (regnum == -1 || (regnum >= S390_GSD_REGNUM + && regnum <= S390_GSEPLA_REGNUM)) + fetch_regset (regcache, tid, NT_S390_GS_CB, 4 * 8, + &s390_gs_regset); + if (regnum == -1 || (regnum >= S390_BC_GSD_REGNUM + && regnum <= S390_BC_GSEPLA_REGNUM)) + fetch_regset (regcache, tid, NT_S390_GS_BC, 4 * 8, + &s390_gsbc_regset); + } } /* Store register REGNUM back into the child process. If REGNUM is -1, do this for all registers. */ -static void -s390_linux_store_inferior_registers (struct target_ops *ops, - struct regcache *regcache, int regnum) +void +s390_linux_nat_target::store_registers (struct regcache *regcache, int regnum) { - int tid = s390_inferior_tid (); + pid_t tid = get_ptrace_pid (regcache->ptid ()); if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum)) store_regs (regcache, tid, regnum); @@ -450,28 +500,26 @@ s390_linux_store_inferior_registers (struct target_ops *ops, The only thing we actually need is the total address space area spanned by the watchpoints. */ -typedef struct watch_area +struct watch_area { CORE_ADDR lo_addr; CORE_ADDR hi_addr; -} s390_watch_area; - -DEF_VEC_O (s390_watch_area); +}; /* Hardware debug state. */ struct s390_debug_reg_state { - VEC_s390_watch_area *watch_areas; - VEC_s390_watch_area *break_areas; + std::vector watch_areas; + std::vector break_areas; }; /* Per-process data. */ struct s390_process_info { - struct s390_process_info *next; - pid_t pid; + struct s390_process_info *next = nullptr; + pid_t pid = 0; struct s390_debug_reg_state state; }; @@ -497,7 +545,7 @@ s390_find_process_pid (pid_t pid) static struct s390_process_info * s390_add_process (pid_t pid) { - struct s390_process_info *proc = XCNEW (struct s390_process_info); + struct s390_process_info *proc = new struct s390_process_info; proc->pid = pid; proc->next = s390_process_list; @@ -532,8 +580,8 @@ s390_get_debug_reg_state (pid_t pid) /* Called whenever GDB is no longer debugging process PID. It deletes data structures that keep track of hardware debug state. */ -static void -s390_forget_process (pid_t pid) +void +s390_linux_nat_target::low_forget_process (pid_t pid) { struct s390_process_info *proc, **proc_link; @@ -544,10 +592,8 @@ s390_forget_process (pid_t pid) { if (proc->pid == pid) { - VEC_free (s390_watch_area, proc->state.watch_areas); - VEC_free (s390_watch_area, proc->state.break_areas); *proc_link = proc->next; - xfree (proc); + delete proc; return; } @@ -558,8 +604,8 @@ s390_forget_process (pid_t pid) /* linux_nat_new_fork hook. */ -static void -s390_linux_new_fork (struct lwp_info *parent, pid_t child_pid) +void +s390_linux_nat_target::low_new_fork (struct lwp_info *parent, pid_t child_pid) { pid_t parent_pid; struct s390_debug_reg_state *parent_state; @@ -573,14 +619,12 @@ s390_linux_new_fork (struct lwp_info *parent, pid_t child_pid) /* GDB core assumes the child inherits the watchpoints/hw breakpoints of the parent. So copy the debug state from parent to child. */ - parent_pid = ptid_get_pid (parent->ptid); + parent_pid = parent->ptid.pid (); parent_state = s390_get_debug_reg_state (parent_pid); child_state = s390_get_debug_reg_state (child_pid); - child_state->watch_areas = VEC_copy (s390_watch_area, - parent_state->watch_areas); - child_state->break_areas = VEC_copy (s390_watch_area, - parent_state->break_areas); + child_state->watch_areas = parent_state->watch_areas; + child_state->break_areas = parent_state->break_areas; } /* Dump PER state. */ @@ -614,21 +658,20 @@ s390_show_debug_regs (int tid, const char *where) per_info.lowcore.words.access_id); } -static int -s390_stopped_by_watchpoint (struct target_ops *ops) +bool +s390_linux_nat_target::stopped_by_watchpoint () { struct s390_debug_reg_state *state - = s390_get_debug_reg_state (ptid_get_pid (inferior_ptid)); + = s390_get_debug_reg_state (inferior_ptid.pid ()); per_lowcore_bits per_lowcore; ptrace_area parea; - int result; if (show_debug_regs) s390_show_debug_regs (s390_inferior_tid (), "stop"); /* Speed up common case. */ - if (VEC_empty (s390_watch_area, state->watch_areas)) - return 0; + if (state->watch_areas.empty ()) + return false; parea.len = sizeof (per_lowcore); parea.process_addr = (addr_t) & per_lowcore; @@ -636,8 +679,8 @@ s390_stopped_by_watchpoint (struct target_ops *ops) if (ptrace (PTRACE_PEEKUSR_AREA, s390_inferior_tid (), &parea, 0) < 0) perror_with_name (_("Couldn't retrieve watchpoint status")); - result = (per_lowcore.perc_storage_alteration == 1 - && per_lowcore.perc_store_real_address == 0); + bool result = (per_lowcore.perc_storage_alteration == 1 + && per_lowcore.perc_store_real_address == 0); if (result) { @@ -652,18 +695,16 @@ s390_stopped_by_watchpoint (struct target_ops *ops) /* Each time before resuming a thread, update its PER info. */ -static void -s390_prepare_to_resume (struct lwp_info *lp) +void +s390_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp) { int tid; - pid_t pid = ptid_get_pid (ptid_of_lwp (lp)); + pid_t pid = ptid_of_lwp (lp).pid (); per_struct per_info; ptrace_area parea; CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0; - unsigned ix; - s390_watch_area *area; struct arch_lwp_info *lp_priv = lwp_arch_private_info (lp); struct s390_debug_reg_state *state = s390_get_debug_reg_state (pid); int step = lwp_is_stepping (lp); @@ -676,13 +717,13 @@ s390_prepare_to_resume (struct lwp_info *lp) hardware breakpoints (if any). Otherwise we're done. */ if (!lp_priv->per_info_changed) { - if (!step || VEC_empty (s390_watch_area, state->break_areas)) + if (!step || state->break_areas.empty ()) return; } lp_priv->per_info_changed = 0; - tid = ptid_get_lwp (ptid_of_lwp (lp)); + tid = ptid_of_lwp (lp).lwp (); if (tid == 0) tid = pid; @@ -695,14 +736,12 @@ s390_prepare_to_resume (struct lwp_info *lp) memset (&per_info, 0, sizeof (per_info)); per_info.single_step = (step != 0); - if (!VEC_empty (s390_watch_area, state->watch_areas)) + if (!state->watch_areas.empty ()) { - for (ix = 0; - VEC_iterate (s390_watch_area, state->watch_areas, ix, area); - ix++) + for (const auto &area : state->watch_areas) { - watch_lo_addr = std::min (watch_lo_addr, area->lo_addr); - watch_hi_addr = std::max (watch_hi_addr, area->hi_addr); + watch_lo_addr = std::min (watch_lo_addr, area.lo_addr); + watch_hi_addr = std::max (watch_hi_addr, area.hi_addr); } /* Enable storage-alteration events. */ @@ -710,7 +749,7 @@ s390_prepare_to_resume (struct lwp_info *lp) | PER_CONTROL_ALTERATION); } - if (!VEC_empty (s390_watch_area, state->break_areas)) + if (!state->break_areas.empty ()) { /* Don't install hardware breakpoints while single-stepping, since our PER settings (e.g. the nullification bit) might then conflict @@ -719,12 +758,10 @@ s390_prepare_to_resume (struct lwp_info *lp) lp_priv->per_info_changed = 1; else { - for (ix = 0; - VEC_iterate (s390_watch_area, state->break_areas, ix, area); - ix++) + for (const auto &area : state->break_areas) { - watch_lo_addr = std::min (watch_lo_addr, area->lo_addr); - watch_hi_addr = std::max (watch_hi_addr, area->hi_addr); + watch_lo_addr = std::min (watch_lo_addr, area.lo_addr); + watch_hi_addr = std::max (watch_hi_addr, area.hi_addr); } /* If there's just one breakpoint, enable instruction-fetching @@ -769,16 +806,24 @@ s390_mark_per_info_changed (struct lwp_info *lp) /* When attaching to a new thread, mark its PER info as changed. */ -static void -s390_new_thread (struct lwp_info *lp) +void +s390_linux_nat_target::low_new_thread (struct lwp_info *lp) { s390_mark_per_info_changed (lp); } +/* Function to call when a thread is being deleted. */ + +void +s390_linux_nat_target::low_delete_thread (struct arch_lwp_info *arch_lwp) +{ + xfree (arch_lwp); +} + /* Iterator callback for s390_refresh_per_info. */ static int -s390_refresh_per_info_cb (struct lwp_info *lp, void *arg) +s390_refresh_per_info_cb (struct lwp_info *lp) { s390_mark_per_info_changed (lp); @@ -792,45 +837,43 @@ s390_refresh_per_info_cb (struct lwp_info *lp, void *arg) static int s390_refresh_per_info (void) { - ptid_t pid_ptid = pid_to_ptid (ptid_get_pid (current_lwp_ptid ())); + ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ()); - iterate_over_lwps (pid_ptid, s390_refresh_per_info_cb, NULL); + iterate_over_lwps (pid_ptid, s390_refresh_per_info_cb); return 0; } -static int -s390_insert_watchpoint (struct target_ops *self, - CORE_ADDR addr, int len, enum target_hw_bp_type type, - struct expression *cond) +int +s390_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond) { - s390_watch_area area; + watch_area area; struct s390_debug_reg_state *state - = s390_get_debug_reg_state (ptid_get_pid (inferior_ptid)); + = s390_get_debug_reg_state (inferior_ptid.pid ()); area.lo_addr = addr; area.hi_addr = addr + len - 1; - VEC_safe_push (s390_watch_area, state->watch_areas, &area); + state->watch_areas.push_back (area); return s390_refresh_per_info (); } -static int -s390_remove_watchpoint (struct target_ops *self, - CORE_ADDR addr, int len, enum target_hw_bp_type type, - struct expression *cond) +int +s390_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond) { unsigned ix; - s390_watch_area *area; struct s390_debug_reg_state *state - = s390_get_debug_reg_state (ptid_get_pid (inferior_ptid)); + = s390_get_debug_reg_state (inferior_ptid.pid ()); - for (ix = 0; - VEC_iterate (s390_watch_area, state->watch_areas, ix, area); - ix++) + for (ix = 0; ix < state->watch_areas.size (); ix++) { - if (area->lo_addr == addr && area->hi_addr == addr + len - 1) + watch_area &area = state->watch_areas[ix]; + if (area.lo_addr == addr && area.hi_addr == addr + len - 1) { - VEC_unordered_remove (s390_watch_area, state->watch_areas, ix); + unordered_remove (state->watch_areas, ix); return s390_refresh_per_info (); } } @@ -842,9 +885,9 @@ s390_remove_watchpoint (struct target_ops *self, /* Implement the "can_use_hw_breakpoint" target_ops method. */ -static int -s390_can_use_hw_breakpoint (struct target_ops *self, - enum bptype type, int cnt, int othertype) +int +s390_linux_nat_target::can_use_hw_breakpoint (enum bptype type, + int cnt, int othertype) { if (type == bp_hardware_watchpoint || type == bp_hardware_breakpoint) return 1; @@ -853,41 +896,37 @@ s390_can_use_hw_breakpoint (struct target_ops *self, /* Implement the "insert_hw_breakpoint" target_ops method. */ -static int -s390_insert_hw_breakpoint (struct target_ops *self, - struct gdbarch *gdbarch, - struct bp_target_info *bp_tgt) +int +s390_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) { - s390_watch_area area; + watch_area area; struct s390_debug_reg_state *state; area.lo_addr = bp_tgt->placed_address = bp_tgt->reqstd_address; area.hi_addr = area.lo_addr; - state = s390_get_debug_reg_state (ptid_get_pid (inferior_ptid)); - VEC_safe_push (s390_watch_area, state->break_areas, &area); + state = s390_get_debug_reg_state (inferior_ptid.pid ()); + state->break_areas.push_back (area); return s390_refresh_per_info (); } /* Implement the "remove_hw_breakpoint" target_ops method. */ -static int -s390_remove_hw_breakpoint (struct target_ops *self, - struct gdbarch *gdbarch, - struct bp_target_info *bp_tgt) +int +s390_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) { unsigned ix; - struct watch_area *area; struct s390_debug_reg_state *state; - state = s390_get_debug_reg_state (ptid_get_pid (inferior_ptid)); - for (ix = 0; - VEC_iterate (s390_watch_area, state->break_areas, ix, area); - ix++) + state = s390_get_debug_reg_state (inferior_ptid.pid ()); + for (ix = 0; state->break_areas.size (); ix++) { - if (area->lo_addr == bp_tgt->placed_address) + watch_area &area = state->break_areas[ix]; + if (area.lo_addr == bp_tgt->placed_address) { - VEC_unordered_remove (s390_watch_area, state->break_areas, ix); + unordered_remove (state->break_areas, ix); return s390_refresh_per_info (); } } @@ -897,9 +936,8 @@ s390_remove_hw_breakpoint (struct target_ops *self, return -1; } -static int -s390_region_ok_for_hw_watchpoint (struct target_ops *self, - CORE_ADDR addr, int cnt) +int +s390_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int cnt) { return 1; } @@ -923,9 +961,10 @@ s390_target_wordsize (void) return wordsize; } -static int -s390_auxv_parse (struct target_ops *ops, gdb_byte **readptr, - gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) +int +s390_linux_nat_target::auxv_parse (gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, + CORE_ADDR *valp) { int sizeof_auxv_field = s390_target_wordsize (); enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); @@ -946,8 +985,8 @@ s390_auxv_parse (struct target_ops *ops, gdb_byte **readptr, return 1; } -static const struct target_desc * -s390_read_description (struct target_ops *ops) +const struct target_desc * +s390_linux_nat_target::read_description () { int tid = s390_inferior_tid (); @@ -963,9 +1002,8 @@ s390_read_description (struct target_ops *ops) that mode, report s390 architecture with 64-bit GPRs. */ #ifdef __s390x__ { - CORE_ADDR hwcap = 0; + CORE_ADDR hwcap = linux_get_hwcap (current_top_target ()); - target_auxv_search (¤t_target, AT_HWCAP, &hwcap); have_regset_tdb = (hwcap & HWCAP_S390_TE) && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset); @@ -973,8 +1011,13 @@ s390_read_description (struct target_ops *ops) && check_regset (tid, NT_S390_VXRS_LOW, 16 * 8) && check_regset (tid, NT_S390_VXRS_HIGH, 16 * 16); + have_regset_gs = (hwcap & HWCAP_S390_GS) + && check_regset (tid, NT_S390_GS_CB, 4 * 8) + && check_regset (tid, NT_S390_GS_BC, 4 * 8); + if (s390_target_wordsize () == 8) - return (have_regset_vxrs ? + return (have_regset_gs ? tdesc_s390x_gs_linux64 : + have_regset_vxrs ? (have_regset_tdb ? tdesc_s390x_tevx_linux64 : tdesc_s390x_vx_linux64) : have_regset_tdb ? tdesc_s390x_te_linux64 : @@ -983,7 +1026,8 @@ s390_read_description (struct target_ops *ops) tdesc_s390x_linux64); if (hwcap & HWCAP_S390_HIGH_GPRS) - return (have_regset_vxrs ? + return (have_regset_gs ? tdesc_s390_gs_linux64 : + have_regset_vxrs ? (have_regset_tdb ? tdesc_s390_tevx_linux64 : tdesc_s390_vx_linux64) : have_regset_tdb ? tdesc_s390_te_linux64 : @@ -1001,40 +1045,13 @@ s390_read_description (struct target_ops *ops) tdesc_s390_linux32); } -void _initialize_s390_nat (void); - +void _initialize_s390_nat (); void -_initialize_s390_nat (void) +_initialize_s390_nat () { - struct target_ops *t; - - /* Fill in the generic GNU/Linux methods. */ - t = linux_target (); - - /* Add our register access methods. */ - t->to_fetch_registers = s390_linux_fetch_inferior_registers; - t->to_store_registers = s390_linux_store_inferior_registers; - - /* Add our watchpoint methods. */ - t->to_can_use_hw_breakpoint = s390_can_use_hw_breakpoint; - t->to_insert_hw_breakpoint = s390_insert_hw_breakpoint; - t->to_remove_hw_breakpoint = s390_remove_hw_breakpoint; - t->to_region_ok_for_hw_watchpoint = s390_region_ok_for_hw_watchpoint; - t->to_have_continuable_watchpoint = 1; - t->to_stopped_by_watchpoint = s390_stopped_by_watchpoint; - t->to_insert_watchpoint = s390_insert_watchpoint; - t->to_remove_watchpoint = s390_remove_watchpoint; - - /* Detect target architecture. */ - t->to_read_description = s390_read_description; - t->to_auxv_parse = s390_auxv_parse; - /* Register the target. */ - linux_nat_add_target (t); - linux_nat_set_new_thread (t, s390_new_thread); - linux_nat_set_prepare_to_resume (t, s390_prepare_to_resume); - linux_nat_set_forget_process (t, s390_forget_process); - linux_nat_set_new_fork (t, s390_linux_new_fork); + linux_target = &the_s390_linux_nat_target; + add_inf_child_target (&the_s390_linux_nat_target); /* A maintenance command to enable showing the PER state. */ add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,