36#include "elf/common.h"
38#include <asm/ptrace.h>
41#include <sys/procfs.h>
42#include <sys/ucontext.h>
91static const struct regset s390_64_gregset =
93 s390_64_regmap_gregset,
98#define S390_PSWM_OFFSET 0
99#define S390_PSWA_OFFSET 8
104#define PER_BIT(n) (1UL << (63 - (n)))
105#define PER_EVENT_BRANCH PER_BIT (32)
106#define PER_EVENT_IFETCH PER_BIT (33)
107#define PER_EVENT_STORE PER_BIT (34)
108#define PER_EVENT_NULLIFICATION PER_BIT (39)
109#define PER_CONTROL_BRANCH_ADDRESS PER_BIT (40)
110#define PER_CONTROL_SUSPENSION PER_BIT (41)
111#define PER_CONTROL_ALTERATION PER_BIT (42)
136 const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
168 regp,
sizeof (gregset_t));
170 + S390_PSWM_OFFSET, 8, byte_order);
172 + S390_PSWA_OFFSET, 8, byte_order);
176 (pswa & 0x7fffffff) | (pswm & 0x80000000));
198 regp,
sizeof (gregset_t));
206 gdb_byte *pswm_p = (gdb_byte *) regp + S390_PSWM_OFFSET;
207 gdb_byte *pswa_p = (gdb_byte *) regp + S390_PSWA_OFFSET;
223 pswm ^= (pswm ^ pswa) & 0x80000000;
244 sizeof (fpregset_t));
254 sizeof (fpregset_t));
277 parea.len =
sizeof (regs);
278 parea.process_addr = (addr_t) ®s;
279 parea.kernel_addr = offsetof (
struct user_regs_struct, psw);
280 if (
ptrace (PTRACE_PEEKUSR_AREA, tid, (
long) &parea, 0) < 0)
281 perror_with_name (_(
"Couldn't get registers"));
294 parea.len =
sizeof (regs);
295 parea.process_addr = (addr_t) ®s;
296 parea.kernel_addr = offsetof (
struct user_regs_struct, psw);
297 if (
ptrace (PTRACE_PEEKUSR_AREA, tid, (
long) &parea, 0) < 0)
298 perror_with_name (_(
"Couldn't get registers"));
302 if (
ptrace (PTRACE_POKEUSR_AREA, tid, (
long) &parea, 0) < 0)
303 perror_with_name (_(
"Couldn't write registers"));
314 parea.len =
sizeof (fpregs);
315 parea.process_addr = (addr_t) &fpregs;
316 parea.kernel_addr = offsetof (
struct user_regs_struct, fp_regs);
317 if (
ptrace (PTRACE_PEEKUSR_AREA, tid, (
long) &parea, 0) < 0)
318 perror_with_name (_(
"Couldn't get floating point status"));
331 parea.len =
sizeof (fpregs);
332 parea.process_addr = (addr_t) &fpregs;
333 parea.kernel_addr = offsetof (
struct user_regs_struct, fp_regs);
334 if (
ptrace (PTRACE_PEEKUSR_AREA, tid, (
long) &parea, 0) < 0)
335 perror_with_name (_(
"Couldn't get floating point status"));
339 if (
ptrace (PTRACE_POKEUSR_AREA, tid, (
long) &parea, 0) < 0)
340 perror_with_name (_(
"Couldn't write floating point status"));
349 int regset_id,
int regsize,
const struct regset *
regset)
351 void *buf = alloca (regsize);
355 iov.iov_len = regsize;
359 if (errno == ENODATA)
362 perror_with_name (_(
"Couldn't get register set"));
373 int regset_id,
int regsize,
const struct regset *
regset)
375 void *buf = alloca (regsize);
379 iov.iov_len = regsize;
382 perror_with_name (_(
"Couldn't get register set"));
387 perror_with_name (_(
"Couldn't set register set"));
395 void *buf = alloca (regsize);
399 iov.iov_len = regsize;
622 parent_pid = parent->
ptid.pid ();
638 parea.len =
sizeof (per_info);
639 parea.process_addr = (addr_t) &per_info;
640 parea.kernel_addr = offsetof (
struct user_regs_struct, per_info);
642 if (
ptrace (PTRACE_PEEKUSR_AREA, tid, &parea, 0) < 0)
643 perror_with_name (_(
"Couldn't retrieve debug regs"));
645 debug_printf (
"PER (debug) state for %d -- %s\n"
646 " cr9-11: %lx %lx %lx\n"
647 " start, end: %lx %lx\n"
648 " code/ATMID: %x address: %lx PAID: %x\n",
651 per_info.control_regs.words.cr[0],
652 per_info.control_regs.words.cr[1],
653 per_info.control_regs.words.cr[2],
654 per_info.starting_addr,
655 per_info.ending_addr,
656 per_info.lowcore.words.perc_atmid,
657 per_info.lowcore.words.address,
658 per_info.lowcore.words.access_id);
666 per_lowcore_bits per_lowcore;
679 if (siginfo.si_signo != SIGTRAP
683 parea.len =
sizeof (per_lowcore);
684 parea.process_addr = (addr_t) & per_lowcore;
685 parea.kernel_addr = offsetof (
struct user_regs_struct, per_info.lowcore);
687 perror_with_name (_(
"Couldn't retrieve watchpoint status"));
689 bool result = (per_lowcore.perc_storage_alteration == 1
690 && per_lowcore.perc_store_real_address == 0);
706 CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
729 parea.len =
sizeof (per_info);
730 parea.process_addr = (addr_t) & per_info;
731 parea.kernel_addr = offsetof (
struct user_regs_struct, per_info);
735 memset (&per_info, 0,
sizeof (per_info));
736 per_info.single_step = (step != 0);
742 watch_lo_addr = std::min (watch_lo_addr, area.lo_addr);
743 watch_hi_addr = std::max (watch_hi_addr, area.hi_addr);
762 watch_lo_addr = std::min (watch_lo_addr, area.lo_addr);
763 watch_hi_addr = std::max (watch_hi_addr, area.hi_addr);
770 if (watch_hi_addr == watch_lo_addr)
777 watch_lo_addr = watch_lo_addr > 6 ? watch_lo_addr - 6 : 0;
778 per_info.control_regs.words.cr[0]
785 per_info.starting_addr = watch_lo_addr;
786 per_info.ending_addr = watch_hi_addr;
788 if (
ptrace (PTRACE_POKEUSR_AREA, tid, &parea, 0) < 0)
789 perror_with_name (_(
"Couldn't modify watchpoint status"));
847 enum target_hw_bp_type
type,
863 enum target_hw_bp_type
type,
870 for (ix = 0; ix < state->
watch_areas.size (); ix++)
881 "Attempt to remove nonexistent watchpoint.\n");
889 int cnt,
int othertype)
934 "Attempt to remove nonexistent breakpoint.\n");
956 if (errno == 0 && (pswm & 0x100000000ul) != 0)
965 const gdb_byte *endptr, CORE_ADDR *typep,
970 const gdb_byte *ptr = *readptr;
975 if (endptr - ptr < sizeof_auxv_field * 2)
979 ptr += sizeof_auxv_field;
981 ptr += sizeof_auxv_field;
1060 &show_debug_regs, _(
"\
1061Set whether to show the PER (debug) hardware state."), _(
"\
1062Show whether to show the PER (debug) hardware state."), _(
"\
1063Use \"on\" to enable, \"off\" to disable.\n\
1064If enabled, the PER state is shown after it is changed by GDB,\n\
1065and when the inferior triggers a breakpoint or watchpoint."),
struct gdbarch * target_gdbarch(void)
void raw_collect(int regnum, void *buf) const override
void raw_supply(int regnum, const void *buf) override
void low_new_fork(struct lwp_info *parent, pid_t child_pid) override
int remove_hw_breakpoint(struct gdbarch *, struct bp_target_info *) override
void store_registers(struct regcache *, int) override
void fetch_registers(struct regcache *, int) override
int insert_watchpoint(CORE_ADDR, int, enum target_hw_bp_type, struct expression *) override
int can_use_hw_breakpoint(enum bptype, int, int) override
void low_prepare_to_resume(struct lwp_info *lp) override
int insert_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 remove_watchpoint(CORE_ADDR, int, enum target_hw_bp_type, struct expression *) override
const struct target_desc * read_description() override
void low_delete_thread(struct arch_lwp_info *lp) override
void low_new_thread(struct lwp_info *lp) override
void low_forget_process(pid_t pid) override
int auxv_parse(const gdb_byte **readptr, const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) override
struct cmd_list_element * maintenance_show_cmdlist
struct cmd_list_element * maintenance_set_cmdlist
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
static ULONGEST extract_unsigned_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
#define ptrace(request, pid, addr, data)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
void add_inf_child_target(inf_child_target *target)
pid_t get_ptrace_pid(ptid_t ptid)
ptid_t ptid_of_lwp(struct lwp_info *lwp)
void linux_stop_lwp(struct lwp_info *lwp)
bool linux_nat_get_siginfo(ptid_t ptid, siginfo_t *siginfo)
ptid_t current_lwp_ptid(void)
void lwp_set_arch_private_info(struct lwp_info *lwp, struct arch_lwp_info *info)
struct arch_lwp_info * lwp_arch_private_info(struct lwp_info *lwp)
struct lwp_info * iterate_over_lwps(ptid_t filter, gdb::function_view< iterate_over_lwps_ftype > callback)
struct linux_nat_target * linux_target
int lwp_is_stepping(struct lwp_info *lwp)
int lwp_is_stopped(struct lwp_info *lwp)
CORE_ADDR linux_get_hwcap()
void regcache_collect_regset(const struct regset *regset, const struct regcache *regcache, int regnum, void *buf, size_t size)
void regcache_supply_regset(const struct regset *regset, struct regcache *regcache, int regnum, const void *buf, size_t size)
const struct target_desc * tdesc_s390_gs_linux64
static void store_regs(const struct regcache *regcache, int tid, int regnum)
void supply_fpregset(struct regcache *regcache, const fpregset_t *regp)
#define PER_EVENT_NULLIFICATION
#define PER_CONTROL_ALTERATION
static int have_regset_vxrs
static void fetch_fpregs(struct regcache *regcache, int tid)
static struct s390_process_info * s390_process_list
static void fetch_regs(struct regcache *regcache, int tid)
static struct s390_process_info * s390_find_process_pid(pid_t pid)
void fill_fpregset(const struct regcache *regcache, fpregset_t *regp, int regno)
static void s390_mark_per_info_changed(struct lwp_info *lp)
static int have_regset_gs
void _initialize_s390_nat()
static int s390_inferior_tid(void)
static void store_fpregs(const struct regcache *regcache, int tid, int regnum)
static int have_regset_tdb
static int s390_target_wordsize(void)
static void store_regset(struct regcache *regcache, int tid, int regset_id, int regsize, const struct regset *regset)
static s390_linux_nat_target the_s390_linux_nat_target
static int have_regset_last_break
#define PER_CONTROL_BRANCH_ADDRESS
static void s390_show_debug_regs(int tid, const char *where)
static struct s390_process_info * s390_add_process(pid_t pid)
void fill_gregset(const struct regcache *regcache, gregset_t *regp, int regno)
static struct s390_debug_reg_state * s390_get_debug_reg_state(pid_t pid)
static void fetch_regset(struct regcache *regcache, int tid, int regset_id, int regsize, const struct regset *regset)
static int s390_refresh_per_info(void)
static int s390_refresh_per_info_cb(struct lwp_info *lp)
void supply_gregset(struct regcache *regcache, const gregset_t *regp)
static int have_regset_system_call
static int check_regset(int tid, int regset, int regsize)
static struct s390_process_info * s390_process_info_get(pid_t pid)
const struct regset s390_gs_regset
const struct regset s390_last_break_regset
const struct regset s390_tdb_regset
const struct regset s390x_last_break_regset
const struct regset s390_vxrs_high_regset
const struct regset s390_system_call_regset
const struct regset s390_gsbc_regset
const struct regset s390_vxrs_low_regset
const struct regset s390_fpregset
const struct regset s390_gregset
#define S390_IS_TDBREGSET_REGNUM(i)
#define S390_IS_FPREGSET_REGNUM(i)
#define s390_sizeof_tdbregset
#define S390_IS_GREGSET_REGNUM(i)
const struct target_desc * tdesc_s390_linux32
const struct target_desc * tdesc_s390_linux32v1
const struct target_desc * tdesc_s390_linux32v2
const struct target_desc * tdesc_s390_linux64
const struct target_desc * tdesc_s390_linux64v1
const struct target_desc * tdesc_s390_linux64v2
#define S390_BC_GSD_REGNUM
#define S390_R4_UPPER_REGNUM
#define S390_R5_UPPER_REGNUM
#define S390_LAST_BREAK_REGNUM
#define S390_R1_UPPER_REGNUM
#define S390_R0_UPPER_REGNUM
#define S390_R2_UPPER_REGNUM
#define S390_R7_UPPER_REGNUM
#define S390_GSEPLA_REGNUM
#define S390_R15_UPPER_REGNUM
#define S390_R12_UPPER_REGNUM
#define S390_R10_UPPER_REGNUM
#define S390_V15_LOWER_REGNUM
#define HWCAP_S390_HIGH_GPRS
#define S390_BC_GSEPLA_REGNUM
#define S390_R9_UPPER_REGNUM
#define S390_SYSTEM_CALL_REGNUM
#define S390_R8_UPPER_REGNUM
#define S390_R13_UPPER_REGNUM
#define S390_V0_LOWER_REGNUM
#define S390_R14_UPPER_REGNUM
#define S390_R11_UPPER_REGNUM
#define S390_ORIG_R2_REGNUM
#define S390_R3_UPPER_REGNUM
#define S390_R6_UPPER_REGNUM
const struct target_desc * tdesc_s390_te_linux64
const struct target_desc * tdesc_s390_tevx_linux64
const struct target_desc * tdesc_s390_vx_linux64
const struct target_desc * tdesc_s390x_gs_linux64
const struct target_desc * tdesc_s390x_linux64
const struct target_desc * tdesc_s390x_linux64v1
const struct target_desc * tdesc_s390x_linux64v2
const struct target_desc * tdesc_s390x_te_linux64
const struct target_desc * tdesc_s390x_tevx_linux64
const struct target_desc * tdesc_s390x_vx_linux64
std::vector< watch_area > watch_areas
std::vector< watch_area > break_areas
struct s390_debug_reg_state state
target_ops * beneath() const
virtual const struct target_desc * read_description() TARGET_DEFAULT_RETURN(NULL)
void gdb_printf(struct ui_file *stream, const char *format,...)