From patchwork Fri Dec 8 11:04:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Rudo X-Patchwork-Id: 24821 Received: (qmail 8707 invoked by alias); 8 Dec 2017 11:04:59 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 8644 invoked by uid 89); 8 Dec 2017 11:04:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy= X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 08 Dec 2017 11:04:56 +0000 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vB8B4gvR092733 for ; Fri, 8 Dec 2017 06:04:55 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2eqrqjtbmd-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 08 Dec 2017 06:04:54 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 8 Dec 2017 11:04:49 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 8 Dec 2017 11:04:46 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vB8B4jro38535270; Fri, 8 Dec 2017 11:04:45 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 944E311C04C; Fri, 8 Dec 2017 10:59:10 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5B40F11C04A; Fri, 8 Dec 2017 10:59:10 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTPS; Fri, 8 Dec 2017 10:59:10 +0000 (GMT) From: Philipp Rudo To: gdb-patches@sourceware.org Cc: Andreas Arnez , Ulrich Weigand , Yao Qi Subject: [PATCH v3 07/10] s390: Hook s390 into OSABI mechanism Date: Fri, 8 Dec 2017 12:04:33 +0100 In-Reply-To: <20171208110436.30199-1-prudo@linux.vnet.ibm.com> References: <20171208110436.30199-1-prudo@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17120811-0008-0000-0000-000004B4CA3A X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17120811-0009-0000-0000-00001E47C9A7 Message-Id: <20171208110436.30199-8-prudo@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-08_06:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=587 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1712080160 X-IsSubscribed: yes Do what the title says and distinguish between 31- and 64-bit systems. There is one pitfall to take care of. Appending the dwarf2 unwinder must be moved _before_ the OSABI is initialized. Otherwise the OS could add a default unwinder which always takes control before the dwarf unwinder even gets a chance. gdb/ChangeLog: * s390-linux-tdep.c (osabi.h): New include (s390_linux_init_osabi_31, s390_linux_init_osabi_64) (s390_linux_init_osabi_any): New functions. (s390_gdbarch_init): Adjust. --- gdb/s390-linux-tdep.c | 155 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 63 deletions(-) diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index bae3b52808..b8c4e7e43f 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -30,6 +30,7 @@ #include "gdbcore.h" #include "gdbcmd.h" #include "objfiles.h" +#include "osabi.h" #include "regcache.h" #include "trad-frame.h" #include "frame-base.h" @@ -8019,32 +8020,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); info.tdesc_data = tdesc_data; - /* Default ABI and register size. */ - switch (info.bfd_arch_info->mach) - { - case bfd_mach_s390_31: - tdep->abi = ABI_LINUX_S390; - break; - - case bfd_mach_s390_64: - tdep->abi = ABI_LINUX_ZSERIES; - break; - - default: - xfree (tdep); - gdbarch_free (gdbarch); - return NULL; - } + /* The DWARF unwinders must be appended before the ABI is initialized. + Otherwise it is possible that a ABI default unwinder gets called before + the DWARF unwinder even gets the chance. */ + dwarf2_append_unwinders (gdbarch); - /* Use default target description if none provided by the target. */ - if (!tdesc_has_registers (tdesc)) - { - if (tdep->abi == ABI_LINUX_S390) - tdesc = tdesc_s390_linux32; - else - tdesc = tdesc_s390x_linux64; - } - tdep->tdesc = tdesc; + gdbarch_init_osabi (info, gdbarch); /* Check any target description for validity. */ gdb_assert (tdesc_has_registers (tdep->tdesc)); @@ -8112,15 +8093,11 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_num_regs (gdbarch, S390_NUM_REGS); set_gdbarch_sp_regnum (gdbarch, S390_SP_REGNUM); set_gdbarch_fp0_regnum (gdbarch, S390_F0_REGNUM); + set_gdbarch_guess_tracepoint_registers (gdbarch, + s390_guess_tracepoint_registers); set_gdbarch_stab_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum); set_gdbarch_dwarf2_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum); set_gdbarch_value_from_register (gdbarch, s390_value_from_register); - set_gdbarch_core_read_description (gdbarch, s390_core_read_description); - set_gdbarch_iterate_over_regset_sections (gdbarch, - s390_iterate_over_regset_sections); - set_gdbarch_cannot_store_register (gdbarch, s390_cannot_store_register); - set_gdbarch_write_pc (gdbarch, s390_write_pc); - set_gdbarch_guess_tracepoint_registers (gdbarch, s390_guess_tracepoint_registers); set_gdbarch_pseudo_register_read (gdbarch, s390_pseudo_register_read); set_gdbarch_pseudo_register_write (gdbarch, s390_pseudo_register_write); set_tdesc_pseudo_register_name (gdbarch, s390_pseudo_register_name); @@ -8159,18 +8136,10 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_frame_align (gdbarch, s390_frame_align); set_gdbarch_return_value (gdbarch, s390_return_value); - /* Syscall handling. */ - set_gdbarch_get_syscall_number (gdbarch, s390_linux_get_syscall_number); - /* Frame handling. */ dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg); dwarf2_frame_set_adjust_regnum (gdbarch, s390_adjust_frame_regnum); - dwarf2_append_unwinders (gdbarch); frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); - frame_unwind_append_unwinder (gdbarch, &s390_stub_frame_unwind); - frame_unwind_append_unwinder (gdbarch, &s390_sigtramp_frame_unwind); - frame_unwind_append_unwinder (gdbarch, &s390_frame_unwind); - frame_base_set_default (gdbarch, &s390_frame_base); set_gdbarch_unwind_pc (gdbarch, s390_unwind_pc); set_gdbarch_unwind_sp (gdbarch, s390_unwind_sp); @@ -8181,65 +8150,119 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location); set_gdbarch_max_insn_length (gdbarch, S390_MAX_INSTR_SIZE); - /* Note that GNU/Linux is the only OS supported on this - platform. */ - linux_init_abi (info, gdbarch); - switch (tdep->abi) { case ABI_LINUX_S390: set_gdbarch_addr_bits_remove (gdbarch, s390_addr_bits_remove); - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_ilp32_fetch_link_map_offsets); - - set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390); break; case ABI_LINUX_ZSERIES: set_gdbarch_long_bit (gdbarch, 64); set_gdbarch_long_long_bit (gdbarch, 64); set_gdbarch_ptr_bit (gdbarch, 64); - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_lp64_fetch_link_map_offsets); set_gdbarch_address_class_type_flags (gdbarch, s390_address_class_type_flags); set_gdbarch_address_class_type_flags_to_name (gdbarch, s390_address_class_type_flags_to_name); set_gdbarch_address_class_name_to_type_flags (gdbarch, s390_address_class_name_to_type_flags); - set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X); break; } - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); - - /* Enable TLS support. */ - set_gdbarch_fetch_tls_load_module_address (gdbarch, - svr4_fetch_objfile_link_map); - /* SystemTap functions. */ set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes); set_gdbarch_stap_register_indirection_prefixes (gdbarch, stap_register_indirection_prefixes); set_gdbarch_stap_register_indirection_suffixes (gdbarch, stap_register_indirection_suffixes); + + set_gdbarch_disassembler_options (gdbarch, &s390_disassembler_options); + set_gdbarch_valid_disassembler_options (gdbarch, + disassembler_options_s390 ()); + + /* Process record-replay */ + set_gdbarch_process_record (gdbarch, s390_process_record); + + /* Miscellaneous. */ set_gdbarch_stap_is_single_operand (gdbarch, s390_stap_is_single_operand); set_gdbarch_gcc_target_options (gdbarch, s390_gcc_target_options); set_gdbarch_gnu_triplet_regexp (gdbarch, s390_gnu_triplet_regexp); - /* Support reverse debugging. */ + return gdbarch; +} - set_gdbarch_process_record (gdbarch, s390_process_record); - set_gdbarch_process_record_signal (gdbarch, s390_linux_record_signal); +/* Initialize OSABI common for GNU/Linux on 31- and 64-bit systems. */ +static void +s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + linux_init_abi (info, gdbarch); + + /* Register handling. */ + set_gdbarch_core_read_description (gdbarch, s390_core_read_description); + set_gdbarch_iterate_over_regset_sections (gdbarch, + s390_iterate_over_regset_sections); + set_gdbarch_write_pc (gdbarch, s390_write_pc); + set_gdbarch_cannot_store_register (gdbarch, s390_cannot_store_register); + + /* Syscall handling. */ + set_gdbarch_get_syscall_number (gdbarch, s390_linux_get_syscall_number); + + /* Frame handling. */ + frame_unwind_append_unwinder (gdbarch, &s390_stub_frame_unwind); + frame_unwind_append_unwinder (gdbarch, &s390_sigtramp_frame_unwind); + frame_unwind_append_unwinder (gdbarch, &s390_frame_unwind); + frame_base_set_default (gdbarch, &s390_frame_base); + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + + /* Enable TLS support. */ + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); + + /* Support reverse debugging. */ + set_gdbarch_process_record_signal (gdbarch, s390_linux_record_signal); s390_init_linux_record_tdep (&s390_linux_record_tdep, ABI_LINUX_S390); s390_init_linux_record_tdep (&s390x_linux_record_tdep, ABI_LINUX_ZSERIES); +} - set_gdbarch_disassembler_options (gdbarch, &s390_disassembler_options); - set_gdbarch_valid_disassembler_options (gdbarch, - disassembler_options_s390 ()); +/* Initialize OSABI for GNU/Linux on 31-bit systems. */ - return gdbarch; +static void +s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + const struct target_desc *tdesc = info.target_desc; + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->abi = ABI_LINUX_S390; + if (!tdesc_has_registers (tdesc)) + tdesc = tdesc_s390_linux32; + tdep->tdesc = tdesc; + + s390_linux_init_abi_any (info, gdbarch); + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_ilp32_fetch_link_map_offsets); + set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390); +} + +/* Initialize OSABI for GNU/Linux on 64-bit systems. */ + +static void +s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + const struct target_desc *tdesc = info.target_desc; + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->abi = ABI_LINUX_ZSERIES; + if (!tdesc_has_registers (tdesc)) + tdesc = tdesc_s390x_linux64; + tdep->tdesc = tdesc; + + s390_linux_init_abi_any (info, gdbarch); + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_lp64_fetch_link_map_offsets); + set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X); } void @@ -8248,6 +8271,12 @@ _initialize_s390_tdep (void) /* Hook us into the gdbarch mechanism. */ register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init); + /* Hook us into the OSABI mechanism. */ + gdbarch_register_osabi (bfd_arch_s390, bfd_mach_s390_31, GDB_OSABI_LINUX, + s390_linux_init_abi_31); + gdbarch_register_osabi (bfd_arch_s390, bfd_mach_s390_64, GDB_OSABI_LINUX, + s390_linux_init_abi_64); + /* Initialize the GNU/Linux target descriptions. */ initialize_tdesc_s390_linux32 (); initialize_tdesc_s390_linux32v1 ();