From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27755 invoked by alias); 3 Jul 2013 17:02:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 27746 invoked by uid 89); 3 Jul 2013 17:02:42 -0000 X-Spam-SWARE-Status: No, score=-3.6 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_MED,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,TW_AV,TW_EG,TW_HW,TW_JN,TW_TD autolearn=ham version=3.3.1 Received: from e06smtp16.uk.ibm.com (HELO e06smtp16.uk.ibm.com) (195.75.94.112) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 03 Jul 2013 17:02:38 +0000 Received: from /spool/local by e06smtp16.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 3 Jul 2013 17:57:10 +0100 Received: from d06dlp01.portsmouth.uk.ibm.com (9.149.20.13) by e06smtp16.uk.ibm.com (192.168.101.146) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 3 Jul 2013 17:57:08 +0100 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id B3D8717D8058 for ; Wed, 3 Jul 2013 18:04:04 +0100 (BST) Received: from d06av08.portsmouth.uk.ibm.com (d06av08.portsmouth.uk.ibm.com [9.149.37.249]) by b06cxnps3075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r63H2MUs41680992 for ; Wed, 3 Jul 2013 17:02:22 GMT Received: from d06av08.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av08.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r63H2WVP024558 for ; Wed, 3 Jul 2013 11:02:33 -0600 Received: from br87z6lw.de.ibm.com (dyn-9-152-212-143.boeblingen.de.ibm.com [9.152.212.143]) by d06av08.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r63H2WoZ024539; Wed, 3 Jul 2013 11:02:32 -0600 From: Andreas Arnez To: gdb-patches@sourceware.org Cc: Ulrich.Weigand@de.ibm.com Subject: [RFA][PATCH v4 2/5] S/390: Add TDB regset References: <87zju3intq.fsf@br87z6lw.de.ibm.com> Date: Wed, 03 Jul 2013 17:02:00 -0000 In-Reply-To: <87zju3intq.fsf@br87z6lw.de.ibm.com> (Andreas Arnez's message of "Wed, 03 Jul 2013 18:57:05 +0200") Message-ID: <87r4ffinkn.fsf@br87z6lw.de.ibm.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13070316-3548-0000-0000-000005D71FEA X-SW-Source: 2013-07/txt/msg00148.txt.bz2 The z/Architecture transactional-execution facility includes support for a "transaction diagnostic block" (TDB) that is written by the hardware upon interrupted transactions. From a running inferior the TDB can be retrieved via PTRACE_GETREGSET, but ENODATA is returned if the inferior was interrupted outside transactions. Analogously, a core file conditionally contains the TDB, depending on whether the process died within a transaction or not. This patch represents the TDB as a new regset in GDB. A new feature "org.gnu.gdb.s390.tdb" is defined and new target descriptions are provided. gdb/ChangeLog: 2013-07-03 Andreas Arnez * features/s390-tdb.xml: New file. * features/s390-te-linux64.xml: New file. * features/s390x-te-linux64.xml: New file. * features/Makefile (WHICH): Add new tdescs above. (s390-te-linux64-expedite): Set. (s390x-te-linux64-expedite): Set. * s390-tdep.h (HWCAP_S390_HIGH_GPRS): Define. (HWCAP_S390_TE): Likewise. (S390_TDB_DWORD0_REGNUM): Likewise. (S390_TDB_DWORD0_REGNUM): Likewise. (S390_TDB_ABORT_CODE_REGNUM): Likewise. (S390_TDB_CONFLICT_TOKEN_REGNUM): Likewise. (S390_TDB_ATIA_REGNUM): Likewise. (S390_TDB_R0_REGNUM): Likewise. (S390_TDB_R1_REGNUM): Likewise. (S390_TDB_R2_REGNUM): Likewise. (S390_TDB_R3_REGNUM): Likewise. (S390_TDB_R4_REGNUM): Likewise. (S390_TDB_R5_REGNUM): Likewise. (S390_TDB_R6_REGNUM): Likewise. (S390_TDB_R7_REGNUM): Likewise. (S390_TDB_R8_REGNUM): Likewise. (S390_TDB_R9_REGNUM): Likewise. (S390_TDB_R10_REGNUM): Likewise. (S390_TDB_R11_REGNUM): Likewise. (S390_TDB_R12_REGNUM): Likewise. (S390_TDB_R13_REGNUM): Likewise. (S390_TDB_R14_REGNUM): Likewise. (S390_TDB_R15_REGNUM): Likewise. (S390_NUM_REGS): Increase. (S390_IS_TDBREGSET_REGNUM): New macro. (s390_regmap_tdb): Declare. (s390_sizeof_tdbregset): Define. (tdesc_s390_te_linux64): Declare. (tdesc_s390x_te_linux64): Likewise. * s390-tdep.c: Add includes for "auxv.h", , "features/s390-te-linux64.c", and "features/s390x-te-linux64.c". (s390_regmap_tdb): New regmap. (s390_tdb_regset): New regset. (s390_linux64v2_regset_sections): Add TDB regset to list. (s390x_linux64v2_regset_sections): Likewise. (s390_regset_from_core_section): Recognize TDB core note section. (s390_core_read_description): If HWCAP indicates TE support, select tdesc_s390_te_linux64 or tdesc_s390_s390x_te_linux64. (s390_gdbarch_init): Handle TDB regset. (_initialize_s390_tdep): Initialize new tdescs. * s390-nat.c (HWCAP_S390_HIGH_GPRS): Remove define. (have_regset_tdb): New variable. (s390_native_supply): Support register invalidation. (fetch_regset): Invalidate registers if ptrace yields ENODATA. (check_regset): Treat ENODATA as "regset exists". (s390_linux_fetch_inferior_registers): Add TDB. (s390_read_description): Check for TDB existence and select appropriate tdesc. * gdbserver/configure.srv (srv_regobj): Append new objects s390-te-linux64.o and s390x-te-linux64.o. (srv_xmlfiles): Append new files s390-te-linux64.xml, s390x-te-linux64.xml, and s390-tdb.xml. * gdbserver/Makefile.in (clean): Add removal of new makefile targets. (s390-te-linux64.c): New makefile target. (s390x-te-linux64.c): Likewise. * gdbserver/linux-s390-low.c (init_registers_s390_te_linux64): New declaration. (tdesc_s390_te_linux64): Likewise. (init_registers_s390x_te_linux64): Likewise. (tdesc_s390x_te_linux64): Likewise. (s390_check_regset): Treat ENODATA as "regset exists". (s390_arch_setup): Add TDB regset support. (initialize_low_arch): Initialize registers for new tdescs. * NEWS: Mention TDB support. * features/s390-te-linux64.c: New file (generated). * features/s390x-te-linux64.c: New file (generated). * regformats/s390-te-linux64.dat: New file (generated). * regformats/s390x-te-linux64.dat: New file (generated). gdb/doc/ChangeLog: 2013-06-12 Andreas Arnez * gdb.texinfo (Decimal Floating Point format): Mention S/390. (Standard Target Features): Add new node to menu. (S/390 and System z Features): New node. gdb/testsuite/ChangeLog: 2013-06-12 Andreas Arnez * gdb.arch/s390-tdbregs.c: New file. * gdb.arch/s390-tdbregs.exp: New file. Index: gdb/gdb/features/s390-tdb.xml =================================================================== --- /dev/null +++ gdb/gdb/features/s390-tdb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Index: gdb/gdb/s390-tdep.c =================================================================== --- gdb.orig/gdb/s390-tdep.c +++ gdb/gdb/s390-tdep.c @@ -44,6 +44,7 @@ #include "prologue-value.h" #include "linux-tdep.h" #include "s390-tdep.h" +#include "auxv.h" #include "stap-probe.h" #include "ax.h" @@ -51,6 +52,7 @@ #include "user-regs.h" #include "cli/cli-utils.h" #include +#include #include "features/s390-linux32.c" #include "features/s390-linux32v1.c" @@ -58,9 +60,11 @@ #include "features/s390-linux64.c" #include "features/s390-linux64v1.c" #include "features/s390-linux64v2.c" +#include "features/s390-te-linux64.c" #include "features/s390x-linux64.c" #include "features/s390x-linux64v1.c" #include "features/s390x-linux64v2.c" +#include "features/s390x-te-linux64.c" /* The tdep structure. */ @@ -568,6 +572,30 @@ const short s390_regmap_system_call[] = -1, -1 }; +const short s390_regmap_tdb[] = + { + 0x00, S390_TDB_DWORD0_REGNUM, + 0x08, S390_TDB_ABORT_CODE_REGNUM, + 0x10, S390_TDB_CONFLICT_TOKEN_REGNUM, + 0x18, S390_TDB_ATIA_REGNUM, + 0x80, S390_TDB_R0_REGNUM, + 0x88, S390_TDB_R1_REGNUM, + 0x90, S390_TDB_R2_REGNUM, + 0x98, S390_TDB_R3_REGNUM, + 0xa0, S390_TDB_R4_REGNUM, + 0xa8, S390_TDB_R5_REGNUM, + 0xb0, S390_TDB_R6_REGNUM, + 0xb8, S390_TDB_R7_REGNUM, + 0xc0, S390_TDB_R8_REGNUM, + 0xc8, S390_TDB_R9_REGNUM, + 0xd0, S390_TDB_R10_REGNUM, + 0xd8, S390_TDB_R11_REGNUM, + 0xe0, S390_TDB_R12_REGNUM, + 0xe8, S390_TDB_R13_REGNUM, + 0xf0, S390_TDB_R14_REGNUM, + 0xf8, S390_TDB_R15_REGNUM, + -1, -1 + }; /* Supply register REGNUM from the register set REGSET to register cache @@ -639,6 +667,12 @@ static const struct regset s390_system_c s390_collect_regset }; +static const struct regset s390_tdb_regset = { + s390_regmap_tdb, + s390_supply_regset, + s390_collect_regset +}; + static struct core_regset_section s390_linux32_regset_sections[] = { { ".reg", s390_sizeof_gregset, "general-purpose" }, @@ -687,6 +721,7 @@ static struct core_regset_section s390_l { ".reg-s390-high-gprs", 16*4, "s390 GPR upper halves" }, { ".reg-s390-last-break", 8, "s930 last-break address" }, { ".reg-s390-system-call", 4, "s390 system-call" }, + { ".reg-s390-tdb", s390_sizeof_tdbregset, "s390 TDB" }, { NULL, 0} }; @@ -711,6 +746,7 @@ static struct core_regset_section s390x_ { ".reg2", s390_sizeof_fpregset, "floating-point" }, { ".reg-s390-last-break", 8, "s930 last-break address" }, { ".reg-s390-system-call", 4, "s390 system-call" }, + { ".reg-s390-tdb", s390_sizeof_tdbregset, "s390 TDB" }, { NULL, 0} }; @@ -739,6 +775,9 @@ s390_regset_from_core_section (struct gd if (strcmp (sect_name, ".reg-s390-system-call") == 0 && sect_size >= 4) return &s390_system_call_regset; + if (strcmp (sect_name, ".reg-s390-tdb") == 0 && sect_size >= 256) + return &s390_tdb_regset; + return NULL; } @@ -750,6 +789,9 @@ s390_core_read_description (struct gdbar asection *v1 = bfd_get_section_by_name (abfd, ".reg-s390-last-break"); asection *v2 = bfd_get_section_by_name (abfd, ".reg-s390-system-call"); asection *section = bfd_get_section_by_name (abfd, ".reg"); + unsigned long hwcap = 0; + + target_auxv_search (target, AT_HWCAP, &hwcap); if (!section) return NULL; @@ -757,14 +799,16 @@ s390_core_read_description (struct gdbar { case s390_sizeof_gregset: if (high_gprs) - return (v2? tdesc_s390_linux64v2 : + return ((hwcap & HWCAP_S390_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); case s390x_sizeof_gregset: - return (v2? tdesc_s390x_linux64v2 : + return ((hwcap & HWCAP_S390_TE) ? tdesc_s390x_te_linux64 : + v2? tdesc_s390x_linux64v2 : v1? tdesc_s390x_linux64v1 : tdesc_s390x_linux64); default: @@ -3011,6 +3055,11 @@ s390_gdbarch_init (struct gdbarch_info i "r0h", "r1h", "r2h", "r3h", "r4h", "r5h", "r6h", "r7h", "r8h", "r9h", "r10h", "r11h", "r12h", "r13h", "r14h", "r15h" }; + static const char *const tdb_regs[] = { + "tdb0", "tac", "tct", "atia", + "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7", + "tr8", "tr9", "tr10", "tr11", "tr12", "tr13", "tr14", "tr15" + }; const struct tdesc_feature *feature; int i, valid_p = 1; @@ -3088,6 +3137,16 @@ s390_gdbarch_init (struct gdbarch_info i valid_p = 0; } + /* Transaction diagnostic block. */ + feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.tdb"); + if (feature) + { + for (i = 0; i < ARRAY_SIZE (tdb_regs); i++) + valid_p &= tdesc_numbered_register (feature, tdesc_data, + S390_TDB_DWORD0_REGNUM + i, + tdb_regs[i]); + } + if (!valid_p) { tdesc_data_cleanup (tdesc_data); @@ -3304,7 +3363,9 @@ _initialize_s390_tdep (void) initialize_tdesc_s390_linux64 (); initialize_tdesc_s390_linux64v1 (); initialize_tdesc_s390_linux64v2 (); + initialize_tdesc_s390_te_linux64 (); initialize_tdesc_s390x_linux64 (); initialize_tdesc_s390x_linux64v1 (); initialize_tdesc_s390x_linux64v2 (); + initialize_tdesc_s390x_te_linux64 (); } Index: gdb/gdb/s390-tdep.h =================================================================== --- gdb.orig/gdb/s390-tdep.h +++ gdb/gdb/s390-tdep.h @@ -19,6 +19,16 @@ #ifndef S390_TDEP_H #define S390_TDEP_H +/* Hardware capabilities. */ + +#ifndef HWCAP_S390_HIGH_GPRS +#define HWCAP_S390_HIGH_GPRS 512 +#endif + +#ifndef HWCAP_S390_TE +#define HWCAP_S390_TE 1024 +#endif + /* Register information. */ /* Program Status Word. */ @@ -98,8 +108,29 @@ #define S390_ORIG_R2_REGNUM 67 #define S390_LAST_BREAK_REGNUM 68 #define S390_SYSTEM_CALL_REGNUM 69 +/* Transaction diagnostic block. */ +#define S390_TDB_DWORD0_REGNUM 70 +#define S390_TDB_ABORT_CODE_REGNUM 71 +#define S390_TDB_CONFLICT_TOKEN_REGNUM 72 +#define S390_TDB_ATIA_REGNUM 73 +#define S390_TDB_R0_REGNUM 74 +#define S390_TDB_R1_REGNUM 75 +#define S390_TDB_R2_REGNUM 76 +#define S390_TDB_R3_REGNUM 77 +#define S390_TDB_R4_REGNUM 78 +#define S390_TDB_R5_REGNUM 79 +#define S390_TDB_R6_REGNUM 80 +#define S390_TDB_R7_REGNUM 81 +#define S390_TDB_R8_REGNUM 82 +#define S390_TDB_R9_REGNUM 83 +#define S390_TDB_R10_REGNUM 84 +#define S390_TDB_R11_REGNUM 85 +#define S390_TDB_R12_REGNUM 86 +#define S390_TDB_R13_REGNUM 87 +#define S390_TDB_R14_REGNUM 88 +#define S390_TDB_R15_REGNUM 89 /* Total. */ -#define S390_NUM_REGS 70 +#define S390_NUM_REGS 90 /* Special register usage. */ #define S390_SP_REGNUM S390_R15_REGNUM @@ -114,6 +145,9 @@ #define S390_IS_FPREGSET_REGNUM(i) \ ((i) >= S390_FPC_REGNUM && (i) <= S390_F15_REGNUM) +#define S390_IS_TDBREGSET_REGNUM(i) \ + ((i) >= S390_TDB_DWORD0_REGNUM && (i) <= S390_TDB_R15_REGNUM) + /* Core file register sets, defined in s390-tdep.c. */ #define s390_sizeof_gregset 0x90 extern const short s390_regmap_gregset[]; @@ -124,6 +158,8 @@ extern const short s390_regmap_fpregset[ extern const short s390_regmap_last_break[]; extern const short s390x_regmap_last_break[]; extern const short s390_regmap_system_call[]; +extern const short s390_regmap_tdb[]; +#define s390_sizeof_tdbregset 0x100 /* GNU/Linux target descriptions. */ extern struct target_desc *tdesc_s390_linux32; @@ -132,9 +168,11 @@ extern struct target_desc *tdesc_s390_li extern struct target_desc *tdesc_s390_linux64; extern struct target_desc *tdesc_s390_linux64v1; extern struct target_desc *tdesc_s390_linux64v2; +extern struct target_desc *tdesc_s390_te_linux64; extern struct target_desc *tdesc_s390x_linux64; extern struct target_desc *tdesc_s390x_linux64v1; extern struct target_desc *tdesc_s390x_linux64v2; +extern struct target_desc *tdesc_s390x_te_linux64; #endif Index: gdb/gdb/s390-nat.c =================================================================== --- gdb.orig/gdb/s390-nat.c +++ gdb/gdb/s390-nat.c @@ -37,10 +37,6 @@ #include #include -#ifndef HWCAP_S390_HIGH_GPRS -#define HWCAP_S390_HIGH_GPRS 512 -#endif - #ifndef PTRACE_GETREGSET #define PTRACE_GETREGSET 0x4204 #endif @@ -51,6 +47,7 @@ static int have_regset_last_break = 0; static int have_regset_system_call = 0; +static int have_regset_tdb = 0; /* Map registers to gregset/ptrace offsets. These arrays are defined in s390-tdep.c. */ @@ -68,7 +65,7 @@ s390_native_supply (struct regcache *reg const gdb_byte *regp) { for (; map[0] >= 0; map += 2) - regcache_raw_supply (regcache, map[1], regp + map[0]); + regcache_raw_supply (regcache, map[1], regp ? regp + map[0] : NULL); } static void @@ -305,9 +302,14 @@ fetch_regset (struct regcache *regcache, iov.iov_len = regsize; if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) < 0) - perror_with_name (_("Couldn't get register set")); - - s390_native_supply (regcache, regmap, buf); + { + if (errno == ENODATA) + s390_native_supply (regcache, regmap, NULL); + else + perror_with_name (_("Couldn't get register set")); + } + else + s390_native_supply (regcache, regmap, buf); } /* Store all registers in the kernel's register set whose number is REGSET, @@ -343,10 +345,10 @@ check_regset (int tid, int regset, int r iov.iov_base = buf; iov.iov_len = regsize; - if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) < 0) - return 0; - else + if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) >= 0 + || errno == ENODATA) return 1; + return 0; } /* Fetch register REGNUM from the child process. If REGNUM is -1, do @@ -373,6 +375,11 @@ s390_linux_fetch_inferior_registers (str if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM) fetch_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4, s390_regmap_system_call); + + if (have_regset_tdb) + if (regnum == -1 || S390_IS_TDBREGSET_REGNUM (regnum)) + fetch_regset (regcache, tid, NT_S390_TDB, s390_sizeof_tdbregset, + s390_regmap_tdb); } /* Store register REGNUM back into the child process. If REGNUM is @@ -615,6 +622,8 @@ s390_read_description (struct target_ops = check_regset (tid, NT_S390_LAST_BREAK, 8); have_regset_system_call = check_regset (tid, NT_S390_SYSTEM_CALL, 4); + have_regset_tdb + = check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset); #ifdef __s390x__ /* If GDB itself is compiled as 64-bit, we are running on a machine in @@ -624,12 +633,14 @@ s390_read_description (struct target_ops that mode, report s390 architecture with 64-bit GPRs. */ if (s390_target_wordsize () == 8) - return (have_regset_system_call? tdesc_s390x_linux64v2 : + return (have_regset_tdb ? tdesc_s390x_te_linux64 : + have_regset_system_call? tdesc_s390x_linux64v2 : have_regset_last_break? tdesc_s390x_linux64v1 : tdesc_s390x_linux64); if (s390_get_hwcap () & HWCAP_S390_HIGH_GPRS) - return (have_regset_system_call? tdesc_s390_linux64v2 : + return (have_regset_tdb ? tdesc_s390_te_linux64 : + have_regset_system_call? tdesc_s390_linux64v2 : have_regset_last_break? tdesc_s390_linux64v1 : tdesc_s390_linux64); #endif Index: gdb/gdb/testsuite/gdb.arch/s390-tdbregs.c =================================================================== --- /dev/null +++ gdb/gdb/testsuite/gdb.arch/s390-tdbregs.c @@ -0,0 +1,62 @@ +/* Copyright 2008-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +static void +my_tbegin () +{ + asm volatile ( "1: tbegin 0, 0xff00\n" + " jnz 1b" + : /* no return value */ + : /* no inputs */ + : "cc", "memory" ); +} + +static void +my_tend () +{ + asm volatile ( " tend" + : /* no return value */ + : /* no inputs */ + : "cc"); +} + +void +try_transaction (void) +{ + my_tbegin (); + my_tend (); +} + +void +crash_in_transaction (void) +{ + volatile char *p = 0; + + my_tbegin (); + *p = 5; /* FAULT */ + my_tend (); +} + +int +main (int argc, char *argv[]) +{ + try_transaction (); + crash_in_transaction (); + return 0; +} Index: gdb/gdb/testsuite/gdb.arch/s390-tdbregs.exp =================================================================== --- /dev/null +++ gdb/gdb/testsuite/gdb.arch/s390-tdbregs.exp @@ -0,0 +1,75 @@ +# Copyright 2004-2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@gnu.org + +# This file is part of the gdb testsuite. + + +if { ![istarget s390-*-*] && ![istarget s390x-*-* ] } { + verbose "Skipping s390 TDB register tests." + return +} + +set testfile "s390-tdbregs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [get_compiler_info] } { + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ + executable [list debug additional_flags=-march=zEC12]] != "" } { + unsupported "No TE support (compile failed)." + return +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if { ![runto_main] } then { + gdb_suppress_tests +} + +gdb_test_multiple "next" "check for TE support" { + -re "Program received signal SIGILL,.*\r\n$gdb_prompt $" { + unsupported "No TE support." + return + } + -re "\[0-9\]+.*\r\n$gdb_prompt $" { + pass "TE support available" + } + -re "$gdb_prompt $" { + unsupported "No TE support (unknown error)." + return + } +} + +set crashline [gdb_get_line_number "FAULT"] + +gdb_test "print \$tdb0" "\\\$\[0-9\]+ = " "tdb0 unavailable" +gdb_test "print \$tr0" "\\\$\[0-9\]+ = " "tr0 unavailable" +gdb_test "next" \ + "Program received signal SIGSEGV, .*" \ + "crash in transaction" +gdb_test "print/x \$tdb0" "\\\$\[0-9\]+ = 0x1.*" "tdb0 available" +gdb_test "set print symbol-filename" "" "set print symbol-filename" +gdb_test "print/a \$atia" \ + "" \ + "ATIA points to crash" Index: gdb/gdb/gdbserver/linux-s390-low.c =================================================================== --- gdb.orig/gdb/gdbserver/linux-s390-low.c +++ gdb/gdb/gdbserver/linux-s390-low.c @@ -64,6 +64,10 @@ extern const struct target_desc *tdesc_s void init_registers_s390_linux64v2 (void); extern const struct target_desc *tdesc_s390_linux64v2; +/* Defined in auto-generated file s390-te-linux64.c. */ +void init_registers_s390_te_linux64 (void); +extern const struct target_desc *tdesc_s390_te_linux64; + /* Defined in auto-generated file s390x-linux64.c. */ void init_registers_s390x_linux64 (void); extern const struct target_desc *tdesc_s390x_linux64; @@ -76,6 +80,10 @@ extern const struct target_desc *tdesc_s void init_registers_s390x_linux64v2 (void); extern const struct target_desc *tdesc_s390x_linux64v2; +/* Defined in auto-generated file s390x-te-linux64.c. */ +void init_registers_s390x_te_linux64 (void); +extern const struct target_desc *tdesc_s390x_te_linux64; + #define s390_num_regs 52 static int s390_regmap[] = { @@ -391,10 +399,10 @@ s390_check_regset (int pid, int regset, iov.iov_base = buf; iov.iov_len = regsize; - if (ptrace (PTRACE_GETREGSET, pid, (long) regset, (long) &iov) < 0) - return 0; - else + if (ptrace (PTRACE_GETREGSET, pid, (long) regset, (long) &iov) >= 0 + || errno == ENODATA) return 1; + return 0; } #ifdef __s390x__ @@ -415,6 +423,7 @@ s390_arch_setup (void) = s390_check_regset (pid, NT_S390_LAST_BREAK, 8); int have_regset_system_call = s390_check_regset (pid, NT_S390_SYSTEM_CALL, 4); + int have_regset_tdb = s390_check_regset (pid, NT_S390_TDB, 256); /* Update target_regsets according to available register sets. */ for (regset = s390_regsets; regset->fill_function != NULL; regset++) @@ -427,6 +436,8 @@ s390_arch_setup (void) case NT_S390_SYSTEM_CALL: regset->size = have_regset_system_call? 4 : 0; break; + case NT_S390_TDB: + regset->size = have_regset_tdb ? 256 : 0; default: break; } @@ -451,6 +462,8 @@ s390_arch_setup (void) if (pswm & 1) { + if (have_regset_tdb) + tdesc = tdesc_s390x_te_linux64; if (have_regset_system_call) tdesc = tdesc_s390x_linux64v2; else if (have_regset_last_break) @@ -465,7 +478,9 @@ s390_arch_setup (void) { have_hwcap_s390_high_gprs = 1; - if (have_regset_system_call) + if (have_regset_tdb) + tdesc = tdesc_s390_te_linux64; + else if (have_regset_system_call) tdesc = tdesc_s390_linux64v2; else if (have_regset_last_break) tdesc = tdesc_s390_linux64v1; @@ -575,9 +590,11 @@ initialize_low_arch (void) init_registers_s390_linux64 (); init_registers_s390_linux64v1 (); init_registers_s390_linux64v2 (); + init_registers_s390_te_linux64 (); init_registers_s390x_linux64 (); init_registers_s390x_linux64v1 (); init_registers_s390x_linux64v2 (); + init_registers_s390x_te_linux64 (); initialize_regsets_info (&s390_regsets_info); #ifdef __s390x__ Index: gdb/gdb/NEWS =================================================================== --- gdb.orig/gdb/NEWS +++ gdb/gdb/NEWS @@ -98,6 +98,10 @@ show range-stepping * GDB now understands the element 'tvar' in the XML traceframe info. It has the id of the collected trace state variables. +* On S/390 targets that provide the transactional-execution feature, + the program interruption transaction diagnostic block (TDB) is now + represented as a number of additional "registers" in GDB. + * New remote packets vCont;r Index: gdb/gdb/doc/gdb.texinfo =================================================================== --- gdb.orig/gdb/doc/gdb.texinfo +++ gdb/gdb/doc/gdb.texinfo @@ -13832,8 +13832,8 @@ specified by the extension to support de There are two encodings in use, depending on the architecture: BID (Binary Integer Decimal) for x86 and x86-64, and DPD (Densely Packed Decimal) for -PowerPC. @value{GDBN} will use the appropriate encoding for the configured -target. +PowerPC and S/390. @value{GDBN} will use the appropriate encoding for the +configured target. Because of a limitation in @file{libdecnumber}, the library used by @value{GDBN} to manipulate decimal floating point numbers, it is not possible to convert @@ -42443,6 +42443,7 @@ registers using the capitalization used * M68K Features:: * Nios II Features:: * PowerPC Features:: +* S/390 and System z Features:: * TIC6x Features:: @end menu @@ -42632,6 +42633,39 @@ contain registers @samp{ev0h} through @s these to present registers @samp{ev0} through @samp{ev31} to the user. +@node S/390 and System z Features +@subsection S/390 and System z Features +@cindex target descriptions, S/390 features +@cindex target descriptions, System z features + +The @samp{org.gnu.gdb.s390.core} feature is required for S/390 and +System z targets. It should contain the PSW and the 16 general +registers. In particular, System z targets should provide the 64-bit +registers @samp{pswm}, @samp{pswa}, and @samp{r0} through @samp{r15}. +S/390 targets should provide the 32-bit versions of these registers. +A System z target that runs in 31-bit addressing mode should provide +32-bit versions of @samp{pswm} and @samp{pswa}, as well as the general +register's upper halves @samp{r0h} through @samp{r15h}, and their +lower halves @samp{r0l} through @samp{r15l}. + +The @samp{org.gnu.gdb.s390.fpr} feature is required. It should +contain the 64-bit registers @samp{f0} through @samp{f15}, and +@samp{fpc}. + +The @samp{org.gnu.gdb.s390.acr} feature is required. It should +contain the 32-bit registers @samp{acr0} through @samp{acr15}. + +The @samp{org.gnu.gdb.s390.linux} feature is optional. It should +contain the register @samp{orig_r2}, which is 64-bit wide on System z +targets and 32-bit otherwise. In addition, the feature may contain +the @samp{last_break} register, whose width depends on the addressing +mode, as well as the @samp{system_call} register, which is always +32-bit wide. + +The @samp{org.gnu.gdb.s390.tdb} feature is optional. It should +contain the 64-bit registers @samp{tdb0}, @samp{tac}, @samp{tct}, +@samp{atia}, and @samp{tr0} through @samp{tr15}. + @node TIC6x Features @subsection TMS320C6x Features @cindex target descriptions, TIC6x features Index: gdb/gdb/features/s390-te-linux64.xml =================================================================== --- /dev/null +++ gdb/gdb/features/s390-te-linux64.xml @@ -0,0 +1,25 @@ + + + + + + + + s390:31-bit + + + + + + + + + + + + Index: gdb/gdb/features/s390x-te-linux64.xml =================================================================== --- /dev/null +++ gdb/gdb/features/s390x-te-linux64.xml @@ -0,0 +1,24 @@ + + + + + + + + s390:64-bit + + + + + + + + + + + + Index: gdb/gdb/features/Makefile =================================================================== --- gdb.orig/gdb/features/Makefile +++ gdb/gdb/features/Makefile @@ -50,6 +50,7 @@ WHICH = aarch64 \ s390-linux32 s390-linux64 s390x-linux64 \ s390-linux32v1 s390-linux64v1 s390x-linux64v1 \ s390-linux32v2 s390-linux64v2 s390x-linux64v2 \ + s390-te-linux64 s390x-te-linux64 \ tic6x-c64xp tic6x-c64x tic6x-c62x \ tic6x-c64xp-linux tic6x-c64x-linux tic6x-c62x-linux @@ -84,9 +85,11 @@ s390-linux32v2-expedite = r14,r15,pswa s390-linux64-expedite = r14l,r15l,pswa s390-linux64v1-expedite = r14l,r15l,pswa s390-linux64v2-expedite = r14l,r15l,pswa +s390-te-linux64-expedite = r14,r15,pswa s390x-linux64-expedite = r14,r15,pswa s390x-linux64v1-expedite = r14,r15,pswa s390x-linux64v2-expedite = r14,r15,pswa +s390x-te-linux64-expedite = r14,r15,pswa tic6x-c64xp-expedite = A15,PC tic6x-c64x-expedite = A15,PC tic6x-c62x-expedite = A15,PC Index: gdb/gdb/features/s390-te-linux64.c =================================================================== --- /dev/null +++ gdb/gdb/features/s390-te-linux64.c @@ -0,0 +1,118 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: s390-te-linux64.xml */ + +#include "defs.h" +#include "osabi.h" +#include "target-descriptions.h" + +struct target_desc *tdesc_s390_te_linux64; +static void +initialize_tdesc_s390_te_linux64 (void) +{ + struct target_desc *result = allocate_target_description (); + struct tdesc_feature *feature; + + set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit")); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core"); + tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32"); + tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32"); + tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r0l", 3, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r1h", 4, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r1l", 5, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r2h", 6, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r2l", 7, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r3h", 8, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r3l", 9, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r4h", 10, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r4l", 11, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r5h", 12, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r5l", 13, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r6h", 14, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r6l", 15, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r7h", 16, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r7l", 17, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r8h", 18, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r8l", 19, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r9h", 20, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r9l", 21, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r10h", 22, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r10l", 23, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r11h", 24, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r11l", 25, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r12h", 26, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r12l", 27, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r13h", 28, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r13l", 29, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r14h", 30, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r14l", 31, 1, "lower", 32, "uint32"); + tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32"); + tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr"); + tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr3", 37, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr4", 38, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr5", 39, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr6", 40, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr7", 41, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr8", 42, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr9", 43, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr10", 44, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr11", 45, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr12", 46, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr13", 47, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr"); + tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32"); + tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f2", 53, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f3", 54, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f4", 55, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f5", 56, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f6", 57, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f7", 58, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f8", 59, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f9", 60, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f10", 61, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f11", 62, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f12", 63, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f13", 64, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux"); + tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32"); + tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr"); + tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb"); + tdesc_create_reg (feature, "tdb0", 70, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tac", 71, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tct", 72, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "atia", 73, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr0", 74, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr1", 75, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr2", 76, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr3", 77, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr4", 78, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr5", 79, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr6", 80, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr7", 81, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr8", 82, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr9", 83, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr10", 84, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr11", 85, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr12", 86, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr13", 87, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr14", 88, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64"); + + tdesc_s390_te_linux64 = result; +} Index: gdb/gdb/features/s390x-te-linux64.c =================================================================== --- /dev/null +++ gdb/gdb/features/s390x-te-linux64.c @@ -0,0 +1,102 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: s390x-te-linux64.xml */ + +#include "defs.h" +#include "osabi.h" +#include "target-descriptions.h" + +struct target_desc *tdesc_s390x_te_linux64; +static void +initialize_tdesc_s390x_te_linux64 (void) +{ + struct target_desc *result = allocate_target_description (); + struct tdesc_feature *feature; + + set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit")); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core"); + tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64"); + tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64"); + tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r1", 3, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r2", 4, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r3", 5, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r4", 6, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r5", 7, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r6", 8, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r7", 9, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r8", 10, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r9", 11, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r10", 12, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r11", 13, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r12", 14, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r13", 15, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64"); + tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr"); + tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr3", 21, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr4", 22, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr5", 23, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr6", 24, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr7", 25, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr8", 26, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr9", 27, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr10", 28, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr11", 29, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr12", 30, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr13", 31, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32"); + tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr"); + tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32"); + tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f2", 37, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f3", 38, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f4", 39, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f5", 40, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f6", 41, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f7", 42, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f8", 43, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f9", 44, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f10", 45, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f11", 46, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f12", 47, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f13", 48, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double"); + tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux"); + tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64"); + tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr"); + tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb"); + tdesc_create_reg (feature, "tdb0", 54, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tac", 55, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tct", 56, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "atia", 57, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr0", 58, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr1", 59, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr2", 60, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr3", 61, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr4", 62, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr5", 63, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr6", 64, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr7", 65, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr8", 66, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr9", 67, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr10", 68, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr11", 69, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr12", 70, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr13", 71, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr14", 72, 1, "tdb", 64, "uint64"); + tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64"); + + tdesc_s390x_te_linux64 = result; +} Index: gdb/gdb/regformats/s390-te-linux64.dat =================================================================== --- /dev/null +++ gdb/gdb/regformats/s390-te-linux64.dat @@ -0,0 +1,94 @@ +# DO NOT EDIT: generated from s390-te-linux64.xml +name:s390_te_linux64 +xmltarget:s390-te-linux64.xml +expedite:r14,r15,pswa +32:pswm +32:pswa +32:r0h +32:r0l +32:r1h +32:r1l +32:r2h +32:r2l +32:r3h +32:r3l +32:r4h +32:r4l +32:r5h +32:r5l +32:r6h +32:r6l +32:r7h +32:r7l +32:r8h +32:r8l +32:r9h +32:r9l +32:r10h +32:r10l +32:r11h +32:r11l +32:r12h +32:r12l +32:r13h +32:r13l +32:r14h +32:r14l +32:r15h +32:r15l +32:acr0 +32:acr1 +32:acr2 +32:acr3 +32:acr4 +32:acr5 +32:acr6 +32:acr7 +32:acr8 +32:acr9 +32:acr10 +32:acr11 +32:acr12 +32:acr13 +32:acr14 +32:acr15 +32:fpc +64:f0 +64:f1 +64:f2 +64:f3 +64:f4 +64:f5 +64:f6 +64:f7 +64:f8 +64:f9 +64:f10 +64:f11 +64:f12 +64:f13 +64:f14 +64:f15 +32:orig_r2 +32:last_break +32:system_call +64:tdb0 +64:tac +64:tct +64:atia +64:tr0 +64:tr1 +64:tr2 +64:tr3 +64:tr4 +64:tr5 +64:tr6 +64:tr7 +64:tr8 +64:tr9 +64:tr10 +64:tr11 +64:tr12 +64:tr13 +64:tr14 +64:tr15 Index: gdb/gdb/regformats/s390x-te-linux64.dat =================================================================== --- /dev/null +++ gdb/gdb/regformats/s390x-te-linux64.dat @@ -0,0 +1,78 @@ +# DO NOT EDIT: generated from s390x-te-linux64.xml +name:s390x_te_linux64 +xmltarget:s390x-te-linux64.xml +expedite:r14,r15,pswa +64:pswm +64:pswa +64:r0 +64:r1 +64:r2 +64:r3 +64:r4 +64:r5 +64:r6 +64:r7 +64:r8 +64:r9 +64:r10 +64:r11 +64:r12 +64:r13 +64:r14 +64:r15 +32:acr0 +32:acr1 +32:acr2 +32:acr3 +32:acr4 +32:acr5 +32:acr6 +32:acr7 +32:acr8 +32:acr9 +32:acr10 +32:acr11 +32:acr12 +32:acr13 +32:acr14 +32:acr15 +32:fpc +64:f0 +64:f1 +64:f2 +64:f3 +64:f4 +64:f5 +64:f6 +64:f7 +64:f8 +64:f9 +64:f10 +64:f11 +64:f12 +64:f13 +64:f14 +64:f15 +64:orig_r2 +64:last_break +32:system_call +64:tdb0 +64:tac +64:tct +64:atia +64:tr0 +64:tr1 +64:tr2 +64:tr3 +64:tr4 +64:tr5 +64:tr6 +64:tr7 +64:tr8 +64:tr9 +64:tr10 +64:tr11 +64:tr12 +64:tr13 +64:tr14 +64:tr15 Index: gdb/gdb/gdbserver/Makefile.in =================================================================== --- gdb.orig/gdb/gdbserver/Makefile.in +++ gdb/gdb/gdbserver/Makefile.in @@ -334,6 +334,9 @@ clean: rm -f powerpc-isa205-altivec32l.c powerpc-isa205-vsx32l.c powerpc-isa205-altivec64l.c rm -f powerpc-isa205-vsx64l.c rm -f s390-linux32.c s390-linux64.c s390x-linux64.c + rm -f s390-linux32v1.c s390-linux32v2.c s390-linux64v1.c + rm -f s390-linux64v2.c s390x-linux64v1.c s390x-linux64v2.c + rm -f s390-te-linux32.c s390-te-linux64.c rm -f tic6x-c64xp-linux.c tic6x-c64x-linux.c tic6x-c62x-linux.c rm -f xml-builtin.c stamp-xml rm -f i386-avx.c i386-avx-linux.c @@ -660,12 +663,16 @@ s390-linux64v1.c : $(srcdir)/../regforma $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux64v1.dat s390-linux64v1.c s390-linux64v2.c : $(srcdir)/../regformats/s390-linux64v2.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux64v2.dat s390-linux64v2.c +s390-te-linux64.c : $(srcdir)/../regformats/s390-te-linux64.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-te-linux64.dat s390-te-linux64.c s390x-linux64.c : $(srcdir)/../regformats/s390x-linux64.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64.dat s390x-linux64.c s390x-linux64v1.c : $(srcdir)/../regformats/s390x-linux64v1.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64v1.dat s390x-linux64v1.c s390x-linux64v2.c : $(srcdir)/../regformats/s390x-linux64v2.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64v2.dat s390x-linux64v2.c +s390x-te-linux64.c : $(srcdir)/../regformats/s390x-te-linux64.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-te-linux64.dat s390x-te-linux64.c tic6x-c64xp-linux.c : $(srcdir)/../regformats/tic6x-c64xp-linux.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/tic6x-c64xp-linux.dat tic6x-c64xp-linux.c Index: gdb/gdb/gdbserver/configure.srv =================================================================== --- gdb.orig/gdb/gdbserver/configure.srv +++ gdb/gdb/gdbserver/configure.srv @@ -267,9 +267,11 @@ case "${target}" in srv_regobj="${srv_regobj} s390-linux64.o" srv_regobj="${srv_regobj} s390-linux64v1.o" srv_regobj="${srv_regobj} s390-linux64v2.o" + srv_regobj="${srv_regobj} s390-te-linux64.o" srv_regobj="${srv_regobj} s390x-linux64.o" srv_regobj="${srv_regobj} s390x-linux64v1.o" srv_regobj="${srv_regobj} s390x-linux64v2.o" + srv_regobj="${srv_regobj} s390x-te-linux64.o" srv_tgtobj="linux-low.o linux-osdata.o linux-s390-low.o linux-procfs.o" srv_tgtobj="${srv_tgtobj} linux-ptrace.o" srv_xmlfiles="s390-linux32.xml" @@ -278,14 +280,17 @@ case "${target}" in srv_xmlfiles="${srv_xmlfiles} s390-linux64.xml" srv_xmlfiles="${srv_xmlfiles} s390-linux64v1.xml" srv_xmlfiles="${srv_xmlfiles} s390-linux64v2.xml" + srv_xmlfiles="${srv_xmlfiles} s390-te-linux64.xml" srv_xmlfiles="${srv_xmlfiles} s390x-linux64.xml" srv_xmlfiles="${srv_xmlfiles} s390x-linux64v1.xml" srv_xmlfiles="${srv_xmlfiles} s390x-linux64v2.xml" + srv_xmlfiles="${srv_xmlfiles} s390x-te-linux64.xml" srv_xmlfiles="${srv_xmlfiles} s390-core32.xml" srv_xmlfiles="${srv_xmlfiles} s390-core64.xml" srv_xmlfiles="${srv_xmlfiles} s390x-core64.xml" srv_xmlfiles="${srv_xmlfiles} s390-acr.xml" srv_xmlfiles="${srv_xmlfiles} s390-fpr.xml" + srv_xmlfiles="${srv_xmlfiles} s390-tdb.xml" srv_linux_usrregs=yes srv_linux_regsets=yes srv_linux_thread_db=yes