Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH 1/4] S390: Add target descriptions for vector register sets
  2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
@ 2015-02-25  9:42 ` Andreas Arnez
  2015-02-25 15:58   ` Eli Zaretskii
  2015-02-25  9:43 ` [PATCH 2/4] S390: Add vector register support to gdb Andreas Arnez
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Andreas Arnez @ 2015-02-25  9:42 UTC (permalink / raw)
  To: gdb-patches; +Cc: Ulrich Weigand

The IBM z13 has new vector registers v0-v31 which are presented by the
Linux kernel as two additional register sets.  This patch adds XML
descriptions and the respective autogenerated .c and .dat files for
S390 targets with this feature.  Note that supported combinations
include targets with and without a transactional execution facility.

gdb/ChangeLog:

	* features/s390-tevx-linux64.xml: New file.
	* features/s390-vx-linux64.xml: New file.
	* features/s390-vx.xml: New file.
	* features/s390x-tevx-linux64.xml: New file.
	* features/s390x-vx-linux64.xml: New file.
	* features/Makefile (WHICH): Add s390-vx-linux64,
	s390x-vx-linux64, s390-tevx-linux64, and s390x-tevx-linux64.
	(s390-vx-linux64-expedite, s390-tevx-linux64-expedite)
	(s390x-vx-linux64-expedite, s390x-tevx-linux64-expedite): New
	macros.
	* features/s390-tevx-linux64.c: New generated file.
	* features/s390-vx-linux64.c: Likewise.
	* features/s390x-tevx-linux64.c: Likewise.
	* features/s390x-vx-linux64.c: Likewise.
	* regformats/s390-tevx-linux64.dat: Likewise.
	* regformats/s390-vx-linux64.dat: Likewise.
	* regformats/s390x-tevx-linux64.dat: Likewise.
	* regformats/s390x-vx-linux64.dat: Likewise.

gdb/doc/ChangeLog:

	* gdb.texinfo (S/390 and System z Features): Describe new feature
	"org.gnu.gdb.s390.vx".
---
 gdb/doc/gdb.texinfo                   |   8 ++
 gdb/features/Makefile                 |   7 +-
 gdb/features/s390-tevx-linux64.c      | 188 ++++++++++++++++++++++++++++++++++
 gdb/features/s390-tevx-linux64.xml    |  26 +++++
 gdb/features/s390-vx-linux64.c        | 166 ++++++++++++++++++++++++++++++
 gdb/features/s390-vx-linux64.xml      |  25 +++++
 gdb/features/s390-vx.xml              |  59 +++++++++++
 gdb/features/s390x-tevx-linux64.c     | 172 +++++++++++++++++++++++++++++++
 gdb/features/s390x-tevx-linux64.xml   |  25 +++++
 gdb/features/s390x-vx-linux64.c       | 150 +++++++++++++++++++++++++++
 gdb/features/s390x-vx-linux64.xml     |  24 +++++
 gdb/regformats/s390-tevx-linux64.dat  | 127 +++++++++++++++++++++++
 gdb/regformats/s390-vx-linux64.dat    | 107 +++++++++++++++++++
 gdb/regformats/s390x-tevx-linux64.dat | 111 ++++++++++++++++++++
 gdb/regformats/s390x-vx-linux64.dat   |  91 ++++++++++++++++
 15 files changed, 1285 insertions(+), 1 deletion(-)
 create mode 100644 gdb/features/s390-tevx-linux64.c
 create mode 100644 gdb/features/s390-tevx-linux64.xml
 create mode 100644 gdb/features/s390-vx-linux64.c
 create mode 100644 gdb/features/s390-vx-linux64.xml
 create mode 100644 gdb/features/s390-vx.xml
 create mode 100644 gdb/features/s390x-tevx-linux64.c
 create mode 100644 gdb/features/s390x-tevx-linux64.xml
 create mode 100644 gdb/features/s390x-vx-linux64.c
 create mode 100644 gdb/features/s390x-vx-linux64.xml
 create mode 100644 gdb/regformats/s390-tevx-linux64.dat
 create mode 100644 gdb/regformats/s390-vx-linux64.dat
 create mode 100644 gdb/regformats/s390x-tevx-linux64.dat
 create mode 100644 gdb/regformats/s390x-vx-linux64.dat

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index a9a8c66..fad33a7 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -39933,6 +39933,14 @@ 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}.
 
+The @samp{org.gnu.gdb.s390.vx} feature is optional.  It should contain
+64-bit wide registers @samp{v0l} through @samp{v15l}, which will be
+combined by @value{GDBN} with the floating point registers @samp{f0}
+through @samp{f15} to present the 128-bit wide vector registers
+@samp{v0} through @samp{v15}.  In addition, this feature should
+contain the 128-bit wide vector registers @samp{v16} through
+@samp{v31}.
+
 @node TIC6x Features
 @subsection TMS320C6x Features
 @cindex target descriptions, TIC6x features
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 07cd2cb..74006e2 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -68,7 +68,8 @@ 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 \
+	s390-te-linux64 s390x-te-linux64 s390-vx-linux64 s390x-vx-linux64 \
+	s390-tevx-linux64 s390x-tevx-linux64 \
 	tic6x-c64xp tic6x-c64x tic6x-c62x \
 	tic6x-c64xp-linux tic6x-c64x-linux tic6x-c62x-linux
 
@@ -115,10 +116,14 @@ s390-linux64-expedite = r14l,r15l,pswa
 s390-linux64v1-expedite = r14l,r15l,pswa
 s390-linux64v2-expedite = r14l,r15l,pswa
 s390-te-linux64-expedite = r14l,r15l,pswa
+s390-vx-linux64-expedite = r14l,r15l,pswa
+s390-tevx-linux64-expedite = r14l,r15l,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
+s390x-vx-linux64-expedite = r14,r15,pswa
+s390x-tevx-linux64-expedite = r14,r15,pswa
 tic6x-c64xp-expedite = A15,PC
 tic6x-c64x-expedite = A15,PC
 tic6x-c62x-expedite = A15,PC
diff --git a/gdb/features/s390-tevx-linux64.c b/gdb/features/s390-tevx-linux64.c
new file mode 100644
index 0000000..5bc3eec
--- /dev/null
+++ b/gdb/features/s390-tevx-linux64.c
@@ -0,0 +1,188 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: s390-tevx-linux64.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_s390_tevx_linux64;
+static void
+initialize_tdesc_s390_tevx_linux64 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  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");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  tdesc_create_reg (feature, "v0l", 90, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v1l", 91, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v2l", 92, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v3l", 93, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v4l", 94, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v5l", 95, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v6l", 96, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v7l", 97, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v8l", 98, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v9l", 99, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v10l", 100, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v11l", 101, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v12l", 102, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v13l", 103, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v14l", 104, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v15l", 105, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v16", 106, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v17", 107, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v18", 108, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v19", 109, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v20", 110, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v21", 111, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v22", 112, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v23", 113, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v24", 114, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v25", 115, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v26", 116, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v27", 117, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v28", 118, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v29", 119, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v30", 120, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v31", 121, 1, NULL, 128, "vec128");
+
+  tdesc_s390_tevx_linux64 = result;
+}
diff --git a/gdb/features/s390-tevx-linux64.xml b/gdb/features/s390-tevx-linux64.xml
new file mode 100644
index 0000000..9da1f6d
--- /dev/null
+++ b/gdb/features/s390-tevx-linux64.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 31-bit user-level code on a machine operating
+     in z/Architecture mode.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:31-bit</architecture>
+  <xi:include href="s390-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+
+  <feature name="org.gnu.gdb.s390.linux">
+    <reg name="orig_r2" bitsize="32" type="uint32" group="system"/>
+    <reg name="last_break" bitsize="32" type="code_ptr" group="system" save-restore="no"/>
+    <reg name="system_call" bitsize="32" type="uint32" group="system"/>
+  </feature>
+
+  <xi:include href="s390-tdb.xml"/>
+  <xi:include href="s390-vx.xml"/>
+</target>
diff --git a/gdb/features/s390-vx-linux64.c b/gdb/features/s390-vx-linux64.c
new file mode 100644
index 0000000..c3ffa16
--- /dev/null
+++ b/gdb/features/s390-vx-linux64.c
@@ -0,0 +1,166 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: s390-vx-linux64.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_s390_vx_linux64;
+static void
+initialize_tdesc_s390_vx_linux64 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  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.vx");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  tdesc_create_reg (feature, "v0l", 70, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v1l", 71, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v2l", 72, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v3l", 73, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v4l", 74, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v5l", 75, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v6l", 76, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v7l", 77, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v8l", 78, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v9l", 79, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v10l", 80, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v11l", 81, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v12l", 82, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v13l", 83, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v14l", 84, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v15l", 85, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v16", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v17", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v18", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v19", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v20", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v21", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v22", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v23", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v24", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v25", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v26", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v27", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v28", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v29", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v30", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v31", 101, 1, NULL, 128, "vec128");
+
+  tdesc_s390_vx_linux64 = result;
+}
diff --git a/gdb/features/s390-vx-linux64.xml b/gdb/features/s390-vx-linux64.xml
new file mode 100644
index 0000000..ef8ebc0
--- /dev/null
+++ b/gdb/features/s390-vx-linux64.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 31-bit user-level code on a machine operating
+     in z/Architecture mode.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:31-bit</architecture>
+  <xi:include href="s390-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+
+  <feature name="org.gnu.gdb.s390.linux">
+    <reg name="orig_r2" bitsize="32" type="uint32" group="system"/>
+    <reg name="last_break" bitsize="32" type="code_ptr" group="system" save-restore="no"/>
+    <reg name="system_call" bitsize="32" type="uint32" group="system"/>
+  </feature>
+
+  <xi:include href="s390-vx.xml"/>
+</target>
diff --git a/gdb/features/s390-vx.xml b/gdb/features/s390-vx.xml
new file mode 100644
index 0000000..bfae8a1
--- /dev/null
+++ b/gdb/features/s390-vx.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.vx">
+  <vector id="v4f" type="ieee_single" count="4"/>
+  <vector id="v2d" type="ieee_double" count="2"/>
+  <vector id="v16i8" type="int8" count="16"/>
+  <vector id="v8i16" type="int16" count="8"/>
+  <vector id="v4i32" type="int32" count="4"/>
+  <vector id="v2i64" type="int64" count="2"/>
+  <union id="vec128">
+    <field name="v4_float" type="v4f"/>
+    <field name="v2_double" type="v2d"/>
+    <field name="v16_int8" type="v16i8"/>
+    <field name="v8_int16" type="v8i16"/>
+    <field name="v4_int32" type="v4i32"/>
+    <field name="v2_int64" type="v2i64"/>
+    <field name="uint128" type="uint128"/>
+  </union>
+
+  <reg name="v0l" bitsize="64" type="uint64"/>
+  <reg name="v1l" bitsize="64" type="uint64"/>
+  <reg name="v2l" bitsize="64" type="uint64"/>
+  <reg name="v3l" bitsize="64" type="uint64"/>
+  <reg name="v4l" bitsize="64" type="uint64"/>
+  <reg name="v5l" bitsize="64" type="uint64"/>
+  <reg name="v6l" bitsize="64" type="uint64"/>
+  <reg name="v7l" bitsize="64" type="uint64"/>
+  <reg name="v8l" bitsize="64" type="uint64"/>
+  <reg name="v9l" bitsize="64" type="uint64"/>
+  <reg name="v10l" bitsize="64" type="uint64"/>
+  <reg name="v11l" bitsize="64" type="uint64"/>
+  <reg name="v12l" bitsize="64" type="uint64"/>
+  <reg name="v13l" bitsize="64" type="uint64"/>
+  <reg name="v14l" bitsize="64" type="uint64"/>
+  <reg name="v15l" bitsize="64" type="uint64"/>
+
+  <reg name="v16" bitsize="128" type="vec128"/>
+  <reg name="v17" bitsize="128" type="vec128"/>
+  <reg name="v18" bitsize="128" type="vec128"/>
+  <reg name="v19" bitsize="128" type="vec128"/>
+  <reg name="v20" bitsize="128" type="vec128"/>
+  <reg name="v21" bitsize="128" type="vec128"/>
+  <reg name="v22" bitsize="128" type="vec128"/>
+  <reg name="v23" bitsize="128" type="vec128"/>
+  <reg name="v24" bitsize="128" type="vec128"/>
+  <reg name="v25" bitsize="128" type="vec128"/>
+  <reg name="v26" bitsize="128" type="vec128"/>
+  <reg name="v27" bitsize="128" type="vec128"/>
+  <reg name="v28" bitsize="128" type="vec128"/>
+  <reg name="v29" bitsize="128" type="vec128"/>
+  <reg name="v30" bitsize="128" type="vec128"/>
+  <reg name="v31" bitsize="128" type="vec128"/>
+</feature>
diff --git a/gdb/features/s390x-tevx-linux64.c b/gdb/features/s390x-tevx-linux64.c
new file mode 100644
index 0000000..327cd23
--- /dev/null
+++ b/gdb/features/s390x-tevx-linux64.c
@@ -0,0 +1,172 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: s390x-tevx-linux64.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_s390x_tevx_linux64;
+static void
+initialize_tdesc_s390x_tevx_linux64 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  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");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  tdesc_create_reg (feature, "v0l", 74, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v1l", 75, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v2l", 76, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v3l", 77, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v4l", 78, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v5l", 79, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v6l", 80, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v7l", 81, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v8l", 82, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v9l", 83, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v10l", 84, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v11l", 85, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v12l", 86, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v13l", 87, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v14l", 88, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v15l", 89, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v16", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v17", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v18", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v19", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v20", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v21", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v22", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v23", 97, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v24", 98, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v25", 99, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v26", 100, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v27", 101, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v28", 102, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v29", 103, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v30", 104, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v31", 105, 1, NULL, 128, "vec128");
+
+  tdesc_s390x_tevx_linux64 = result;
+}
diff --git a/gdb/features/s390x-tevx-linux64.xml b/gdb/features/s390x-tevx-linux64.xml
new file mode 100644
index 0000000..974992b
--- /dev/null
+++ b/gdb/features/s390x-tevx-linux64.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:64-bit</architecture>
+  <xi:include href="s390x-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+
+  <feature name="org.gnu.gdb.s390.linux">
+    <reg name="orig_r2" bitsize="64" type="uint64" group="system"/>
+    <reg name="last_break" bitsize="64" type="code_ptr" group="system" save-restore="no"/>
+    <reg name="system_call" bitsize="32" type="uint32" group="system"/>
+  </feature>
+
+  <xi:include href="s390-tdb.xml"/>
+  <xi:include href="s390-vx.xml"/>
+</target>
diff --git a/gdb/features/s390x-vx-linux64.c b/gdb/features/s390x-vx-linux64.c
new file mode 100644
index 0000000..e66da70
--- /dev/null
+++ b/gdb/features/s390x-vx-linux64.c
@@ -0,0 +1,150 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: s390x-vx-linux64.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_s390x_vx_linux64;
+static void
+initialize_tdesc_s390x_vx_linux64 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  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.vx");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  tdesc_create_reg (feature, "v0l", 54, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v1l", 55, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v2l", 56, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v3l", 57, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v4l", 58, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v5l", 59, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v6l", 60, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v7l", 61, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v8l", 62, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v9l", 63, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v10l", 64, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v11l", 65, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v12l", 66, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v13l", 67, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v14l", 68, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v15l", 69, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "v16", 70, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v17", 71, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v18", 72, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v19", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v20", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v21", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v22", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v23", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v24", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v25", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v26", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v27", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v28", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v29", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v30", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "v31", 85, 1, NULL, 128, "vec128");
+
+  tdesc_s390x_vx_linux64 = result;
+}
diff --git a/gdb/features/s390x-vx-linux64.xml b/gdb/features/s390x-vx-linux64.xml
new file mode 100644
index 0000000..fd2f42e
--- /dev/null
+++ b/gdb/features/s390x-vx-linux64.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:64-bit</architecture>
+  <xi:include href="s390x-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+
+  <feature name="org.gnu.gdb.s390.linux">
+    <reg name="orig_r2" bitsize="64" type="uint64" group="system"/>
+    <reg name="last_break" bitsize="64" type="code_ptr" group="system" save-restore="no"/>
+    <reg name="system_call" bitsize="32" type="uint32" group="system"/>
+  </feature>
+
+  <xi:include href="s390-vx.xml"/>
+</target>
diff --git a/gdb/regformats/s390-tevx-linux64.dat b/gdb/regformats/s390-tevx-linux64.dat
new file mode 100644
index 0000000..3db7a91
--- /dev/null
+++ b/gdb/regformats/s390-tevx-linux64.dat
@@ -0,0 +1,127 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: s390-tevx-linux64.xml
+name:s390_tevx_linux64
+xmltarget:s390-tevx-linux64.xml
+expedite:r14l,r15l,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
+64:v0l
+64:v1l
+64:v2l
+64:v3l
+64:v4l
+64:v5l
+64:v6l
+64:v7l
+64:v8l
+64:v9l
+64:v10l
+64:v11l
+64:v12l
+64:v13l
+64:v14l
+64:v15l
+128:v16
+128:v17
+128:v18
+128:v19
+128:v20
+128:v21
+128:v22
+128:v23
+128:v24
+128:v25
+128:v26
+128:v27
+128:v28
+128:v29
+128:v30
+128:v31
diff --git a/gdb/regformats/s390-vx-linux64.dat b/gdb/regformats/s390-vx-linux64.dat
new file mode 100644
index 0000000..6a821fd
--- /dev/null
+++ b/gdb/regformats/s390-vx-linux64.dat
@@ -0,0 +1,107 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: s390-vx-linux64.xml
+name:s390_vx_linux64
+xmltarget:s390-vx-linux64.xml
+expedite:r14l,r15l,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:v0l
+64:v1l
+64:v2l
+64:v3l
+64:v4l
+64:v5l
+64:v6l
+64:v7l
+64:v8l
+64:v9l
+64:v10l
+64:v11l
+64:v12l
+64:v13l
+64:v14l
+64:v15l
+128:v16
+128:v17
+128:v18
+128:v19
+128:v20
+128:v21
+128:v22
+128:v23
+128:v24
+128:v25
+128:v26
+128:v27
+128:v28
+128:v29
+128:v30
+128:v31
diff --git a/gdb/regformats/s390x-tevx-linux64.dat b/gdb/regformats/s390x-tevx-linux64.dat
new file mode 100644
index 0000000..2df31e6
--- /dev/null
+++ b/gdb/regformats/s390x-tevx-linux64.dat
@@ -0,0 +1,111 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: s390x-tevx-linux64.xml
+name:s390x_tevx_linux64
+xmltarget:s390x-tevx-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
+64:v0l
+64:v1l
+64:v2l
+64:v3l
+64:v4l
+64:v5l
+64:v6l
+64:v7l
+64:v8l
+64:v9l
+64:v10l
+64:v11l
+64:v12l
+64:v13l
+64:v14l
+64:v15l
+128:v16
+128:v17
+128:v18
+128:v19
+128:v20
+128:v21
+128:v22
+128:v23
+128:v24
+128:v25
+128:v26
+128:v27
+128:v28
+128:v29
+128:v30
+128:v31
diff --git a/gdb/regformats/s390x-vx-linux64.dat b/gdb/regformats/s390x-vx-linux64.dat
new file mode 100644
index 0000000..1d8f2b6
--- /dev/null
+++ b/gdb/regformats/s390x-vx-linux64.dat
@@ -0,0 +1,91 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: s390x-vx-linux64.xml
+name:s390x_vx_linux64
+xmltarget:s390x-vx-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:v0l
+64:v1l
+64:v2l
+64:v3l
+64:v4l
+64:v5l
+64:v6l
+64:v7l
+64:v8l
+64:v9l
+64:v10l
+64:v11l
+64:v12l
+64:v13l
+64:v14l
+64:v15l
+128:v16
+128:v17
+128:v18
+128:v19
+128:v20
+128:v21
+128:v22
+128:v23
+128:v24
+128:v25
+128:v26
+128:v27
+128:v28
+128:v29
+128:v30
+128:v31
-- 
1.9.3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 0/4] S390: Vector register support
@ 2015-02-25  9:42 Andreas Arnez
  2015-02-25  9:42 ` [PATCH 1/4] S390: Add target descriptions for vector register sets Andreas Arnez
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Andreas Arnez @ 2015-02-25  9:42 UTC (permalink / raw)
  To: gdb-patches; +Cc: Ulrich Weigand

This patch set adds support to GDB and gdbserver for accessing the
vector registers on S/390 targets.

Andreas Arnez (4):
  S390: Add target descriptions for vector register sets
  S390: Add vector register support to gdb
  S390: Add vector register support to gdbserver
  S390: Vector register test case

 gdb/NEWS                              |   3 +
 gdb/doc/gdb.texinfo                   |   8 ++
 gdb/features/Makefile                 |   7 +-
 gdb/features/s390-tevx-linux64.c      | 188 ++++++++++++++++++++++++++++
 gdb/features/s390-tevx-linux64.xml    |  26 ++++
 gdb/features/s390-vx-linux64.c        | 166 ++++++++++++++++++++++++
 gdb/features/s390-vx-linux64.xml      |  25 ++++
 gdb/features/s390-vx.xml              |  59 +++++++++
 gdb/features/s390x-tevx-linux64.c     | 172 +++++++++++++++++++++++++
 gdb/features/s390x-tevx-linux64.xml   |  25 ++++
 gdb/features/s390x-vx-linux64.c       | 150 ++++++++++++++++++++++
 gdb/features/s390x-vx-linux64.xml     |  24 ++++
 gdb/gdbserver/Makefile.in             |  12 +-
 gdb/gdbserver/configure.srv           |   9 ++
 gdb/gdbserver/linux-s390-low.c        |  94 +++++++++++++-
 gdb/regformats/s390-tevx-linux64.dat  | 127 +++++++++++++++++++
 gdb/regformats/s390-vx-linux64.dat    | 107 ++++++++++++++++
 gdb/regformats/s390x-tevx-linux64.dat | 111 ++++++++++++++++
 gdb/regformats/s390x-vx-linux64.dat   |  91 ++++++++++++++
 gdb/s390-linux-nat.c                  |  84 ++++++++-----
 gdb/s390-linux-tdep.c                 | 229 +++++++++++++++++++++++++++++-----
 gdb/s390-linux-tdep.h                 |  45 ++++++-
 gdb/testsuite/gdb.arch/s390-vregs.S   |  96 ++++++++++++++
 gdb/testsuite/gdb.arch/s390-vregs.exp | 202 ++++++++++++++++++++++++++++++
 24 files changed, 1995 insertions(+), 65 deletions(-)
 create mode 100644 gdb/features/s390-tevx-linux64.c
 create mode 100644 gdb/features/s390-tevx-linux64.xml
 create mode 100644 gdb/features/s390-vx-linux64.c
 create mode 100644 gdb/features/s390-vx-linux64.xml
 create mode 100644 gdb/features/s390-vx.xml
 create mode 100644 gdb/features/s390x-tevx-linux64.c
 create mode 100644 gdb/features/s390x-tevx-linux64.xml
 create mode 100644 gdb/features/s390x-vx-linux64.c
 create mode 100644 gdb/features/s390x-vx-linux64.xml
 create mode 100644 gdb/regformats/s390-tevx-linux64.dat
 create mode 100644 gdb/regformats/s390-vx-linux64.dat
 create mode 100644 gdb/regformats/s390x-tevx-linux64.dat
 create mode 100644 gdb/regformats/s390x-vx-linux64.dat
 create mode 100644 gdb/testsuite/gdb.arch/s390-vregs.S
 create mode 100644 gdb/testsuite/gdb.arch/s390-vregs.exp

-- 
1.9.3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/4] S390: Add vector register support to gdb
  2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
  2015-02-25  9:42 ` [PATCH 1/4] S390: Add target descriptions for vector register sets Andreas Arnez
@ 2015-02-25  9:43 ` Andreas Arnez
  2015-02-25 15:58   ` Eli Zaretskii
  2015-02-25  9:44 ` [PATCH 4/4] S390: Vector register test case Andreas Arnez
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Andreas Arnez @ 2015-02-25  9:43 UTC (permalink / raw)
  To: gdb-patches; +Cc: Ulrich Weigand

Recognize S/390 targets with the new vector feature and present their
vector registers appropriately: as 32 new 128-bit wide registers
v0-v31, where the first 16 embed the floating point registers f0-f15.
Each of the full registers v0-v15 is modelled as a pseudo register.

gdb/ChangeLog:

	* s390-linux-nat.c (have_regset_vxrs): New static variable.
	(s390_linux_fetch_inferior_registers): Handle vector registers, if
	present.
	(s390_linux_store_inferior_registers): Likewise.
	(s390_get_hwcap): Remove function.  Embed its logic...
	(s390_read_description): ...here.  Yield a target description with
	vector registers if applicable.
	* s390-linux-tdep.c: Include "features/s390-vx-linux64.c",
	"features/s390-tevx-linux64.c", "features/s390x-vx-linux64.c", and
	"features/s390x-tevx-linux64.c".
	(struct gdbarch_tdep) <v0_full_regnum>: New field.
	(s390_dwarf_regmap): Add vector registers.  Remove bogus entries
	for "GNU/Linux-specific registers".
	(s390_dwarf_reg_r0l): New enum value.
	(s390_dwarf_reg_to_regnum): Support vector registers.
	(s390_adjust_frame_regnum): Adjust pseudo DWARF register numbers
	of GPR lower halves.
	(regnum_is_vxr_full): New function.
	(s390_register_name): New function.
	(s390_pseudo_register_name): Handle v0-v15, which are composed of
	f0-f15 and v0l-v15l.
	(s390_pseudo_register_type): Likewise.
	(s390_pseudo_register_read): Likewise.
	(s390_pseudo_register_write): Likewise.
	(s390_value_from_register): Account for the fact that values are
	placed left-justified in vector registers.
	(s390_pseudo_register_reggroup_p): Add pseudo registers v0-v15 to
	the vector reggroup and omit them from the general reggroup.
	(s390_regmap_vxrs_low, s390_regmap_vxrs_high): New register maps.
	(s390_vxrs_low_regset, s390_vxrs_high_regset): New regsets.
	(s390_iterate_over_regset_sections): Add iterations for the two
	new vector regsets.
	(s390_core_read_description): Yield a target description with
	vector registers if applicable.
	(s390_gdbarch_init): Handle target descriptions with vector
	registers.  Add "register_name" gdbarch method.
	(_initialize_s390_tdep): Call new tdesc initialization functions.
	* s390-linux-tdep.h (HWCAP_S390_VX): New macro.
	(S390_V0_LOWER_REGNUM, S390_V1_LOWER_REGNUM, S390_V2_LOWER_REGNUM)
	(S390_V3_LOWER_REGNUM, S390_V4_LOWER_REGNUM, S390_V5_LOWER_REGNUM)
	(S390_V6_LOWER_REGNUM, S390_V7_LOWER_REGNUM, S390_V8_LOWER_REGNUM)
	(S390_V9_LOWER_REGNUM, S390_V10_LOWER_REGNUM)
	(S390_V11_LOWER_REGNUM, S390_V12_LOWER_REGNUM)
	(S390_V13_LOWER_REGNUM, S390_V14_LOWER_REGNUM)
	(S390_V15_LOWER_REGNUM, S390_V16_REGNUM, S390_V17_REGNUM)
	(S390_V18_REGNUM, S390_V19_REGNUM, S390_V20_REGNUM)
	(S390_V21_REGNUM, S390_V22_REGNUM, S390_V23_REGNUM)
	(S390_V24_REGNUM, S390_V25_REGNUM, S390_V26_REGNUM)
	(S390_V27_REGNUM, S390_V28_REGNUM, S390_V29_REGNUM)
	(S390_V30_REGNUM, S390_V31_REGNUM): New macros.
	(S390_NUM_REGS): Adjust value.
	(s390_vxrs_low_regset, s390_vxrs_high_regset): Declare.
	(tdesc_s390_vx_linux64, tdesc_s390_tevx_linux64)
	(tdesc_s390x_vx_linux64, tdesc_s390x_tevx_linux64): Likewise.
	* NEWS: Announce S/390 vector register support.
---
 gdb/NEWS              |   3 +
 gdb/s390-linux-nat.c  |  84 +++++++++++-------
 gdb/s390-linux-tdep.c | 229 +++++++++++++++++++++++++++++++++++++++++++-------
 gdb/s390-linux-tdep.h |  45 +++++++++-
 4 files changed, 301 insertions(+), 60 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index b79b162..1c0f079 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -71,6 +71,9 @@ Qbtrace-conf:bts:size
 * GDB now has support for DTrace USDT (Userland Static Defined
   Tracing) probes.  The supported targets are x86_64-*-linux-gnu.
 
+* GDB now supports access to vector registers on S/390 GNU/Linux
+  targets.
+
 *** Changes in GDB 7.9
 
 * GDB now supports hardware watchpoints on x86 GNU Hurd.
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
index 3cfa0f5..367b610 100644
--- a/gdb/s390-linux-nat.c
+++ b/gdb/s390-linux-nat.c
@@ -49,6 +49,7 @@
 static int have_regset_last_break = 0;
 static int have_regset_system_call = 0;
 static int have_regset_tdb = 0;
+static int have_regset_vxrs = 0;
 
 /* Register map for 32-bit executables running under a 64-bit
    kernel.  */
@@ -367,6 +368,18 @@ s390_linux_fetch_inferior_registers (struct target_ops *ops,
     if (regnum == -1 || S390_IS_TDBREGSET_REGNUM (regnum))
       fetch_regset (regcache, tid, NT_S390_TDB, s390_sizeof_tdbregset,
 		    &s390_tdb_regset);
+
+  if (have_regset_vxrs)
+    {
+      if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
+			   && regnum <= S390_V15_LOWER_REGNUM))
+	fetch_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
+		      &s390_vxrs_low_regset);
+      if (regnum == -1 || (regnum >= S390_V16_REGNUM
+			   && regnum <= S390_V31_REGNUM))
+	fetch_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
+		      &s390_vxrs_high_regset);
+    }
 }
 
 /* Store register REGNUM back into the child process.  If REGNUM is
@@ -389,6 +402,18 @@ s390_linux_store_inferior_registers (struct target_ops *ops,
     if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
       store_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
 		    &s390_system_call_regset);
+
+  if (have_regset_vxrs)
+    {
+      if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
+			   && regnum <= S390_V15_LOWER_REGNUM))
+	store_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
+		      &s390_vxrs_low_regset);
+      if (regnum == -1 || (regnum >= S390_V16_REGNUM
+			   && regnum <= S390_V31_REGNUM))
+	store_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
+		      &s390_vxrs_high_regset);
+    }
 }
 
 
@@ -591,19 +616,6 @@ s390_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
   return 1;
 }
 
-#ifdef __s390x__
-static unsigned long
-s390_get_hwcap (void)
-{
-  CORE_ADDR field;
-
-  if (target_auxv_search (&current_target, AT_HWCAP, &field))
-    return (unsigned long) field;
-
-  return 0;
-}
-#endif
-
 static const struct target_desc *
 s390_read_description (struct target_ops *ops)
 {
@@ -614,27 +626,41 @@ s390_read_description (struct target_ops *ops)
   have_regset_system_call
     = check_regset (tid, NT_S390_SYSTEM_CALL, 4);
 
-#ifdef __s390x__
   /* If GDB itself is compiled as 64-bit, we are running on a machine in
      z/Architecture mode.  If the target is running in 64-bit addressing
      mode, report s390x architecture.  If the target is running in 31-bit
      addressing mode, but the kernel supports using 64-bit registers in
      that mode, report s390 architecture with 64-bit GPRs.  */
-
-  have_regset_tdb = (s390_get_hwcap () & HWCAP_S390_TE) ?
-    check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset) : 0;
-
-  if (s390_target_wordsize () == 8)
-    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_tdb ? tdesc_s390_te_linux64 :
-	    have_regset_system_call? tdesc_s390_linux64v2 :
-	    have_regset_last_break? tdesc_s390_linux64v1 :
-	    tdesc_s390_linux64);
+#ifdef __s390x__
+  {
+    CORE_ADDR hwcap = 0;
+
+    target_auxv_search (&current_target, AT_HWCAP, &hwcap);
+    have_regset_tdb = (hwcap & HWCAP_S390_TE)
+      && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
+
+    have_regset_vxrs = (hwcap & HWCAP_S390_VX)
+      && check_regset (tid, NT_S390_VXRS_LOW, 16 * 8)
+      && check_regset (tid, NT_S390_VXRS_HIGH, 16 * 16);
+
+    if (s390_target_wordsize () == 8)
+      return (have_regset_vxrs ?
+	      (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
+	       tdesc_s390x_vx_linux64) :
+	      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 (hwcap & HWCAP_S390_HIGH_GPRS)
+      return (have_regset_vxrs ?
+	      (have_regset_tdb ? tdesc_s390_tevx_linux64 :
+	       tdesc_s390_vx_linux64) :
+	      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
 
   /* If GDB itself is compiled as 31-bit, or if we're running a 31-bit inferior
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
index 9bd25fe..2b631ce 100644
--- a/gdb/s390-linux-tdep.c
+++ b/gdb/s390-linux-tdep.c
@@ -62,10 +62,14 @@
 #include "features/s390-linux64v1.c"
 #include "features/s390-linux64v2.c"
 #include "features/s390-te-linux64.c"
+#include "features/s390-vx-linux64.c"
+#include "features/s390-tevx-linux64.c"
 #include "features/s390x-linux64.c"
 #include "features/s390x-linux64v1.c"
 #include "features/s390x-linux64v2.c"
 #include "features/s390x-te-linux64.c"
+#include "features/s390x-vx-linux64.c"
+#include "features/s390x-tevx-linux64.c"
 
 #define XML_SYSCALL_FILENAME_S390 "syscalls/s390-linux.xml"
 #define XML_SYSCALL_FILENAME_S390X "syscalls/s390x-linux.xml"
@@ -81,6 +85,7 @@ struct gdbarch_tdep
   int gpr_full_regnum;
   int pc_regnum;
   int cc_regnum;
+  int v0_full_regnum;
 
   int have_linux_v1;
   int have_linux_v2;
@@ -148,61 +153,83 @@ s390_write_pc (struct regcache *regcache, CORE_ADDR pc)
 
 static const short s390_dwarf_regmap[] =
 {
-  /* General Purpose Registers.  */
+  /* 0-15: General Purpose Registers.  */
   S390_R0_REGNUM, S390_R1_REGNUM, S390_R2_REGNUM, S390_R3_REGNUM,
   S390_R4_REGNUM, S390_R5_REGNUM, S390_R6_REGNUM, S390_R7_REGNUM,
   S390_R8_REGNUM, S390_R9_REGNUM, S390_R10_REGNUM, S390_R11_REGNUM,
   S390_R12_REGNUM, S390_R13_REGNUM, S390_R14_REGNUM, S390_R15_REGNUM,
 
-  /* Floating Point Registers.  */
+  /* 16-31: Floating Point Registers / Vector Registers 0-15. */
   S390_F0_REGNUM, S390_F2_REGNUM, S390_F4_REGNUM, S390_F6_REGNUM,
   S390_F1_REGNUM, S390_F3_REGNUM, S390_F5_REGNUM, S390_F7_REGNUM,
   S390_F8_REGNUM, S390_F10_REGNUM, S390_F12_REGNUM, S390_F14_REGNUM,
   S390_F9_REGNUM, S390_F11_REGNUM, S390_F13_REGNUM, S390_F15_REGNUM,
 
-  /* Control Registers (not mapped).  */
+  /* 32-47: Control Registers (not mapped).  */
   -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
 
-  /* Access Registers.  */
+  /* 48-63: Access Registers.  */
   S390_A0_REGNUM, S390_A1_REGNUM, S390_A2_REGNUM, S390_A3_REGNUM,
   S390_A4_REGNUM, S390_A5_REGNUM, S390_A6_REGNUM, S390_A7_REGNUM,
   S390_A8_REGNUM, S390_A9_REGNUM, S390_A10_REGNUM, S390_A11_REGNUM,
   S390_A12_REGNUM, S390_A13_REGNUM, S390_A14_REGNUM, S390_A15_REGNUM,
 
-  /* Program Status Word.  */
+  /* 64-65: Program Status Word.  */
   S390_PSWM_REGNUM,
   S390_PSWA_REGNUM,
 
+  /* 66-67: Reserved.  */
+  -1, -1,
+
+  /* 68-83: Vector Registers 16-31.  */
+  S390_V16_REGNUM, S390_V18_REGNUM, S390_V20_REGNUM, S390_V22_REGNUM,
+  S390_V17_REGNUM, S390_V19_REGNUM, S390_V21_REGNUM, S390_V23_REGNUM,
+  S390_V24_REGNUM, S390_V26_REGNUM, S390_V28_REGNUM, S390_V30_REGNUM,
+  S390_V25_REGNUM, S390_V27_REGNUM, S390_V29_REGNUM, S390_V31_REGNUM,
+
+  /* End of "official" DWARF registers.  The remainder of the map is
+     for GDB internal use only.  */
+
   /* GPR Lower Half Access.  */
   S390_R0_REGNUM, S390_R1_REGNUM, S390_R2_REGNUM, S390_R3_REGNUM,
   S390_R4_REGNUM, S390_R5_REGNUM, S390_R6_REGNUM, S390_R7_REGNUM,
   S390_R8_REGNUM, S390_R9_REGNUM, S390_R10_REGNUM, S390_R11_REGNUM,
   S390_R12_REGNUM, S390_R13_REGNUM, S390_R14_REGNUM, S390_R15_REGNUM,
-
-  /* GNU/Linux-specific registers (not mapped).  */
-  -1, -1, -1,
 };
 
+enum { s390_dwarf_reg_r0l = ARRAY_SIZE (s390_dwarf_regmap) - 16 };
+
 /* Convert DWARF register number REG to the appropriate register
    number used by GDB.  */
 static int
 s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int gdb_reg = -1;
 
-  /* In a 32-on-64 debug scenario, debug info refers to the full 64-bit
-     GPRs.  Note that call frame information still refers to the 32-bit
-     lower halves, because s390_adjust_frame_regnum uses register numbers
-     66 .. 81 to access GPRs.  */
+  /* In a 32-on-64 debug scenario, debug info refers to the full
+     64-bit GPRs.  Note that call frame information still refers to
+     the 32-bit lower halves, because s390_adjust_frame_regnum uses
+     special register numbers to access GPRs.  */
   if (tdep->gpr_full_regnum != -1 && reg >= 0 && reg < 16)
     return tdep->gpr_full_regnum + reg;
 
   if (reg >= 0 && reg < ARRAY_SIZE (s390_dwarf_regmap))
-    return s390_dwarf_regmap[reg];
+    gdb_reg = s390_dwarf_regmap[reg];
+
+  if (tdep->v0_full_regnum == -1)
+    {
+      if (gdb_reg >= S390_V16_REGNUM && gdb_reg <= S390_V31_REGNUM)
+	gdb_reg = -1;
+    }
+  else
+    {
+      if (gdb_reg >= S390_F0_REGNUM && gdb_reg <= S390_F15_REGNUM)
+	gdb_reg = gdb_reg - S390_F0_REGNUM + tdep->v0_full_regnum;
+    }
 
-  warning (_("Unmapped DWARF Register #%d encountered."), reg);
-  return -1;
+  return gdb_reg;
 }
 
 /* Translate a .eh_frame register to DWARF register, or adjust a
@@ -211,7 +238,7 @@ static int
 s390_adjust_frame_regnum (struct gdbarch *gdbarch, int num, int eh_frame_p)
 {
   /* See s390_dwarf_reg_to_regnum for comments.  */
-  return (num >= 0 && num < 16)? num + 66 : num;
+  return (num >= 0 && num < 16) ? num + s390_dwarf_reg_r0l : num;
 }
 
 
@@ -225,6 +252,29 @@ regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
 	  && regnum <= tdep->gpr_full_regnum + 15);
 }
 
+/* Check whether REGNUM indicates a full vector register (v0-v15).
+   These pseudo-registers are composed of f0-f15 and v0l-v15l.  */
+
+static int
+regnum_is_vxr_full (struct gdbarch_tdep *tdep, int regnum)
+{
+  return (tdep->v0_full_regnum != -1
+	  && regnum >= tdep->v0_full_regnum
+	  && regnum <= tdep->v0_full_regnum + 15);
+}
+
+/* Return the name of register REGNO.  Return NULL for registers that
+   shouldn't be visible.  */
+
+static const char *
+s390_register_name (struct gdbarch *gdbarch, int regnum)
+{
+  if (regnum >= S390_V0_LOWER_REGNUM
+      && regnum <= S390_V15_LOWER_REGNUM)
+    return NULL;
+  return tdesc_register_name (gdbarch, regnum);
+}
+
 static const char *
 s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 {
@@ -245,6 +295,15 @@ s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
       return full_name[regnum - tdep->gpr_full_regnum];
     }
 
+  if (regnum_is_vxr_full (tdep, regnum))
+    {
+      static const char *full_name[] = {
+	"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
+	"v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15"
+      };
+      return full_name[regnum - tdep->v0_full_regnum];
+    }
+
   internal_error (__FILE__, __LINE__, _("invalid regnum"));
 }
 
@@ -262,6 +321,9 @@ s390_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum_is_gpr_full (tdep, regnum))
     return builtin_type (gdbarch)->builtin_uint64;
 
+  if (regnum_is_vxr_full (tdep, regnum))
+    return tdesc_find_type (gdbarch, "vec128");
+
   internal_error (__FILE__, __LINE__, _("invalid regnum"));
 }
 
@@ -323,6 +385,19 @@ s390_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
       return status;
     }
 
+  if (regnum_is_vxr_full (tdep, regnum))
+    {
+      enum register_status status;
+
+      regnum -= tdep->v0_full_regnum;
+
+      status = regcache_raw_read (regcache, S390_F0_REGNUM + regnum, buf);
+      if (status == REG_VALID)
+	status = regcache_raw_read (regcache,
+				    S390_V0_LOWER_REGNUM + regnum, buf + 8);
+      return status;
+    }
+
   internal_error (__FILE__, __LINE__, _("invalid regnum"));
 }
 
@@ -370,22 +445,34 @@ s390_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
       return;
     }
 
+  if (regnum_is_vxr_full (tdep, regnum))
+    {
+      regnum -= tdep->v0_full_regnum;
+      regcache_raw_write (regcache, S390_F0_REGNUM + regnum, buf);
+      regcache_raw_write (regcache, S390_V0_LOWER_REGNUM + regnum, buf + 8);
+      return;
+    }
+
   internal_error (__FILE__, __LINE__, _("invalid regnum"));
 }
 
 /* 'float' values are stored in the upper half of floating-point
-   registers, even though we are otherwise a big-endian platform.  */
+   registers, even though we are otherwise a big-endian platform.  The
+   same applies to a 'float' value within a vector.  */
 
 static struct value *
 s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
 			  int regnum, struct frame_id frame_id)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   struct value *value = default_value_from_register (gdbarch, type,
 						     regnum, frame_id);
   check_typedef (type);
 
-  if (regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM
-      && TYPE_LENGTH (type) < 8)
+  if ((regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM
+       && TYPE_LENGTH (type) < 8)
+      || regnum_is_vxr_full (tdep, regnum)
+      || (regnum >= S390_V16_REGNUM && regnum <= S390_V31_REGNUM))
     set_value_offset (value, 0);
 
   return value;
@@ -410,6 +497,12 @@ s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
   if (group == save_reggroup || group == restore_reggroup)
     return regnum == tdep->pc_regnum || regnum == tdep->cc_regnum;
 
+  if (group == vector_reggroup)
+    return regnum_is_vxr_full (tdep, regnum);
+
+  if (group == general_reggroup && regnum_is_vxr_full (tdep, regnum))
+    return 0;
+
   return default_register_reggroup_p (gdbarch, regnum, group);
 }
 
@@ -469,6 +562,18 @@ static const struct regcache_map_entry s390_regmap_tdb[] =
     { 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 }
+  };
+
 
 /* Supply the TDB regset.  Like regcache_supply_regset, but invalidate
    the TDB registers unless the TDB format field is valid.  */
@@ -529,6 +634,18 @@ const struct regset s390_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_high_regset = {
+  s390_regmap_vxrs_high,
+  regcache_supply_regset,
+  regcache_collect_regset
+};
+
 /* Iterate over supported core file register note sections. */
 
 static void
@@ -567,37 +684,54 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch,
 						    S390_TDB_DWORD0_REGNUM)))
     cb (".reg-s390-tdb", s390_sizeof_tdbregset, &s390_tdb_regset,
 	"s390 TDB", cb_data);
+
+  if (tdep->v0_full_regnum != -1)
+    {
+      cb (".reg-s390-vxrs-low", 16 * 8, &s390_vxrs_low_regset,
+	  "s390 vector registers 0-15 lower half", cb_data);
+      cb (".reg-s390-vxrs-high", 16 * 16, &s390_vxrs_high_regset,
+	  "s390 vector registers 16-31", cb_data);
+    }
 }
 
 static const struct target_desc *
 s390_core_read_description (struct gdbarch *gdbarch,
 			    struct target_ops *target, bfd *abfd)
 {
-  asection *high_gprs = bfd_get_section_by_name (abfd, ".reg-s390-high-gprs");
-  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");
   CORE_ADDR hwcap = 0;
+  int high_gprs, v1, v2, te, vx;
 
   target_auxv_search (target, AT_HWCAP, &hwcap);
   if (!section)
     return 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);
+  te = (hwcap & HWCAP_S390_TE);
+
   switch (bfd_section_size (abfd, section))
     {
     case s390_sizeof_gregset:
       if (high_gprs)
-	return ((hwcap & HWCAP_S390_TE) ? tdesc_s390_te_linux64 :
-		v2? tdesc_s390_linux64v2 :
-		v1? tdesc_s390_linux64v1 : tdesc_s390_linux64);
+	return (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 ((hwcap & HWCAP_S390_TE) ? tdesc_s390x_te_linux64 :
-	      v2? tdesc_s390x_linux64v2 :
-	      v1? tdesc_s390x_linux64v1 : tdesc_s390x_linux64);
+      return (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;
@@ -2842,6 +2976,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   int have_linux_v1 = 0;
   int have_linux_v2 = 0;
   int have_tdb = 0;
+  int have_vx = 0;
   int first_pseudo_reg, last_pseudo_reg;
   static const char *const stap_register_prefixes[] = { "%", NULL };
   static const char *const stap_register_indirection_prefixes[] = { "(",
@@ -2901,6 +3036,14 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	"tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7",
 	"tr8", "tr9", "tr10", "tr11", "tr12", "tr13", "tr14", "tr15"
       };
+      static const char *const vxrs_low[] = {
+	"v0l", "v1l", "v2l", "v3l", "v4l", "v5l", "v6l", "v7l", "v8l",
+	"v9l", "v10l", "v11l", "v12l", "v13l", "v14l", "v15l",
+      };
+      static const char *const vxrs_high[] = {
+	"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24",
+	"v25", "v26", "v27", "v28", "v29", "v30", "v31",
+      };
       const struct tdesc_feature *feature;
       int i, valid_p = 1;
 
@@ -2989,6 +3132,21 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	  have_tdb = 1;
 	}
 
+      /* Vector registers.  */
+      feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.vx");
+      if (feature)
+	{
+	  for (i = 0; i < 16; i++)
+	    valid_p &= tdesc_numbered_register (feature, tdesc_data,
+						S390_V0_LOWER_REGNUM + i,
+						vxrs_low[i]);
+	  for (i = 0; i < 16; i++)
+	    valid_p &= tdesc_numbered_register (feature, tdesc_data,
+						S390_V16_REGNUM + i,
+						vxrs_high[i]);
+	  have_vx = 1;
+	}
+
       if (!valid_p)
 	{
 	  tdesc_data_cleanup (tdesc_data);
@@ -3058,6 +3216,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_tdesc_pseudo_register_reggroup_p (gdbarch,
 					s390_pseudo_register_reggroup_p);
   tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+  set_gdbarch_register_name (gdbarch, s390_register_name);
 
   /* Assign pseudo register numbers.  */
   first_pseudo_reg = gdbarch_num_regs (gdbarch);
@@ -3068,6 +3227,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       tdep->gpr_full_regnum = last_pseudo_reg;
       last_pseudo_reg += 16;
     }
+  tdep->v0_full_regnum = -1;
+  if (have_vx)
+    {
+      tdep->v0_full_regnum = last_pseudo_reg;
+      last_pseudo_reg += 16;
+    }
   tdep->pc_regnum = last_pseudo_reg++;
   tdep->cc_regnum = last_pseudo_reg++;
   set_gdbarch_pc_regnum (gdbarch, tdep->pc_regnum);
@@ -3173,8 +3338,12 @@ _initialize_s390_tdep (void)
   initialize_tdesc_s390_linux64v1 ();
   initialize_tdesc_s390_linux64v2 ();
   initialize_tdesc_s390_te_linux64 ();
+  initialize_tdesc_s390_vx_linux64 ();
+  initialize_tdesc_s390_tevx_linux64 ();
   initialize_tdesc_s390x_linux64 ();
   initialize_tdesc_s390x_linux64v1 ();
   initialize_tdesc_s390x_linux64v2 ();
   initialize_tdesc_s390x_te_linux64 ();
+  initialize_tdesc_s390x_vx_linux64 ();
+  initialize_tdesc_s390x_tevx_linux64 ();
 }
diff --git a/gdb/s390-linux-tdep.h b/gdb/s390-linux-tdep.h
index a40e813..da6c791 100644
--- a/gdb/s390-linux-tdep.h
+++ b/gdb/s390-linux-tdep.h
@@ -29,6 +29,10 @@
 #define HWCAP_S390_TE 1024
 #endif
 
+#ifndef HWCAP_S390_VX
+#define HWCAP_S390_VX 2048
+#endif
+
 /* Register information.  */
 
 /* Program Status Word.  */
@@ -129,8 +133,41 @@
 #define S390_TDB_R13_REGNUM 87
 #define S390_TDB_R14_REGNUM 88
 #define S390_TDB_R15_REGNUM 89
+/* Vector registers.  */
+#define S390_V0_LOWER_REGNUM 90
+#define S390_V1_LOWER_REGNUM 91
+#define S390_V2_LOWER_REGNUM 92
+#define S390_V3_LOWER_REGNUM 93
+#define S390_V4_LOWER_REGNUM 94
+#define S390_V5_LOWER_REGNUM 95
+#define S390_V6_LOWER_REGNUM 96
+#define S390_V7_LOWER_REGNUM 97
+#define S390_V8_LOWER_REGNUM 98
+#define S390_V9_LOWER_REGNUM 99
+#define S390_V10_LOWER_REGNUM 100
+#define S390_V11_LOWER_REGNUM 101
+#define S390_V12_LOWER_REGNUM 102
+#define S390_V13_LOWER_REGNUM 103
+#define S390_V14_LOWER_REGNUM 104
+#define S390_V15_LOWER_REGNUM 105
+#define S390_V16_REGNUM 106
+#define S390_V17_REGNUM 107
+#define S390_V18_REGNUM 108
+#define S390_V19_REGNUM 109
+#define S390_V20_REGNUM 110
+#define S390_V21_REGNUM 111
+#define S390_V22_REGNUM 112
+#define S390_V23_REGNUM 113
+#define S390_V24_REGNUM 114
+#define S390_V25_REGNUM 115
+#define S390_V26_REGNUM 116
+#define S390_V27_REGNUM 117
+#define S390_V28_REGNUM 118
+#define S390_V29_REGNUM 119
+#define S390_V30_REGNUM 120
+#define S390_V31_REGNUM 121
 /* Total.  */
-#define S390_NUM_REGS 90
+#define S390_NUM_REGS 122
 
 /* Special register usage.  */
 #define S390_SP_REGNUM S390_R15_REGNUM
@@ -159,6 +196,8 @@ extern const struct regset s390x_last_break_regset;
 extern const struct regset s390_system_call_regset;
 extern const struct regset s390_tdb_regset;
 #define s390_sizeof_tdbregset 0x100
+extern const struct regset s390_vxrs_low_regset;
+extern const struct regset s390_vxrs_high_regset;
 
 /* GNU/Linux target descriptions.  */
 extern struct target_desc *tdesc_s390_linux32;
@@ -168,9 +207,13 @@ 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_s390_vx_linux64;
+extern struct target_desc *tdesc_s390_tevx_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;
+extern struct target_desc *tdesc_s390x_vx_linux64;
+extern struct target_desc *tdesc_s390x_tevx_linux64;
 
 #endif
-- 
1.9.3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 3/4] S390: Add vector register support to gdbserver
  2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
                   ` (2 preceding siblings ...)
  2015-02-25  9:44 ` [PATCH 4/4] S390: Vector register test case Andreas Arnez
@ 2015-02-25  9:44 ` Andreas Arnez
  2015-02-27 20:43 ` [PATCH 0/4] S390: Vector register support Ulrich Weigand
  4 siblings, 0 replies; 8+ messages in thread
From: Andreas Arnez @ 2015-02-25  9:44 UTC (permalink / raw)
  To: gdb-patches; +Cc: Ulrich Weigand

On S/390 targets with vector registers, enable gdbserver to advertise
and handle the feature "org.gnu.gdb.s390.vx".

gdb/gdbserver/ChangeLog:

	* Makefile.in (s390-vx-linux64.c, s390-tevx-linux64.c)
	(s390x-vx-linux64.c, s390x-tevx-linux64.c): New rules.
	(clean): Add "rm -f" for above C files.
	* configure.srv (srv_regobj): Add s390-vx-linux64.o,
	s390-tevx-linux64.o, s390x-vx-linux64.o, and s390x-tevx-linux64.o.
	(srv_xmlfiles): Add s390-vx-linux64.xml, s390-tevx-linux64.xml,
	s390x-vx-linux64.xml, s390x-tevx-linux64.xml, and s390-vx.xml.
	* linux-s390-low.c (HWCAP_S390_VX): New macro.
	(init_registers_s390_vx_linux64, init_registers_s390_tevx_linux64)
	(init_registers_s390x_vx_linux64)
	(init_registers_s390x_tevx_linux64)
	(tdesc_s390_vx_linux64, tdesc_s390_tevx_linux64)
	(tdesc_s390x_vx_linux64, tdesc_s390x_tevx_linux64): New extern
	declarations.
	(s390_fill_vxrs_low, s390_store_vxrs_low, s390_fill_vxrs_high)
	(s390_store_vxrs_high): New functions.
	(s390_regsets): Add entries for NT_S390_VXRS_LOW and
	NT_S390_VXRS_HIGH.
	(s390_arch_setup): Add logic for selecting one of the new target
	descriptions.  Activate the new vector regsets if applicable.
	(initialize_low_arch): Also invoke init_registers_s390_vx_linux64,
	init_registers_s390_tevx_linux64, init_registers_s390x_vx_linux64,
	and init_registers_s390x_tevx_linux64.
---
 gdb/gdbserver/Makefile.in      | 12 +++++-
 gdb/gdbserver/configure.srv    |  9 ++++
 gdb/gdbserver/linux-s390-low.c | 94 ++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 111 insertions(+), 4 deletions(-)

diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index e479c7c..2edfdf9 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -358,7 +358,9 @@ clean:
 	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 s390-te-linux64.c s390x-te-linux64.c
+	rm -f s390-vx-linux64.c s390x-vx-linux64.c
+	rm -f s390-tevx-linux64.c s390x-tevx-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
@@ -701,6 +703,10 @@ 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
+s390-vx-linux64.c : $(srcdir)/../regformats/s390-vx-linux64.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-vx-linux64.dat s390-vx-linux64.c
+s390-tevx-linux64.c : $(srcdir)/../regformats/s390-tevx-linux64.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-tevx-linux64.dat s390-tevx-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)
@@ -709,6 +715,10 @@ 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
+s390x-vx-linux64.c : $(srcdir)/../regformats/s390x-vx-linux64.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-vx-linux64.dat s390x-vx-linux64.c
+s390x-tevx-linux64.c : $(srcdir)/../regformats/s390x-tevx-linux64.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-tevx-linux64.dat s390x-tevx-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
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 127786e..98dd0d9 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -260,10 +260,14 @@ case "${target}" in
 			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} s390-vx-linux64.o"
+			srv_regobj="${srv_regobj} s390-tevx-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_regobj="${srv_regobj} s390x-vx-linux64.o"
+			srv_regobj="${srv_regobj} s390x-tevx-linux64.o"
 			srv_tgtobj="$srv_linux_obj linux-s390-low.o"
 			srv_xmlfiles="s390-linux32.xml"
 			srv_xmlfiles="${srv_xmlfiles} s390-linux32v1.xml"
@@ -272,16 +276,21 @@ case "${target}" in
 			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} s390-vx-linux64.xml"
+			srv_xmlfiles="${srv_xmlfiles} s390-tevx-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} s390x-vx-linux64.xml"
+			srv_xmlfiles="${srv_xmlfiles} s390x-tevx-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_xmlfiles="${srv_xmlfiles} s390-vx.xml"
 			srv_linux_usrregs=yes
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
diff --git a/gdb/gdbserver/linux-s390-low.c b/gdb/gdbserver/linux-s390-low.c
index b9631bf..afee1ff 100644
--- a/gdb/gdbserver/linux-s390-low.c
+++ b/gdb/gdbserver/linux-s390-low.c
@@ -36,6 +36,10 @@
 #define HWCAP_S390_TE 1024
 #endif
 
+#ifndef HWCAP_S390_VX
+#define HWCAP_S390_VX 2048
+#endif
+
 #ifndef PTRACE_GETREGSET
 #define PTRACE_GETREGSET 0x4204
 #endif
@@ -72,6 +76,14 @@ extern const struct target_desc *tdesc_s390_linux64v2;
 void init_registers_s390_te_linux64 (void);
 extern const struct target_desc *tdesc_s390_te_linux64;
 
+/* Defined in auto-generated file s390-vx-linux64.c.  */
+void init_registers_s390_vx_linux64 (void);
+extern const struct target_desc *tdesc_s390_vx_linux64;
+
+/* Defined in auto-generated file s390-tevx-linux64.c.  */
+void init_registers_s390_tevx_linux64 (void);
+extern const struct target_desc *tdesc_s390_tevx_linux64;
+
 /* Defined in auto-generated file s390x-linux64.c.  */
 void init_registers_s390x_linux64 (void);
 extern const struct target_desc *tdesc_s390x_linux64;
@@ -88,6 +100,14 @@ extern const struct target_desc *tdesc_s390x_linux64v2;
 void init_registers_s390x_te_linux64 (void);
 extern const struct target_desc *tdesc_s390x_te_linux64;
 
+/* Defined in auto-generated file s390x-vx-linux64.c.  */
+void init_registers_s390x_vx_linux64 (void);
+extern const struct target_desc *tdesc_s390x_vx_linux64;
+
+/* Defined in auto-generated file s390x-tevx-linux64.c.  */
+void init_registers_s390x_tevx_linux64 (void);
+extern const struct target_desc *tdesc_s390x_tevx_linux64;
+
 #define s390_num_regs 52
 
 static int s390_regmap[] = {
@@ -324,6 +344,46 @@ s390_store_tdb (struct regcache *regcache, const void *buf)
     supply_register (regcache, tr0 + i, (const char *) buf + 8 * (16 + i));
 }
 
+static void
+s390_fill_vxrs_low (struct regcache *regcache, void *buf)
+{
+  int v0 = find_regno (regcache->tdesc, "v0l");
+  int i;
+
+  for (i = 0; i < 16; i++)
+    collect_register (regcache, v0 + i, (char *) buf + 8 * i);
+}
+
+static void
+s390_store_vxrs_low (struct regcache *regcache, const void *buf)
+{
+  int v0 = find_regno (regcache->tdesc, "v0l");
+  int i;
+
+  for (i = 0; i < 16; i++)
+    supply_register (regcache, v0 + i, (const char *) buf + 8 * i);
+}
+
+static void
+s390_fill_vxrs_high (struct regcache *regcache, void *buf)
+{
+  int v16 = find_regno (regcache->tdesc, "v16");
+  int i;
+
+  for (i = 0; i < 16; i++)
+    collect_register (regcache, v16 + i, (char *) buf + 16 * i);
+}
+
+static void
+s390_store_vxrs_high (struct regcache *regcache, const void *buf)
+{
+  int v16 = find_regno (regcache->tdesc, "v16");
+  int i;
+
+  for (i = 0; i < 16; i++)
+    supply_register (regcache, v16 + i, (const char *) buf + 16 * i);
+}
+
 static struct regset_info s390_regsets[] = {
   { 0, 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL },
   /* Last break address is read-only; no fill function.  */
@@ -334,6 +394,10 @@ static struct regset_info s390_regsets[] = {
   /* TDB is read-only.  */
   { PTRACE_GETREGSET, -1, NT_S390_TDB, 0, EXTENDED_REGS,
     NULL, s390_store_tdb },
+  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_S390_VXRS_LOW, 0,
+    EXTENDED_REGS, s390_fill_vxrs_low, s390_store_vxrs_low },
+  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_S390_VXRS_HIGH, 0,
+    EXTENDED_REGS, s390_fill_vxrs_high, s390_store_vxrs_high },
   { 0, 0, 0, -1, -1, NULL, NULL }
 };
 
@@ -439,6 +503,8 @@ s390_arch_setup (void)
   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);
+  int have_regset_vxrs = s390_check_regset (pid, NT_S390_VXRS_LOW, 128)
+    && s390_check_regset (pid, NT_S390_VXRS_HIGH, 256);
 
   /* Assume 31-bit inferior process.  */
   if (have_regset_system_call)
@@ -464,8 +530,14 @@ s390_arch_setup (void)
 	if (have_regset_tdb)
 	  have_regset_tdb =
 	    (s390_get_hwcap (tdesc_s390x_linux64v2) & HWCAP_S390_TE) != 0;
-
-	if (have_regset_tdb)
+	if (have_regset_vxrs)
+	  have_regset_vxrs =
+	    (s390_get_hwcap (tdesc_s390x_linux64v2) & HWCAP_S390_VX) != 0;
+
+	if (have_regset_vxrs)
+	  tdesc = (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
+		   tdesc_s390x_vx_linux64);
+	else if (have_regset_tdb)
 	  tdesc = tdesc_s390x_te_linux64;
 	else if (have_regset_system_call)
 	  tdesc = tdesc_s390x_linux64v2;
@@ -482,8 +554,13 @@ s390_arch_setup (void)
 	have_hwcap_s390_high_gprs = 1;
 	if (have_regset_tdb)
 	  have_regset_tdb = (s390_get_hwcap (tdesc) & HWCAP_S390_TE) != 0;
+	if (have_regset_vxrs)
+	  have_regset_vxrs = (s390_get_hwcap (tdesc) & HWCAP_S390_VX) != 0;
 
-	if (have_regset_tdb)
+	if (have_regset_vxrs)
+	  tdesc = (have_regset_tdb ? tdesc_s390_tevx_linux64 :
+		   tdesc_s390_vx_linux64);
+	else if (have_regset_tdb)
 	  tdesc = tdesc_s390_te_linux64;
 	else if (have_regset_system_call)
 	  tdesc = tdesc_s390_linux64v2;
@@ -508,6 +585,13 @@ s390_arch_setup (void)
 	  break;
 	case NT_S390_TDB:
 	  regset->size = have_regset_tdb ? 256 : 0;
+	  break;
+	case NT_S390_VXRS_LOW:
+	  regset->size = have_regset_vxrs ? 128 : 0;
+	  break;
+	case NT_S390_VXRS_HIGH:
+	  regset->size = have_regset_vxrs ? 256 : 0;
+	  break;
 	default:
 	  break;
 	}
@@ -615,10 +699,14 @@ initialize_low_arch (void)
   init_registers_s390_linux64v1 ();
   init_registers_s390_linux64v2 ();
   init_registers_s390_te_linux64 ();
+  init_registers_s390_vx_linux64 ();
+  init_registers_s390_tevx_linux64 ();
   init_registers_s390x_linux64 ();
   init_registers_s390x_linux64v1 ();
   init_registers_s390x_linux64v2 ();
   init_registers_s390x_te_linux64 ();
+  init_registers_s390x_vx_linux64 ();
+  init_registers_s390x_tevx_linux64 ();
 
   initialize_regsets_info (&s390_regsets_info);
 #ifdef __s390x__
-- 
1.9.3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 4/4] S390: Vector register test case
  2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
  2015-02-25  9:42 ` [PATCH 1/4] S390: Add target descriptions for vector register sets Andreas Arnez
  2015-02-25  9:43 ` [PATCH 2/4] S390: Add vector register support to gdb Andreas Arnez
@ 2015-02-25  9:44 ` Andreas Arnez
  2015-02-25  9:44 ` [PATCH 3/4] S390: Add vector register support to gdbserver Andreas Arnez
  2015-02-27 20:43 ` [PATCH 0/4] S390: Vector register support Ulrich Weigand
  4 siblings, 0 replies; 8+ messages in thread
From: Andreas Arnez @ 2015-02-25  9:44 UTC (permalink / raw)
  To: gdb-patches; +Cc: Ulrich Weigand

Add a test case for S/390 vector registers support.

gdb/testsuite/ChangeLog:

	* gdb.arch/s390-vregs.exp: New test.
	* gdb.arch/s390-vregs.S: New file.
---
 gdb/testsuite/gdb.arch/s390-vregs.S   |  96 ++++++++++++++++
 gdb/testsuite/gdb.arch/s390-vregs.exp | 202 ++++++++++++++++++++++++++++++++++
 2 files changed, 298 insertions(+)
 create mode 100644 gdb/testsuite/gdb.arch/s390-vregs.S
 create mode 100644 gdb/testsuite/gdb.arch/s390-vregs.exp

diff --git a/gdb/testsuite/gdb.arch/s390-vregs.S b/gdb/testsuite/gdb.arch/s390-vregs.S
new file mode 100644
index 0000000..4b48a83
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/s390-vregs.S
@@ -0,0 +1,96 @@
+/* Copyright 2015 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 <http://www.gnu.org/licenses/>.  */
+
+	.text
+
+	/* 'check_vx': Yield SIGILL unless vector support is
+	available.  Have a "pit stop" breakpoint here.  */
+
+	.align	8
+	.type	check_vx, @function
+check_vx:
+	.cfi_startproc
+	/* vlr  %v0,%v0 */
+	.byte 0xe7,0x00,0x00,0x00,0x00,0x56
+	br	%r14
+	.cfi_endproc
+	.size	check_vx, .-check_vx
+
+
+	/* 'store_vrs': Store vector registers in save_area.  */
+
+	.align 8
+	.type	store_vrs, @function
+store_vrs:
+	.cfi_startproc
+	larl	%r1,save_area
+	/* vstm %v0,%v15,0(%r1) */
+	.byte 0xe7,0x0f,0x10,0x00,0x00,0x3e
+	/* vstm %v16,%v31,256(%r1) */
+	.byte 0xe7,0x0f,0x11,0x00,0x0c,0x3e
+	br	%r14
+	.cfi_endproc
+	.size	store_vrs, .-store_vrs
+
+
+	/* 'change_vrs': Manipulate vector registers according to a
+	simple algorithm.  */
+
+	.align 8
+	.type	change_vrs, @function
+change_vrs:
+	.cfi_startproc
+	lghi	%r1,16
+	lghi	%r3,0xff
+1:	exrl	%r3,2f
+	exrl	%r3,1f
+	aghi	%r3,-0x11
+	brctg	%r1,1b
+	br	%r14
+	.cfi_endproc
+	/* vmlf %v0,%v0,%v0 */
+1:	.byte	0xe7,0x00,0x00,0x00,0x20,0xa2
+	/* vmlf %v16,%v16,%v0 */
+2:	.byte	0xe7,0x00,0x00,0x00,0x2c,0xa2
+
+
+	/* 'main': Perform actions according to test case logic.
+	Invoke check_vx whenever a pit stop is required.  */
+
+	.section	.text.startup,"ax",@progbits
+	.align	8
+.globl main
+	.type	main, @function
+main:
+	.cfi_startproc
+	stmg	%r14,%r15,112(%r15)
+	aghi	%r15,-160
+	bras	%r14,check_vx
+	bras	%r14,store_vrs
+	bras	%r14,check_vx
+	bras	%r14,change_vrs
+	bras	%r14,check_vx
+	lmg	%r14,%r15,272(%r15)
+	lghi	%r2,0
+	br	%r14
+	.cfi_endproc
+	.size	main, .-main
+
+	.local	save_area
+	.comm	save_area,512,16
+
+	.section	.note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.arch/s390-vregs.exp b/gdb/testsuite/gdb.arch/s390-vregs.exp
new file mode 100644
index 0000000..8333c32
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/s390-vregs.exp
@@ -0,0 +1,202 @@
+# Copyright 2015 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 <http://www.gnu.org/licenses/>.
+
+# Test vector register access for s390 platforms.
+
+if { ![istarget s390-*-*] && ![istarget s390x-*-* ] } {
+    verbose "Skipping s390 vector register tests."
+    return
+}
+
+standard_testfile .S
+
+if [isnative] {
+    # Create a temporary directory, to take a core dump there later.
+    set coredir [standard_output_file ${testfile}.d]
+    remote_exec build "rm -rf $coredir"
+    remote_exec build "mkdir $coredir"
+}
+
+if { [prepare_for_testing ${testfile}.exp $testfile $srcfile] } {
+    return -1
+}
+
+if ![runto_main] {
+    untested "could not run to main"
+    return -1
+}
+
+# Run to the first vector instruction and step it.  If the inferior
+# doesn't crash, we have vector support.
+
+gdb_breakpoint "check_vx"
+gdb_continue_to_breakpoint "first vector insn"
+set before_pc 0
+gdb_test_multiple "x/i \$pc" "get PC at vector insn" {
+    -re "(0x\\S+)\\s+\\S+\\s+vlr\\s+.*$gdb_prompt $" {
+	set before_pc $expect_out(1,string)
+    }
+}
+
+gdb_test_multiple "stepi" "check for vector support" {
+    -re "Program received signal SIGILL,.*\r\n$gdb_prompt $" {
+	unsupported "no vector support."
+	return
+    }
+    -re "\[0-9\]+.*\r\n$gdb_prompt $" {
+	pass "vector support available"
+    }
+    -re "$gdb_prompt $" {
+	fail "no vector support (unknown error)"
+	return
+    }
+}
+
+# Has the PC advanced by the expected amount?  The kernel may do
+# something special for the first vector insn in the process.
+
+set after_pc 0
+gdb_test_multiple "x/i \$pc" "get PC after vector insn" {
+    -re "(0x\\S+)\\s+.*$gdb_prompt $" {
+	set after_pc $expect_out(1,string)
+    }
+}
+
+if [expr $before_pc + 6 != $after_pc] {
+    fail "stepping first vector insn"
+}
+
+# Lift the core file limit, if possible, and change into the temporary
+# directory.
+
+if { $coredir != "" } {
+    gdb_test {print setrlimit (4, &(unsigned long [2]){~0UL, ~0UL})} \
+	" = .*" "setrlimit"
+    gdb_test "print chdir (\"${coredir}\")" " = 0" "chdir"
+}
+
+# Initialize all vector registers with GDB "set" commands, using
+# distinct values.  Handle left and right halves separately, in
+# pseudo-random order.
+
+set a_high 1
+set a_low 2
+set b_high 3
+set b_low 5
+
+set a [expr ($a_high << 32) | $a_low]
+set b [expr ($b_high << 32) | $b_low]
+
+for {set j 0} {$j < 32} {incr j 1} {
+    set i [expr 17 * $j % 32]
+    gdb_test_no_output \
+	"set \$v$i.v2_int64\[0\] = [expr $a * ($i + 1)]" \
+	"set v$i left"
+    set i [expr 19 * (31 - $j) % 32]
+    gdb_test_no_output \
+	"set \$v$i.v2_int64\[1\] = [expr $b * (32 - $i)]" \
+	"set v$i right"
+}
+
+# Verify a vector register's union members.
+
+gdb_test "info register v0 v31" \
+    "v4_float .* v2_double .* v16_int8 .* v8_int16 .* v4_int32 .* v2_int64 .* uint128\
+     .*v4_float .* v2_double .* v16_int8 .* v8_int16 .* v4_int32 .* v2_int64 .* uint128 .*"
+
+# Let the inferior store all vector registers in a buffer, then dump
+# the buffer and check it.
+
+gdb_continue_to_breakpoint "store vrs"
+set vregs [capture_command_output "x/64xg &save_area" ""]
+
+set i 0
+foreach {- left right} [regexp -all -inline -line {^.*:\s+(\w+)\s+(\w+)} $vregs] {
+    if [expr $left != $a * ($i + 1) || $right != $b * (32 - $i)] {
+	fail "verify \$v$i after set"
+    }
+    if { $i < 16 } {
+	# Check that the FP register was updated accordingly.
+	gdb_test "info register f$i" "raw ${left}.*"
+    }
+    incr i 1
+}
+
+if { $i != 32 } {
+    fail "dump save area (bad output)"
+}
+
+# Let the inferior change all VRs according to a simple algorithm,
+# then print all VRs and compare their values with our result of the
+# same algorithm.
+
+gdb_continue_to_breakpoint "change vrs"
+set vregs [capture_command_output "info registers vector" ""]
+
+set j 1
+foreach {- r i val} [regexp -all -inline -line \
+			 {^(\D*)(\d+)\s+.*?uint128 = 0x([0-9a-f]+?)} $vregs] {
+    if { $r ne "v" } {
+	fail "info registers vector: bad line $j"
+    } elseif { $val ne [format %08x%08x%08x%08x \
+			    [expr $a_high * ($i + 1) * $a_high ] \
+			    [expr $a_low * ($i + 1) * $a_low ] \
+			    [expr $b_high * (32 - $i) * $b_high * 32] \
+			    [expr $b_low * (32 - $i) * $b_low * 32] ] } {
+	fail "compare \$v$i"
+    }
+    incr j 1
+}
+
+if { $j != 33 } {
+    fail "info registers vector"
+}
+
+if { $coredir == "" } {
+    return
+}
+
+# Take a core dump.
+
+gdb_test "signal SIGABRT" "Program terminated with signal SIGABRT, .*"
+gdb_exit
+
+# Find the core file and rename it (avoid accumulating core files).
+
+set cores [glob -nocomplain -directory $coredir *core*]
+if {[llength $cores] != 1} {
+    untested "core file not found"
+    remote_exec build "rm -rf $coredir"
+    return -1
+}
+set destcore [standard_output_file ${testfile}.core]
+remote_exec build "mv [file join $coredir [lindex $cores 0]] $destcore"
+remote_exec build "rm -rf $coredir"
+
+# Restart gdb and load the core file.  Compare the VRs.
+
+clean_restart ${testfile}
+
+with_test_prefix "core" {
+    set core_loaded [gdb_core_cmd $destcore "load"]
+    if { $core_loaded != -1 } {
+	set vregs_from_core [capture_command_output "info registers vector" ""]
+	if { $vregs_from_core eq $vregs } {
+	    pass "compare vector registers"
+	} else {
+	    fail "vector registers mismatch"
+	}
+    }
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/4] S390: Add target descriptions for vector register sets
  2015-02-25  9:42 ` [PATCH 1/4] S390: Add target descriptions for vector register sets Andreas Arnez
@ 2015-02-25 15:58   ` Eli Zaretskii
  0 siblings, 0 replies; 8+ messages in thread
From: Eli Zaretskii @ 2015-02-25 15:58 UTC (permalink / raw)
  To: Andreas Arnez; +Cc: gdb-patches, uweigand

> From: Andreas Arnez <arnez@linux.vnet.ibm.com>
> Cc: Ulrich Weigand <uweigand@de.ibm.com>
> Date: Wed, 25 Feb 2015 10:41:18 +0100
> 
> The IBM z13 has new vector registers v0-v31 which are presented by the
> Linux kernel as two additional register sets.  This patch adds XML
> descriptions and the respective autogenerated .c and .dat files for
> S390 targets with this feature.  Note that supported combinations
> include targets with and without a transactional execution facility.
> 
> gdb/ChangeLog:
> 
> 	* features/s390-tevx-linux64.xml: New file.
> 	* features/s390-vx-linux64.xml: New file.
> 	* features/s390-vx.xml: New file.
> 	* features/s390x-tevx-linux64.xml: New file.
> 	* features/s390x-vx-linux64.xml: New file.
> 	* features/Makefile (WHICH): Add s390-vx-linux64,
> 	s390x-vx-linux64, s390-tevx-linux64, and s390x-tevx-linux64.
> 	(s390-vx-linux64-expedite, s390-tevx-linux64-expedite)
> 	(s390x-vx-linux64-expedite, s390x-tevx-linux64-expedite): New
> 	macros.
> 	* features/s390-tevx-linux64.c: New generated file.
> 	* features/s390-vx-linux64.c: Likewise.
> 	* features/s390x-tevx-linux64.c: Likewise.
> 	* features/s390x-vx-linux64.c: Likewise.
> 	* regformats/s390-tevx-linux64.dat: Likewise.
> 	* regformats/s390-vx-linux64.dat: Likewise.
> 	* regformats/s390x-tevx-linux64.dat: Likewise.
> 	* regformats/s390x-vx-linux64.dat: Likewise.
> 
> gdb/doc/ChangeLog:
> 
> 	* gdb.texinfo (S/390 and System z Features): Describe new feature
> 	"org.gnu.gdb.s390.vx".

OK for the documentation part.

Thanks.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/4] S390: Add vector register support to gdb
  2015-02-25  9:43 ` [PATCH 2/4] S390: Add vector register support to gdb Andreas Arnez
@ 2015-02-25 15:58   ` Eli Zaretskii
  0 siblings, 0 replies; 8+ messages in thread
From: Eli Zaretskii @ 2015-02-25 15:58 UTC (permalink / raw)
  To: Andreas Arnez; +Cc: gdb-patches, uweigand

> From: Andreas Arnez <arnez@linux.vnet.ibm.com>
> Cc: Ulrich Weigand <uweigand@de.ibm.com>
> Date: Wed, 25 Feb 2015 10:41:19 +0100
> 
> diff --git a/gdb/NEWS b/gdb/NEWS
> index b79b162..1c0f079 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -71,6 +71,9 @@ Qbtrace-conf:bts:size
>  * GDB now has support for DTrace USDT (Userland Static Defined
>    Tracing) probes.  The supported targets are x86_64-*-linux-gnu.
>  
> +* GDB now supports access to vector registers on S/390 GNU/Linux
> +  targets.
> +
>  *** Changes in GDB 7.9
>  
>  * GDB now supports hardware watchpoints on x86 GNU Hurd.

This part is OK, thanks.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/4] S390: Vector register support
  2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
                   ` (3 preceding siblings ...)
  2015-02-25  9:44 ` [PATCH 3/4] S390: Add vector register support to gdbserver Andreas Arnez
@ 2015-02-27 20:43 ` Ulrich Weigand
  4 siblings, 0 replies; 8+ messages in thread
From: Ulrich Weigand @ 2015-02-27 20:43 UTC (permalink / raw)
  To: Andreas Arnez; +Cc: gdb-patches

Andreas Arnez wrote:

> This patch set adds support to GDB and gdbserver for accessing the
> vector registers on S/390 targets.
> 
> Andreas Arnez (4):
>   S390: Add target descriptions for vector register sets
>   S390: Add vector register support to gdb
>   S390: Add vector register support to gdbserver
>   S390: Vector register test case

These are all OK.

Thanks,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-02-27 20:43 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-25  9:42 [PATCH 0/4] S390: Vector register support Andreas Arnez
2015-02-25  9:42 ` [PATCH 1/4] S390: Add target descriptions for vector register sets Andreas Arnez
2015-02-25 15:58   ` Eli Zaretskii
2015-02-25  9:43 ` [PATCH 2/4] S390: Add vector register support to gdb Andreas Arnez
2015-02-25 15:58   ` Eli Zaretskii
2015-02-25  9:44 ` [PATCH 4/4] S390: Vector register test case Andreas Arnez
2015-02-25  9:44 ` [PATCH 3/4] S390: Add vector register support to gdbserver Andreas Arnez
2015-02-27 20:43 ` [PATCH 0/4] S390: Vector register support Ulrich Weigand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox