1 /* S390 native-dependent code for GDB, the GNU debugger.
2 Copyright (C) 2001-2018 Free Software Foundation, Inc.
4 Contributed by D.J. Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
5 for IBM Deutschland Entwicklung GmbH, IBM Corporation.
7 This file is part of GDB.
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.
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.
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/>. */
26 #include "linux-nat.h"
30 #include "nat/linux-ptrace.h"
33 #include "s390-tdep.h"
34 #include "s390-linux-tdep.h"
35 #include "elf/common.h"
37 #include <asm/ptrace.h>
38 #include "nat/gdb_ptrace.h"
39 #include <asm/types.h>
40 #include <sys/procfs.h>
41 #include <sys/ucontext.h>
44 #include "inf-ptrace.h"
46 /* Per-thread arch-specific data. */
50 /* Non-zero if the thread's PER info must be re-written. */
54 static int have_regset_last_break = 0;
55 static int have_regset_system_call = 0;
56 static int have_regset_tdb = 0;
57 static int have_regset_vxrs = 0;
58 static int have_regset_gs = 0;
60 /* Register map for 32-bit executables running under a 64-bit
64 static const struct regcache_map_entry s390_64_regmap_gregset[] =
66 /* Skip PSWM and PSWA, since they must be handled specially. */
67 { 2, REGCACHE_MAP_SKIP, 8 },
68 { 1, S390_R0_UPPER_REGNUM, 4 }, { 1, S390_R0_REGNUM, 4 },
69 { 1, S390_R1_UPPER_REGNUM, 4 }, { 1, S390_R1_REGNUM, 4 },
70 { 1, S390_R2_UPPER_REGNUM, 4 }, { 1, S390_R2_REGNUM, 4 },
71 { 1, S390_R3_UPPER_REGNUM, 4 }, { 1, S390_R3_REGNUM, 4 },
72 { 1, S390_R4_UPPER_REGNUM, 4 }, { 1, S390_R4_REGNUM, 4 },
73 { 1, S390_R5_UPPER_REGNUM, 4 }, { 1, S390_R5_REGNUM, 4 },
74 { 1, S390_R6_UPPER_REGNUM, 4 }, { 1, S390_R6_REGNUM, 4 },
75 { 1, S390_R7_UPPER_REGNUM, 4 }, { 1, S390_R7_REGNUM, 4 },
76 { 1, S390_R8_UPPER_REGNUM, 4 }, { 1, S390_R8_REGNUM, 4 },
77 { 1, S390_R9_UPPER_REGNUM, 4 }, { 1, S390_R9_REGNUM, 4 },
78 { 1, S390_R10_UPPER_REGNUM, 4 }, { 1, S390_R10_REGNUM, 4 },
79 { 1, S390_R11_UPPER_REGNUM, 4 }, { 1, S390_R11_REGNUM, 4 },
80 { 1, S390_R12_UPPER_REGNUM, 4 }, { 1, S390_R12_REGNUM, 4 },
81 { 1, S390_R13_UPPER_REGNUM, 4 }, { 1, S390_R13_REGNUM, 4 },
82 { 1, S390_R14_UPPER_REGNUM, 4 }, { 1, S390_R14_REGNUM, 4 },
83 { 1, S390_R15_UPPER_REGNUM, 4 }, { 1, S390_R15_REGNUM, 4 },
84 { 16, S390_A0_REGNUM, 4 },
85 { 1, REGCACHE_MAP_SKIP, 4 }, { 1, S390_ORIG_R2_REGNUM, 4 },
89 static const struct regset s390_64_gregset =
91 s390_64_regmap_gregset,
92 regcache_supply_regset,
93 regcache_collect_regset
96 #define S390_PSWM_OFFSET 0
97 #define S390_PSWA_OFFSET 8
100 /* PER-event mask bits and PER control bits (CR9). */
102 #define PER_BIT(n) (1UL << (63 - (n)))
103 #define PER_EVENT_BRANCH PER_BIT (32)
104 #define PER_EVENT_IFETCH PER_BIT (33)
105 #define PER_EVENT_STORE PER_BIT (34)
106 #define PER_EVENT_NULLIFICATION PER_BIT (39)
107 #define PER_CONTROL_BRANCH_ADDRESS PER_BIT (40)
108 #define PER_CONTROL_SUSPENSION PER_BIT (41)
109 #define PER_CONTROL_ALTERATION PER_BIT (42)
111 class s390_linux_nat_target final : public linux_nat_target
114 /* Add our register access methods. */
115 void fetch_registers (struct regcache *, int) override;
116 void store_registers (struct regcache *, int) override;
118 /* Add our watchpoint methods. */
119 int can_use_hw_breakpoint (enum bptype, int, int) override;
120 int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *)
122 int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *)
124 int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
125 bool stopped_by_watchpoint () override;
126 int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
127 struct expression *) override;
128 int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
129 struct expression *) override;
131 /* Detect target architecture. */
132 const struct target_desc *read_description () override;
133 int auxv_parse (gdb_byte **readptr,
134 gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
137 /* Override linux_nat_target low methods. */
138 void low_new_thread (struct lwp_info *lp) override;
139 void low_delete_thread (struct arch_lwp_info *lp) override;
140 void low_prepare_to_resume (struct lwp_info *lp) override;
141 void low_new_fork (struct lwp_info *parent, pid_t child_pid) override;
142 void low_forget_process (pid_t pid) override;
145 static s390_linux_nat_target the_s390_linux_nat_target;
147 /* Fill GDB's register array with the general-purpose register values
150 When debugging a 32-bit executable running under a 64-bit kernel,
151 we have to fix up the 64-bit registers we get from the kernel to
152 make them look like 32-bit registers. */
155 supply_gregset (struct regcache *regcache, const gregset_t *regp)
158 struct gdbarch *gdbarch = regcache->arch ();
159 if (gdbarch_ptr_bit (gdbarch) == 32)
161 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
165 regcache_supply_regset (&s390_64_gregset, regcache, -1,
166 regp, sizeof (gregset_t));
167 pswm = extract_unsigned_integer ((const gdb_byte *) regp
168 + S390_PSWM_OFFSET, 8, byte_order);
169 pswa = extract_unsigned_integer ((const gdb_byte *) regp
170 + S390_PSWA_OFFSET, 8, byte_order);
171 store_unsigned_integer (buf, 4, byte_order, (pswm >> 32) | 0x80000);
172 regcache->raw_supply (S390_PSWM_REGNUM, buf);
173 store_unsigned_integer (buf, 4, byte_order,
174 (pswa & 0x7fffffff) | (pswm & 0x80000000));
175 regcache->raw_supply (S390_PSWA_REGNUM, buf);
180 regcache_supply_regset (&s390_gregset, regcache, -1, regp,
184 /* Fill register REGNO (if it is a general-purpose register) in
185 *REGP with the value in GDB's register array. If REGNO is -1,
186 do this for all registers. */
189 fill_gregset (const struct regcache *regcache, gregset_t *regp, int regno)
192 struct gdbarch *gdbarch = regcache->arch ();
193 if (gdbarch_ptr_bit (gdbarch) == 32)
195 regcache_collect_regset (&s390_64_gregset, regcache, regno,
196 regp, sizeof (gregset_t));
199 || regno == S390_PSWM_REGNUM || regno == S390_PSWA_REGNUM)
201 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
204 gdb_byte *pswm_p = (gdb_byte *) regp + S390_PSWM_OFFSET;
205 gdb_byte *pswa_p = (gdb_byte *) regp + S390_PSWA_OFFSET;
207 pswm = extract_unsigned_integer (pswm_p, 8, byte_order);
209 if (regno == -1 || regno == S390_PSWM_REGNUM)
212 regcache->raw_collect (S390_PSWM_REGNUM, buf);
213 pswm |= (extract_unsigned_integer (buf, 4, byte_order)
217 if (regno == -1 || regno == S390_PSWA_REGNUM)
219 regcache->raw_collect (S390_PSWA_REGNUM, buf);
220 pswa = extract_unsigned_integer (buf, 4, byte_order);
221 pswm ^= (pswm ^ pswa) & 0x80000000;
223 store_unsigned_integer (pswa_p, 8, byte_order, pswa);
226 store_unsigned_integer (pswm_p, 8, byte_order, pswm);
232 regcache_collect_regset (&s390_gregset, regcache, regno, regp,
236 /* Fill GDB's register array with the floating-point register values
239 supply_fpregset (struct regcache *regcache, const fpregset_t *regp)
241 regcache_supply_regset (&s390_fpregset, regcache, -1, regp,
242 sizeof (fpregset_t));
245 /* Fill register REGNO (if it is a general-purpose register) in
246 *REGP with the value in GDB's register array. If REGNO is -1,
247 do this for all registers. */
249 fill_fpregset (const struct regcache *regcache, fpregset_t *regp, int regno)
251 regcache_collect_regset (&s390_fpregset, regcache, regno, regp,
252 sizeof (fpregset_t));
255 /* Find the TID for the current inferior thread to use with ptrace. */
257 s390_inferior_tid (void)
259 /* GNU/Linux LWP ID's are process ID's. */
260 int tid = inferior_ptid.lwp ();
262 tid = inferior_ptid.pid (); /* Not a threaded program. */
267 /* Fetch all general-purpose registers from process/thread TID and
268 store their values in GDB's register cache. */
270 fetch_regs (struct regcache *regcache, int tid)
275 parea.len = sizeof (regs);
276 parea.process_addr = (addr_t) ®s;
277 parea.kernel_addr = offsetof (struct user_regs_struct, psw);
278 if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
279 perror_with_name (_("Couldn't get registers"));
281 supply_gregset (regcache, (const gregset_t *) ®s);
284 /* Store all valid general-purpose registers in GDB's register cache
285 into the process/thread specified by TID. */
287 store_regs (const struct regcache *regcache, int tid, int regnum)
292 parea.len = sizeof (regs);
293 parea.process_addr = (addr_t) ®s;
294 parea.kernel_addr = offsetof (struct user_regs_struct, psw);
295 if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
296 perror_with_name (_("Couldn't get registers"));
298 fill_gregset (regcache, ®s, regnum);
300 if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea, 0) < 0)
301 perror_with_name (_("Couldn't write registers"));
304 /* Fetch all floating-point registers from process/thread TID and store
305 their values in GDB's register cache. */
307 fetch_fpregs (struct regcache *regcache, int tid)
312 parea.len = sizeof (fpregs);
313 parea.process_addr = (addr_t) &fpregs;
314 parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
315 if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
316 perror_with_name (_("Couldn't get floating point status"));
318 supply_fpregset (regcache, (const fpregset_t *) &fpregs);
321 /* Store all valid floating-point registers in GDB's register cache
322 into the process/thread specified by TID. */
324 store_fpregs (const struct regcache *regcache, int tid, int regnum)
329 parea.len = sizeof (fpregs);
330 parea.process_addr = (addr_t) &fpregs;
331 parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
332 if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
333 perror_with_name (_("Couldn't get floating point status"));
335 fill_fpregset (regcache, &fpregs, regnum);
337 if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea, 0) < 0)
338 perror_with_name (_("Couldn't write floating point status"));
341 /* Fetch all registers in the kernel's register set whose number is
342 REGSET_ID, whose size is REGSIZE, and whose layout is described by
343 REGSET, from process/thread TID and store their values in GDB's
346 fetch_regset (struct regcache *regcache, int tid,
347 int regset_id, int regsize, const struct regset *regset)
349 void *buf = alloca (regsize);
353 iov.iov_len = regsize;
355 if (ptrace (PTRACE_GETREGSET, tid, (long) regset_id, (long) &iov) < 0)
357 if (errno == ENODATA)
358 regcache_supply_regset (regset, regcache, -1, NULL, regsize);
360 perror_with_name (_("Couldn't get register set"));
363 regcache_supply_regset (regset, regcache, -1, buf, regsize);
366 /* Store all registers in the kernel's register set whose number is
367 REGSET_ID, whose size is REGSIZE, and whose layout is described by
368 REGSET, from GDB's register cache back to process/thread TID. */
370 store_regset (struct regcache *regcache, int tid,
371 int regset_id, int regsize, const struct regset *regset)
373 void *buf = alloca (regsize);
377 iov.iov_len = regsize;
379 if (ptrace (PTRACE_GETREGSET, tid, (long) regset_id, (long) &iov) < 0)
380 perror_with_name (_("Couldn't get register set"));
382 regcache_collect_regset (regset, regcache, -1, buf, regsize);
384 if (ptrace (PTRACE_SETREGSET, tid, (long) regset_id, (long) &iov) < 0)
385 perror_with_name (_("Couldn't set register set"));
388 /* Check whether the kernel provides a register set with number REGSET
389 of size REGSIZE for process/thread TID. */
391 check_regset (int tid, int regset, int regsize)
393 void *buf = alloca (regsize);
397 iov.iov_len = regsize;
399 if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) >= 0
405 /* Fetch register REGNUM from the child process. If REGNUM is -1, do
406 this for all registers. */
408 s390_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
410 pid_t tid = get_ptrace_pid (regcache->ptid ());
412 if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
413 fetch_regs (regcache, tid);
415 if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
416 fetch_fpregs (regcache, tid);
418 if (have_regset_last_break)
419 if (regnum == -1 || regnum == S390_LAST_BREAK_REGNUM)
420 fetch_regset (regcache, tid, NT_S390_LAST_BREAK, 8,
421 (gdbarch_ptr_bit (regcache->arch ()) == 32
422 ? &s390_last_break_regset : &s390x_last_break_regset));
424 if (have_regset_system_call)
425 if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
426 fetch_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
427 &s390_system_call_regset);
430 if (regnum == -1 || S390_IS_TDBREGSET_REGNUM (regnum))
431 fetch_regset (regcache, tid, NT_S390_TDB, s390_sizeof_tdbregset,
434 if (have_regset_vxrs)
436 if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
437 && regnum <= S390_V15_LOWER_REGNUM))
438 fetch_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
439 &s390_vxrs_low_regset);
440 if (regnum == -1 || (regnum >= S390_V16_REGNUM
441 && regnum <= S390_V31_REGNUM))
442 fetch_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
443 &s390_vxrs_high_regset);
448 if (regnum == -1 || (regnum >= S390_GSD_REGNUM
449 && regnum <= S390_GSEPLA_REGNUM))
450 fetch_regset (regcache, tid, NT_S390_GS_CB, 4 * 8,
452 if (regnum == -1 || (regnum >= S390_BC_GSD_REGNUM
453 && regnum <= S390_BC_GSEPLA_REGNUM))
454 fetch_regset (regcache, tid, NT_S390_GS_BC, 4 * 8,
459 /* Store register REGNUM back into the child process. If REGNUM is
460 -1, do this for all registers. */
462 s390_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
464 pid_t tid = get_ptrace_pid (regcache->ptid ());
466 if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
467 store_regs (regcache, tid, regnum);
469 if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
470 store_fpregs (regcache, tid, regnum);
472 /* S390_LAST_BREAK_REGNUM is read-only. */
474 if (have_regset_system_call)
475 if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
476 store_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
477 &s390_system_call_regset);
479 if (have_regset_vxrs)
481 if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
482 && regnum <= S390_V15_LOWER_REGNUM))
483 store_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
484 &s390_vxrs_low_regset);
485 if (regnum == -1 || (regnum >= S390_V16_REGNUM
486 && regnum <= S390_V31_REGNUM))
487 store_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
488 &s390_vxrs_high_regset);
493 /* Hardware-assisted watchpoint handling. */
495 /* For each process we maintain a list of all currently active
496 watchpoints, in order to properly handle watchpoint removal.
498 The only thing we actually need is the total address space area
499 spanned by the watchpoints. */
501 typedef struct watch_area
507 DEF_VEC_O (s390_watch_area);
509 /* Hardware debug state. */
511 struct s390_debug_reg_state
513 VEC_s390_watch_area *watch_areas;
514 VEC_s390_watch_area *break_areas;
517 /* Per-process data. */
519 struct s390_process_info
521 struct s390_process_info *next;
523 struct s390_debug_reg_state state;
526 static struct s390_process_info *s390_process_list = NULL;
528 /* Find process data for process PID. */
530 static struct s390_process_info *
531 s390_find_process_pid (pid_t pid)
533 struct s390_process_info *proc;
535 for (proc = s390_process_list; proc; proc = proc->next)
536 if (proc->pid == pid)
542 /* Add process data for process PID. Returns newly allocated info
545 static struct s390_process_info *
546 s390_add_process (pid_t pid)
548 struct s390_process_info *proc = XCNEW (struct s390_process_info);
551 proc->next = s390_process_list;
552 s390_process_list = proc;
557 /* Get data specific info for process PID, creating it if necessary.
558 Never returns NULL. */
560 static struct s390_process_info *
561 s390_process_info_get (pid_t pid)
563 struct s390_process_info *proc;
565 proc = s390_find_process_pid (pid);
567 proc = s390_add_process (pid);
572 /* Get hardware debug state for process PID. */
574 static struct s390_debug_reg_state *
575 s390_get_debug_reg_state (pid_t pid)
577 return &s390_process_info_get (pid)->state;
580 /* Called whenever GDB is no longer debugging process PID. It deletes
581 data structures that keep track of hardware debug state. */
584 s390_linux_nat_target::low_forget_process (pid_t pid)
586 struct s390_process_info *proc, **proc_link;
588 proc = s390_process_list;
589 proc_link = &s390_process_list;
593 if (proc->pid == pid)
595 VEC_free (s390_watch_area, proc->state.watch_areas);
596 VEC_free (s390_watch_area, proc->state.break_areas);
597 *proc_link = proc->next;
602 proc_link = &proc->next;
607 /* linux_nat_new_fork hook. */
610 s390_linux_nat_target::low_new_fork (struct lwp_info *parent, pid_t child_pid)
613 struct s390_debug_reg_state *parent_state;
614 struct s390_debug_reg_state *child_state;
616 /* NULL means no watchpoint has ever been set in the parent. In
617 that case, there's nothing to do. */
618 if (lwp_arch_private_info (parent) == NULL)
621 /* GDB core assumes the child inherits the watchpoints/hw breakpoints of
622 the parent. So copy the debug state from parent to child. */
624 parent_pid = parent->ptid.pid ();
625 parent_state = s390_get_debug_reg_state (parent_pid);
626 child_state = s390_get_debug_reg_state (child_pid);
628 child_state->watch_areas = VEC_copy (s390_watch_area,
629 parent_state->watch_areas);
630 child_state->break_areas = VEC_copy (s390_watch_area,
631 parent_state->break_areas);
634 /* Dump PER state. */
637 s390_show_debug_regs (int tid, const char *where)
642 parea.len = sizeof (per_info);
643 parea.process_addr = (addr_t) &per_info;
644 parea.kernel_addr = offsetof (struct user_regs_struct, per_info);
646 if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea, 0) < 0)
647 perror_with_name (_("Couldn't retrieve debug regs"));
649 debug_printf ("PER (debug) state for %d -- %s\n"
650 " cr9-11: %lx %lx %lx\n"
651 " start, end: %lx %lx\n"
652 " code/ATMID: %x address: %lx PAID: %x\n",
655 per_info.control_regs.words.cr[0],
656 per_info.control_regs.words.cr[1],
657 per_info.control_regs.words.cr[2],
658 per_info.starting_addr,
659 per_info.ending_addr,
660 per_info.lowcore.words.perc_atmid,
661 per_info.lowcore.words.address,
662 per_info.lowcore.words.access_id);
666 s390_linux_nat_target::stopped_by_watchpoint ()
668 struct s390_debug_reg_state *state
669 = s390_get_debug_reg_state (inferior_ptid.pid ());
670 per_lowcore_bits per_lowcore;
674 s390_show_debug_regs (s390_inferior_tid (), "stop");
676 /* Speed up common case. */
677 if (VEC_empty (s390_watch_area, state->watch_areas))
680 parea.len = sizeof (per_lowcore);
681 parea.process_addr = (addr_t) & per_lowcore;
682 parea.kernel_addr = offsetof (struct user_regs_struct, per_info.lowcore);
683 if (ptrace (PTRACE_PEEKUSR_AREA, s390_inferior_tid (), &parea, 0) < 0)
684 perror_with_name (_("Couldn't retrieve watchpoint status"));
686 bool result = (per_lowcore.perc_storage_alteration == 1
687 && per_lowcore.perc_store_real_address == 0);
691 /* Do not report this watchpoint again. */
692 memset (&per_lowcore, 0, sizeof (per_lowcore));
693 if (ptrace (PTRACE_POKEUSR_AREA, s390_inferior_tid (), &parea, 0) < 0)
694 perror_with_name (_("Couldn't clear watchpoint status"));
700 /* Each time before resuming a thread, update its PER info. */
703 s390_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp)
706 pid_t pid = ptid_of_lwp (lp).pid ();
711 CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
713 s390_watch_area *area;
714 struct arch_lwp_info *lp_priv = lwp_arch_private_info (lp);
715 struct s390_debug_reg_state *state = s390_get_debug_reg_state (pid);
716 int step = lwp_is_stepping (lp);
718 /* Nothing to do if there was never any PER info for this thread. */
722 /* If PER info has changed, update it. When single-stepping, disable
723 hardware breakpoints (if any). Otherwise we're done. */
724 if (!lp_priv->per_info_changed)
726 if (!step || VEC_empty (s390_watch_area, state->break_areas))
730 lp_priv->per_info_changed = 0;
732 tid = ptid_of_lwp (lp).lwp ();
736 parea.len = sizeof (per_info);
737 parea.process_addr = (addr_t) & per_info;
738 parea.kernel_addr = offsetof (struct user_regs_struct, per_info);
740 /* Clear PER info, but adjust the single_step field (used by older
742 memset (&per_info, 0, sizeof (per_info));
743 per_info.single_step = (step != 0);
745 if (!VEC_empty (s390_watch_area, state->watch_areas))
748 VEC_iterate (s390_watch_area, state->watch_areas, ix, area);
751 watch_lo_addr = std::min (watch_lo_addr, area->lo_addr);
752 watch_hi_addr = std::max (watch_hi_addr, area->hi_addr);
755 /* Enable storage-alteration events. */
756 per_info.control_regs.words.cr[0] |= (PER_EVENT_STORE
757 | PER_CONTROL_ALTERATION);
760 if (!VEC_empty (s390_watch_area, state->break_areas))
762 /* Don't install hardware breakpoints while single-stepping, since
763 our PER settings (e.g. the nullification bit) might then conflict
764 with the kernel's. But re-install them afterwards. */
766 lp_priv->per_info_changed = 1;
770 VEC_iterate (s390_watch_area, state->break_areas, ix, area);
773 watch_lo_addr = std::min (watch_lo_addr, area->lo_addr);
774 watch_hi_addr = std::max (watch_hi_addr, area->hi_addr);
777 /* If there's just one breakpoint, enable instruction-fetching
778 nullification events for the breakpoint address (fast).
779 Otherwise stop after any instruction within the PER area and
780 after any branch into it (slow). */
781 if (watch_hi_addr == watch_lo_addr)
782 per_info.control_regs.words.cr[0] |= (PER_EVENT_NULLIFICATION
786 /* The PER area must include the instruction before the
787 first breakpoint address. */
788 watch_lo_addr = watch_lo_addr > 6 ? watch_lo_addr - 6 : 0;
789 per_info.control_regs.words.cr[0]
792 | PER_CONTROL_BRANCH_ADDRESS);
796 per_info.starting_addr = watch_lo_addr;
797 per_info.ending_addr = watch_hi_addr;
799 if (ptrace (PTRACE_POKEUSR_AREA, tid, &parea, 0) < 0)
800 perror_with_name (_("Couldn't modify watchpoint status"));
803 s390_show_debug_regs (tid, "resume");
806 /* Mark the PER info as changed, so the next resume will update it. */
809 s390_mark_per_info_changed (struct lwp_info *lp)
811 if (lwp_arch_private_info (lp) == NULL)
812 lwp_set_arch_private_info (lp, XCNEW (struct arch_lwp_info));
814 lwp_arch_private_info (lp)->per_info_changed = 1;
817 /* When attaching to a new thread, mark its PER info as changed. */
820 s390_linux_nat_target::low_new_thread (struct lwp_info *lp)
822 s390_mark_per_info_changed (lp);
825 /* Function to call when a thread is being deleted. */
828 s390_linux_nat_target::low_delete_thread (struct arch_lwp_info *arch_lwp)
833 /* Iterator callback for s390_refresh_per_info. */
836 s390_refresh_per_info_cb (struct lwp_info *lp, void *arg)
838 s390_mark_per_info_changed (lp);
840 if (!lwp_is_stopped (lp))
845 /* Make sure that threads are stopped and mark PER info as changed. */
848 s390_refresh_per_info (void)
850 ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
852 iterate_over_lwps (pid_ptid, s390_refresh_per_info_cb, NULL);
857 s390_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
858 enum target_hw_bp_type type,
859 struct expression *cond)
861 s390_watch_area area;
862 struct s390_debug_reg_state *state
863 = s390_get_debug_reg_state (inferior_ptid.pid ());
866 area.hi_addr = addr + len - 1;
867 VEC_safe_push (s390_watch_area, state->watch_areas, &area);
869 return s390_refresh_per_info ();
873 s390_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
874 enum target_hw_bp_type type,
875 struct expression *cond)
878 s390_watch_area *area;
879 struct s390_debug_reg_state *state
880 = s390_get_debug_reg_state (inferior_ptid.pid ());
883 VEC_iterate (s390_watch_area, state->watch_areas, ix, area);
886 if (area->lo_addr == addr && area->hi_addr == addr + len - 1)
888 VEC_unordered_remove (s390_watch_area, state->watch_areas, ix);
889 return s390_refresh_per_info ();
893 fprintf_unfiltered (gdb_stderr,
894 "Attempt to remove nonexistent watchpoint.\n");
898 /* Implement the "can_use_hw_breakpoint" target_ops method. */
901 s390_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
902 int cnt, int othertype)
904 if (type == bp_hardware_watchpoint || type == bp_hardware_breakpoint)
909 /* Implement the "insert_hw_breakpoint" target_ops method. */
912 s390_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
913 struct bp_target_info *bp_tgt)
915 s390_watch_area area;
916 struct s390_debug_reg_state *state;
918 area.lo_addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
919 area.hi_addr = area.lo_addr;
920 state = s390_get_debug_reg_state (inferior_ptid.pid ());
921 VEC_safe_push (s390_watch_area, state->break_areas, &area);
923 return s390_refresh_per_info ();
926 /* Implement the "remove_hw_breakpoint" target_ops method. */
929 s390_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
930 struct bp_target_info *bp_tgt)
933 struct watch_area *area;
934 struct s390_debug_reg_state *state;
936 state = s390_get_debug_reg_state (inferior_ptid.pid ());
938 VEC_iterate (s390_watch_area, state->break_areas, ix, area);
941 if (area->lo_addr == bp_tgt->placed_address)
943 VEC_unordered_remove (s390_watch_area, state->break_areas, ix);
944 return s390_refresh_per_info ();
948 fprintf_unfiltered (gdb_stderr,
949 "Attempt to remove nonexistent breakpoint.\n");
954 s390_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int cnt)
960 s390_target_wordsize (void)
964 /* Check for 64-bit inferior process. This is the case when the host is
965 64-bit, and in addition bit 32 of the PSW mask is set. */
970 pswm = (long) ptrace (PTRACE_PEEKUSER, s390_inferior_tid (), PT_PSWMASK, 0);
971 if (errno == 0 && (pswm & 0x100000000ul) != 0)
979 s390_linux_nat_target::auxv_parse (gdb_byte **readptr,
980 gdb_byte *endptr, CORE_ADDR *typep,
983 int sizeof_auxv_field = s390_target_wordsize ();
984 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
985 gdb_byte *ptr = *readptr;
990 if (endptr - ptr < sizeof_auxv_field * 2)
993 *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
994 ptr += sizeof_auxv_field;
995 *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
996 ptr += sizeof_auxv_field;
1002 const struct target_desc *
1003 s390_linux_nat_target::read_description ()
1005 int tid = s390_inferior_tid ();
1007 have_regset_last_break
1008 = check_regset (tid, NT_S390_LAST_BREAK, 8);
1009 have_regset_system_call
1010 = check_regset (tid, NT_S390_SYSTEM_CALL, 4);
1012 /* If GDB itself is compiled as 64-bit, we are running on a machine in
1013 z/Architecture mode. If the target is running in 64-bit addressing
1014 mode, report s390x architecture. If the target is running in 31-bit
1015 addressing mode, but the kernel supports using 64-bit registers in
1016 that mode, report s390 architecture with 64-bit GPRs. */
1019 CORE_ADDR hwcap = 0;
1021 target_auxv_search (current_top_target (), AT_HWCAP, &hwcap);
1022 have_regset_tdb = (hwcap & HWCAP_S390_TE)
1023 && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
1025 have_regset_vxrs = (hwcap & HWCAP_S390_VX)
1026 && check_regset (tid, NT_S390_VXRS_LOW, 16 * 8)
1027 && check_regset (tid, NT_S390_VXRS_HIGH, 16 * 16);
1029 have_regset_gs = (hwcap & HWCAP_S390_GS)
1030 && check_regset (tid, NT_S390_GS_CB, 4 * 8)
1031 && check_regset (tid, NT_S390_GS_BC, 4 * 8);
1033 if (s390_target_wordsize () == 8)
1034 return (have_regset_gs ? tdesc_s390x_gs_linux64 :
1036 (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
1037 tdesc_s390x_vx_linux64) :
1038 have_regset_tdb ? tdesc_s390x_te_linux64 :
1039 have_regset_system_call ? tdesc_s390x_linux64v2 :
1040 have_regset_last_break ? tdesc_s390x_linux64v1 :
1041 tdesc_s390x_linux64);
1043 if (hwcap & HWCAP_S390_HIGH_GPRS)
1044 return (have_regset_gs ? tdesc_s390_gs_linux64 :
1046 (have_regset_tdb ? tdesc_s390_tevx_linux64 :
1047 tdesc_s390_vx_linux64) :
1048 have_regset_tdb ? tdesc_s390_te_linux64 :
1049 have_regset_system_call ? tdesc_s390_linux64v2 :
1050 have_regset_last_break ? tdesc_s390_linux64v1 :
1051 tdesc_s390_linux64);
1055 /* If GDB itself is compiled as 31-bit, or if we're running a 31-bit inferior
1056 on a 64-bit kernel that does not support using 64-bit registers in 31-bit
1057 mode, report s390 architecture with 32-bit GPRs. */
1058 return (have_regset_system_call? tdesc_s390_linux32v2 :
1059 have_regset_last_break? tdesc_s390_linux32v1 :
1060 tdesc_s390_linux32);
1064 _initialize_s390_nat (void)
1066 /* Register the target. */
1067 linux_target = &the_s390_linux_nat_target;
1068 add_inf_child_target (&the_s390_linux_nat_target);
1070 /* A maintenance command to enable showing the PER state. */
1071 add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
1072 &show_debug_regs, _("\
1073 Set whether to show the PER (debug) hardware state."), _("\
1074 Show whether to show the PER (debug) hardware state."), _("\
1075 Use \"on\" to enable, \"off\" to disable.\n\
1076 If enabled, the PER state is shown after it is changed by GDB,\n\
1077 and when the inferior triggers a breakpoint or watchpoint."),
1080 &maintenance_set_cmdlist,
1081 &maintenance_show_cmdlist);