diff options
Diffstat (limited to 'gdb/s390-linux-tdep.c')
-rw-r--r-- | gdb/s390-linux-tdep.c | 389 |
1 files changed, 164 insertions, 225 deletions
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index 414238a..215ec07 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -61,7 +61,6 @@ #define XML_SYSCALL_FILENAME_S390 "syscalls/s390-linux.xml" #define XML_SYSCALL_FILENAME_S390X "syscalls/s390x-linux.xml" - /* Register handling. */ /* Implement cannot_store_register gdbarch method. */ @@ -96,95 +95,61 @@ s390_write_pc (struct regcache *regcache, CORE_ADDR pc) /* Maps for register sets. */ -static const struct regcache_map_entry s390_gregmap[] = - { - { 1, S390_PSWM_REGNUM }, - { 1, S390_PSWA_REGNUM }, - { 16, S390_R0_REGNUM }, - { 16, S390_A0_REGNUM }, - { 1, S390_ORIG_R2_REGNUM }, - { 0 } - }; - -static const struct regcache_map_entry s390_fpregmap[] = - { - { 1, S390_FPC_REGNUM, 8 }, - { 16, S390_F0_REGNUM, 8 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_upper[] = - { - { 16, S390_R0_UPPER_REGNUM, 4 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_last_break[] = - { - { 1, REGCACHE_MAP_SKIP, 4 }, - { 1, S390_LAST_BREAK_REGNUM, 4 }, - { 0 } - }; - -static const struct regcache_map_entry s390x_regmap_last_break[] = - { - { 1, S390_LAST_BREAK_REGNUM, 8 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_system_call[] = - { - { 1, S390_SYSTEM_CALL_REGNUM, 4 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_tdb[] = - { - { 1, S390_TDB_DWORD0_REGNUM, 8 }, - { 1, S390_TDB_ABORT_CODE_REGNUM, 8 }, - { 1, S390_TDB_CONFLICT_TOKEN_REGNUM, 8 }, - { 1, S390_TDB_ATIA_REGNUM, 8 }, - { 12, REGCACHE_MAP_SKIP, 8 }, - { 16, S390_TDB_R0_REGNUM, 8 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_vxrs_low[] = - { - { 16, S390_V0_LOWER_REGNUM, 8 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_vxrs_high[] = - { - { 16, S390_V16_REGNUM, 16 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_gs[] = - { - { 1, REGCACHE_MAP_SKIP, 8 }, - { 1, S390_GSD_REGNUM, 8 }, - { 1, S390_GSSM_REGNUM, 8 }, - { 1, S390_GSEPLA_REGNUM, 8 }, - { 0 } - }; - -static const struct regcache_map_entry s390_regmap_gsbc[] = - { - { 1, REGCACHE_MAP_SKIP, 8 }, - { 1, S390_BC_GSD_REGNUM, 8 }, - { 1, S390_BC_GSSM_REGNUM, 8 }, - { 1, S390_BC_GSEPLA_REGNUM, 8 }, - { 0 } - }; +static const struct regcache_map_entry s390_gregmap[] + = { { 1, S390_PSWM_REGNUM }, { 1, S390_PSWA_REGNUM }, + { 16, S390_R0_REGNUM }, { 16, S390_A0_REGNUM }, + { 1, S390_ORIG_R2_REGNUM }, { 0 } }; + +static const struct regcache_map_entry s390_fpregmap[] + = { { 1, S390_FPC_REGNUM, 8 }, { 16, S390_F0_REGNUM, 8 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_upper[] + = { { 16, S390_R0_UPPER_REGNUM, 4 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_last_break[] + = { { 1, REGCACHE_MAP_SKIP, 4 }, { 1, S390_LAST_BREAK_REGNUM, 4 }, { 0 } }; + +static const struct regcache_map_entry s390x_regmap_last_break[] + = { { 1, S390_LAST_BREAK_REGNUM, 8 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_system_call[] + = { { 1, S390_SYSTEM_CALL_REGNUM, 4 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_tdb[] + = { { 1, S390_TDB_DWORD0_REGNUM, 8 }, + { 1, S390_TDB_ABORT_CODE_REGNUM, 8 }, + { 1, S390_TDB_CONFLICT_TOKEN_REGNUM, 8 }, + { 1, S390_TDB_ATIA_REGNUM, 8 }, + { 12, REGCACHE_MAP_SKIP, 8 }, + { 16, S390_TDB_R0_REGNUM, 8 }, + { 0 } }; + +static const struct regcache_map_entry s390_regmap_vxrs_low[] + = { { 16, S390_V0_LOWER_REGNUM, 8 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_vxrs_high[] + = { { 16, S390_V16_REGNUM, 16 }, { 0 } }; + +static const struct regcache_map_entry s390_regmap_gs[] + = { { 1, REGCACHE_MAP_SKIP, 8 }, + { 1, S390_GSD_REGNUM, 8 }, + { 1, S390_GSSM_REGNUM, 8 }, + { 1, S390_GSEPLA_REGNUM, 8 }, + { 0 } }; + +static const struct regcache_map_entry s390_regmap_gsbc[] + = { { 1, REGCACHE_MAP_SKIP, 8 }, + { 1, S390_BC_GSD_REGNUM, 8 }, + { 1, S390_BC_GSSM_REGNUM, 8 }, + { 1, S390_BC_GSEPLA_REGNUM, 8 }, + { 0 } }; /* Supply the TDB regset. Like regcache_supply_regset, but invalidate the TDB registers unless the TDB format field is valid. */ static void s390_supply_tdb_regset (const struct regset *regset, struct regcache *regcache, - int regnum, const void *regs, size_t len) + int regnum, const void *regs, size_t len) { ULONGEST tdw; enum register_status ret; @@ -195,71 +160,41 @@ s390_supply_tdb_regset (const struct regset *regset, struct regcache *regcache, regcache_supply_regset (regset, regcache, regnum, NULL, len); } -const struct regset s390_gregset = { - s390_gregmap, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_gregset + = { s390_gregmap, regcache_supply_regset, regcache_collect_regset }; -const struct regset s390_fpregset = { - s390_fpregmap, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_fpregset + = { s390_fpregmap, regcache_supply_regset, regcache_collect_regset }; -static const struct regset s390_upper_regset = { - s390_regmap_upper, - regcache_supply_regset, - regcache_collect_regset -}; +static const struct regset s390_upper_regset + = { s390_regmap_upper, regcache_supply_regset, regcache_collect_regset }; -const struct regset s390_last_break_regset = { - s390_regmap_last_break, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_last_break_regset + = { s390_regmap_last_break, regcache_supply_regset, + regcache_collect_regset }; -const struct regset s390x_last_break_regset = { - s390x_regmap_last_break, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390x_last_break_regset + = { s390x_regmap_last_break, regcache_supply_regset, + regcache_collect_regset }; -const struct regset s390_system_call_regset = { - s390_regmap_system_call, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_system_call_regset + = { s390_regmap_system_call, regcache_supply_regset, + regcache_collect_regset }; -const struct regset s390_tdb_regset = { - s390_regmap_tdb, - s390_supply_tdb_regset, - regcache_collect_regset -}; +const struct regset s390_tdb_regset + = { s390_regmap_tdb, s390_supply_tdb_regset, regcache_collect_regset }; -const struct regset s390_vxrs_low_regset = { - s390_regmap_vxrs_low, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_vxrs_low_regset + = { s390_regmap_vxrs_low, regcache_supply_regset, regcache_collect_regset }; -const struct regset s390_vxrs_high_regset = { - s390_regmap_vxrs_high, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_vxrs_high_regset + = { s390_regmap_vxrs_high, regcache_supply_regset, regcache_collect_regset }; -const struct regset s390_gs_regset = { - s390_regmap_gs, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_gs_regset + = { s390_regmap_gs, regcache_supply_regset, regcache_collect_regset }; -const struct regset s390_gsbc_regset = { - s390_regmap_gsbc, - regcache_supply_regset, - regcache_collect_regset -}; +const struct regset s390_gsbc_regset + = { s390_regmap_gsbc, regcache_supply_regset, regcache_collect_regset }; /* Iterate over supported core file register note sections. */ @@ -270,12 +205,13 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch, const struct regcache *regcache) { s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch); - const int gregset_size = (tdep->abi == ABI_LINUX_S390 ? - s390_sizeof_gregset : s390x_sizeof_gregset); + const int gregset_size + = (tdep->abi == ABI_LINUX_S390 ? s390_sizeof_gregset + : s390x_sizeof_gregset); cb (".reg", gregset_size, gregset_size, &s390_gregset, NULL, cb_data); - cb (".reg2", s390_sizeof_fpregset, s390_sizeof_fpregset, &s390_fpregset, NULL, - cb_data); + cb (".reg2", s390_sizeof_fpregset, s390_sizeof_fpregset, &s390_fpregset, + NULL, cb_data); if (tdep->abi == ABI_LINUX_S390 && tdep->gpr_full_regnum != -1) cb (".reg-s390-high-gprs", 16 * 4, 16 * 4, &s390_upper_regset, @@ -283,8 +219,8 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch, if (tdep->have_linux_v1) cb (".reg-s390-last-break", 8, 8, - (gdbarch_ptr_bit (gdbarch) == 32 - ? &s390_last_break_regset : &s390x_last_break_regset), + (gdbarch_ptr_bit (gdbarch) == 32 ? &s390_last_break_regset + : &s390x_last_break_regset), "s390 last-break address", cb_data); if (tdep->have_linux_v2) @@ -328,8 +264,8 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch, /* Implement core_read_description gdbarch method. */ static const struct target_desc * -s390_core_read_description (struct gdbarch *gdbarch, - struct target_ops *target, bfd *abfd) +s390_core_read_description (struct gdbarch *gdbarch, struct target_ops *target, + bfd *abfd) { asection *section = bfd_get_section_by_name (abfd, ".reg"); gdb::optional<gdb::byte_vector> auxv = target_read_auxv_raw (target); @@ -339,8 +275,7 @@ s390_core_read_description (struct gdbarch *gdbarch, if (!section) return NULL; - high_gprs = (bfd_get_section_by_name (abfd, ".reg-s390-high-gprs") - != NULL); + high_gprs = (bfd_get_section_by_name (abfd, ".reg-s390-high-gprs") != NULL); v1 = (bfd_get_section_by_name (abfd, ".reg-s390-last-break") != NULL); v2 = (bfd_get_section_by_name (abfd, ".reg-s390-system-call") != NULL); vx = (hwcap & HWCAP_S390_VX); @@ -351,23 +286,26 @@ s390_core_read_description (struct gdbarch *gdbarch, { case s390_sizeof_gregset: if (high_gprs) - return (gs ? tdesc_s390_gs_linux64 : - te && vx ? tdesc_s390_tevx_linux64 : - vx ? tdesc_s390_vx_linux64 : - te ? tdesc_s390_te_linux64 : - v2 ? tdesc_s390_linux64v2 : - v1 ? tdesc_s390_linux64v1 : tdesc_s390_linux64); + return (gs ? tdesc_s390_gs_linux64 + : te && vx ? tdesc_s390_tevx_linux64 + : vx ? tdesc_s390_vx_linux64 + : te ? tdesc_s390_te_linux64 + : v2 ? tdesc_s390_linux64v2 + : v1 ? tdesc_s390_linux64v1 + : tdesc_s390_linux64); else - return (v2 ? tdesc_s390_linux32v2 : - v1 ? tdesc_s390_linux32v1 : tdesc_s390_linux32); + return (v2 ? tdesc_s390_linux32v2 + : v1 ? tdesc_s390_linux32v1 + : tdesc_s390_linux32); case s390x_sizeof_gregset: - return (gs ? tdesc_s390x_gs_linux64 : - te && vx ? tdesc_s390x_tevx_linux64 : - vx ? tdesc_s390x_vx_linux64 : - te ? tdesc_s390x_te_linux64 : - v2 ? tdesc_s390x_linux64v2 : - v1 ? tdesc_s390x_linux64v1 : tdesc_s390x_linux64); + return (gs ? tdesc_s390x_gs_linux64 + : te && vx ? tdesc_s390x_tevx_linux64 + : vx ? tdesc_s390x_vx_linux64 + : te ? tdesc_s390x_te_linux64 + : v2 ? tdesc_s390x_linux64v2 + : v1 ? tdesc_s390x_linux64v1 + : tdesc_s390x_linux64); default: return NULL; @@ -378,7 +316,8 @@ s390_core_read_description (struct gdbarch *gdbarch, /* Signal trampoline stack frames. */ -struct s390_sigtramp_unwind_cache { +struct s390_sigtramp_unwind_cache +{ CORE_ADDR frame_base; trad_frame_saved_reg *saved_regs; }; @@ -408,7 +347,7 @@ s390_sigtramp_frame_unwind_cache (frame_info_ptr this_frame, this_sp = get_frame_register_unsigned (this_frame, S390_SP_REGNUM); next_ra = get_frame_pc (this_frame); - next_cfa = this_sp + 16*word_size + 32; + next_cfa = this_sp + 16 * word_size + 32; /* New-style RT frame: retcode + alignment (8 bytes) @@ -416,7 +355,7 @@ s390_sigtramp_frame_unwind_cache (frame_info_ptr this_frame, ucontext (contains sigregs at offset 5 words). */ if (next_ra == next_cfa) { - sigreg_ptr = next_cfa + 8 + 128 + align_up (5*word_size, 8); + sigreg_ptr = next_cfa + 8 + 128 + align_up (5 * word_size, 8); /* sigregs are followed by uc_sigmask (8 bytes), then by the upper GPR halves if present. */ sigreg_high_off = 8; @@ -427,8 +366,8 @@ s390_sigtramp_frame_unwind_cache (frame_info_ptr this_frame, pointer to sigregs. */ else { - sigreg_ptr = read_memory_unsigned_integer (next_cfa + 8, - word_size, byte_order); + sigreg_ptr + = read_memory_unsigned_integer (next_cfa + 8, word_size, byte_order); /* sigregs are followed by signo (4 bytes), then by the upper GPR halves if present. */ sigreg_high_off = 4; @@ -484,12 +423,12 @@ s390_sigtramp_frame_unwind_cache (frame_info_ptr this_frame, } /* Restore the previous frame's SP. */ - prev_sp = read_memory_unsigned_integer ( - info->saved_regs[S390_SP_REGNUM].addr (), - word_size, byte_order); + prev_sp + = read_memory_unsigned_integer (info->saved_regs[S390_SP_REGNUM].addr (), + word_size, byte_order); /* Determine our frame base. */ - info->frame_base = prev_sp + 16*word_size + 32; + info->frame_base = prev_sp + 16 * word_size + 32; return info; } @@ -542,15 +481,14 @@ s390_sigtramp_frame_sniffer (const struct frame_unwind *self, /* S390 sigtramp frame unwinder. */ -static const struct frame_unwind s390_sigtramp_frame_unwind = { - "s390 linux sigtramp", - SIGTRAMP_FRAME, - default_frame_unwind_stop_reason, - s390_sigtramp_frame_this_id, - s390_sigtramp_frame_prev_register, - NULL, - s390_sigtramp_frame_sniffer -}; +static const struct frame_unwind s390_sigtramp_frame_unwind + = { "s390 linux sigtramp", + SIGTRAMP_FRAME, + default_frame_unwind_stop_reason, + s390_sigtramp_frame_this_id, + s390_sigtramp_frame_prev_register, + NULL, + s390_sigtramp_frame_sniffer }; /* Syscall handling. */ @@ -558,8 +496,7 @@ static const struct frame_unwind s390_sigtramp_frame_unwind = { upon error. */ static LONGEST -s390_linux_get_syscall_number (struct gdbarch *gdbarch, - thread_info *thread) +s390_linux_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread) { struct regcache *regs = get_thread_regcache (thread); s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch); @@ -576,8 +513,8 @@ s390_linux_get_syscall_number (struct gdbarch *gdbarch, if (opcode != op_svc) return -1; - svc_number = read_memory_unsigned_integer ((CORE_ADDR) pc + 1, 1, - byte_order); + svc_number + = read_memory_unsigned_integer ((CORE_ADDR) pc + 1, 1, byte_order); if (svc_number == 0) regcache_cooked_read_unsigned (regs, S390_R1_REGNUM, &svc_number); @@ -611,7 +548,8 @@ s390_all_but_pc_registers_record (struct regcache *regcache) return -1; if (tdep->v0_full_regnum != -1) { - if (record_full_arch_list_add_reg (regcache, S390_V0_LOWER_REGNUM + i)) + if (record_full_arch_list_add_reg (regcache, + S390_V0_LOWER_REGNUM + i)) return -1; if (record_full_arch_list_add_reg (regcache, S390_V16_REGNUM + i)) return -1; @@ -640,21 +578,21 @@ s390_canonicalize_syscall (int syscall, enum s390_abi_kind abi) case 7: return gdb_sys_restart_syscall; /* These syscalls work only on 31-bit. */ - case 13: /* time */ - case 16: /* lchown[16] */ - case 23: /* setuid[16] */ - case 24: /* getuid[16] */ - case 25: /* stime */ - case 46: /* setgid[16] */ - case 47: /* getgid[16] */ - case 49: /* seteuid[16] */ - case 50: /* getegid[16] */ - case 70: /* setreuid[16] */ - case 71: /* setregid[16] */ - case 76: /* [old_]getrlimit */ - case 80: /* getgroups[16] */ - case 81: /* setgroups[16] */ - case 95: /* fchown[16] */ + case 13: /* time */ + case 16: /* lchown[16] */ + case 23: /* setuid[16] */ + case 24: /* getuid[16] */ + case 25: /* stime */ + case 46: /* setgid[16] */ + case 47: /* getgid[16] */ + case 49: /* seteuid[16] */ + case 50: /* getegid[16] */ + case 70: /* setreuid[16] */ + case 71: /* setregid[16] */ + case 76: /* [old_]getrlimit */ + case 80: /* getgroups[16] */ + case 81: /* setgroups[16] */ + case 95: /* fchown[16] */ case 101: /* ioperm */ case 138: /* setfsuid[16] */ case 139: /* setfsgid[16] */ @@ -675,22 +613,22 @@ s390_canonicalize_syscall (int syscall, enum s390_abi_kind abi) return (enum gdb_syscall) syscall; return gdb_sys_no_syscall; /* These syscalls don't exist on s390. */ - case 17: /* break */ - case 18: /* oldstat */ - case 28: /* oldfstat */ - case 31: /* stty */ - case 32: /* gtty */ - case 35: /* ftime */ - case 44: /* prof */ - case 53: /* lock */ - case 56: /* mpx */ - case 58: /* ulimit */ - case 59: /* oldolduname */ - case 68: /* sgetmask */ - case 69: /* ssetmask */ - case 82: /* [old_]select */ - case 84: /* oldlstat */ - case 98: /* profil */ + case 17: /* break */ + case 18: /* oldstat */ + case 28: /* oldfstat */ + case 31: /* stty */ + case 32: /* gtty */ + case 35: /* ftime */ + case 44: /* prof */ + case 53: /* lock */ + case 56: /* mpx */ + case 58: /* ulimit */ + case 59: /* oldolduname */ + case 68: /* sgetmask */ + case 69: /* ssetmask */ + case 82: /* [old_]select */ + case 84: /* oldlstat */ + case 98: /* profil */ case 109: /* olduname */ case 113: /* vm86old */ case 123: /* modify_ldt */ @@ -819,14 +757,13 @@ s390_linux_syscall_record (struct regcache *regcache, LONGEST syscall_native) if (syscall_gdb < 0) { gdb_printf (gdb_stderr, - _("Process record and replay target doesn't " - "support syscall number %s\n"), + _ ("Process record and replay target doesn't " + "support syscall number %s\n"), plongest (syscall_native)); return -1; } - if (syscall_gdb == gdb_sys_sigreturn - || syscall_gdb == gdb_sys_rt_sigreturn) + if (syscall_gdb == gdb_sys_sigreturn || syscall_gdb == gdb_sys_rt_sigreturn) { if (s390_all_but_pc_registers_record (regcache)) return -1; @@ -859,8 +796,9 @@ s390_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch); /* There are two kinds of signal frames on s390. rt_sigframe is always the larger one, so don't even bother with sigframe. */ - const int sizeof_rt_sigframe = (tdep->abi == ABI_LINUX_ZSERIES ? - 160 + 8 + 128 + 1024 : 96 + 8 + 128 + 1000); + const int sizeof_rt_sigframe + = (tdep->abi == ABI_LINUX_ZSERIES ? 160 + 8 + 128 + 1024 + : 96 + 8 + 128 + 1000); ULONGEST sp; int i; @@ -949,7 +887,7 @@ s390_init_linux_record_tdep (struct linux_record_tdep *record_tdep, /* stat64 unused */ record_tdep->size_gid_t = 4; record_tdep->size_uid_t = 4; - record_tdep->size_PAGE_SIZE = 0x1000; /* 4KB */ + record_tdep->size_PAGE_SIZE = 0x1000; /* 4KB */ record_tdep->size_flock64 = 32; record_tdep->size_io_event = 32; record_tdep->size_iocb = 64; @@ -1016,7 +954,7 @@ s390_init_linux_record_tdep (struct linux_record_tdep *record_tdep, record_tdep->size_stat64 = 104; record_tdep->size_gid_t = 4; record_tdep->size_uid_t = 4; - record_tdep->size_PAGE_SIZE = 0x1000; /* 4KB */ + record_tdep->size_PAGE_SIZE = 0x1000; /* 4KB */ record_tdep->size_flock64 = 32; record_tdep->size_io_event = 32; record_tdep->size_iocb = 64; @@ -1183,6 +1121,7 @@ s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch) } void _initialize_s390_linux_tdep (); + void _initialize_s390_linux_tdep () { |