diff --git a/gdb-rhbz1498758-1of5.patch b/gdb-rhbz1498758-1of5.patch
new file mode 100755
index 0000000..5bfff73
--- /dev/null
+++ b/gdb-rhbz1498758-1of5.patch
@@ -0,0 +1,46 @@
+commit 8fe09d7421db51bc13c9228547d63e6315bd6bd0
+Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
+Date:   Thu Sep 21 17:45:18 2017 +0200
+
+    S/390: Fix Elf note swap s390_gs_bc vs. s390_gs_cb
+    
+    Fix two typos that resulted in swapping the BFD names for the core note
+    register sections NT_S390_GS_CB and NT_S390_GS_BC.
+    
+    bfd/ChangeLog:
+    
+            * elf.c (elfcore_grok_note): For the cases NT_S390_GS_CB and
+            NT_S390_GS_BC, correct the previously swapped invocations of
+            elfcore_grok_s390_gs_bc and elfcore_grok_s390_gs_cb.
+
+### a/bfd/ChangeLog
+### b/bfd/ChangeLog
+## -1,3 +1,9 @@
++2017-09-21  Andreas Arnez  <arnez@linux.vnet.ibm.com>
++
++	* elf.c (elfcore_grok_note): For the cases NT_S390_GS_CB and
++	NT_S390_GS_BC, correct the previously swapped invocations of
++	elfcore_grok_s390_gs_bc and elfcore_grok_s390_gs_cb.
++
+ 2017-09-19  Alan Modra  <amodra@gmail.com>
+ 
+ 	PR 21441
+--- a/bfd/elf.c
++++ b/bfd/elf.c
+@@ -9698,14 +9698,14 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
+     case NT_S390_GS_CB:
+       if (note->namesz == 6
+ 	  && strcmp (note->namedata, "LINUX") == 0)
+-	return elfcore_grok_s390_gs_bc (abfd, note);
++	return elfcore_grok_s390_gs_cb (abfd, note);
+       else
+ 	return TRUE;
+ 
+     case NT_S390_GS_BC:
+       if (note->namesz == 6
+ 	  && strcmp (note->namedata, "LINUX") == 0)
+-	return elfcore_grok_s390_gs_cb (abfd, note);
++	return elfcore_grok_s390_gs_bc (abfd, note);
+       else
+ 	return TRUE;
+ 
diff --git a/gdb-rhbz1498758-2of5.patch b/gdb-rhbz1498758-2of5.patch
new file mode 100755
index 0000000..0e71e05
--- /dev/null
+++ b/gdb-rhbz1498758-2of5.patch
@@ -0,0 +1,816 @@
+commit 96235dc1ac3730c4e490d19db2e8287c0a40f307
+Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
+Date:   Mon Sep 25 16:02:23 2017 +0200
+
+    S390: Add guarded-storage register definitions and tdescs
+    
+    Newer Linux kernel versions offer two new register sets in support of the
+    z/Architecture's guarded storage facility.  This patch adds XML
+    descriptions and the respective autogenerated .c and .dat files for
+    s390/s390x targets with this feature.
+    
+    gdb/ChangeLog:
+    
+            * features/s390-gs-linux64.xml: New file.
+            * features/s390-gs.xml: New file.
+            * features/s390-gsbc.xml: New file.
+            * features/s390x-gs-linux64.xml: New file.
+            * features/Makefile (WHICH): Add s390-gs-linux64 and
+            s390x-gs-linux64.
+            (s390-gs-linux64-expedite, s390x-gs-linux64-expedite): New macros.
+            (XMLTOC): Add s390-gs-linux64.xml and s390x-linux64.xml.
+            * features/s390-gs-linux64.c: New generated file.
+            * features/s390x-gs-linux64.c: New file.
+            * regformats/s390-gs-linux64.dat: New file.
+            * regformats/s390x-gs-linux64.dat: New file.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,3 +1,18 @@
++2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
++
++	* features/s390-gs-linux64.xml: New file.
++	* features/s390-gs.xml: New file.
++	* features/s390-gsbc.xml: New file.
++	* features/s390x-gs-linux64.xml: New file.
++	* features/Makefile (WHICH): Add s390-gs-linux64 and
++	s390x-gs-linux64.
++	(s390-gs-linux64-expedite, s390x-gs-linux64-expedite): New macros.
++	(XMLTOC): Add s390-gs-linux64.xml and s390x-linux64.xml.
++	* features/s390-gs-linux64.c: New generated file.
++	* features/s390x-gs-linux64.c: New file.
++	* regformats/s390-gs-linux64.dat: New file.
++	* regformats/s390x-gs-linux64.dat: New file.
++
+ 2017-09-23  Tom Tromey  <tom@tromey.com>
+ 
+ 	* defs.h (make_cleanup_override_quit_handler): Don't declare.
+--- a/gdb/features/Makefile
++++ b/gdb/features/Makefile
+@@ -78,6 +78,7 @@ WHICH = aarch64 \
+ 	s390-linux32v2 s390-linux64v2 s390x-linux64v2 \
+ 	s390-te-linux64 s390x-te-linux64 s390-vx-linux64 s390x-vx-linux64 \
+ 	s390-tevx-linux64 s390x-tevx-linux64 \
++	s390-gs-linux64 s390x-gs-linux64 \
+ 	tic6x-c64xp tic6x-c64x tic6x-c62x \
+ 	tic6x-c64xp-linux tic6x-c64x-linux tic6x-c62x-linux
+ 
+@@ -105,12 +106,14 @@ 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
++s390-gs-linux64-expedite = r14,r15,pswa
+ s390x-linux64-expedite = r14,r15,pswa
+ s390x-linux64v1-expedite = r14,r15,pswa
+ s390x-linux64v2-expedite = r14,r15,pswa
+ s390x-te-linux64-expedite = r14,r15,pswa
+ s390x-vx-linux64-expedite = r14,r15,pswa
+ s390x-tevx-linux64-expedite = r14,r15,pswa
++s390x-gs-linux64-expedite = r14,r15,pswa
+ tic6x-c64xp-expedite = A15,PC
+ tic6x-c64x-expedite = A15,PC
+ tic6x-c62x-expedite = A15,PC
+@@ -196,6 +199,8 @@ XMLTOC = \
+ 	s390-vx-linux64.xml \
+ 	s390x-tevx-linux64.xml \
+ 	s390x-vx-linux64.xml \
++	s390-gs-linux64.xml \
++	s390x-gs-linux64.xml \
+ 	tic6x-c62x-linux.xml \
+ 	tic6x-c62x.xml \
+ 	tic6x-c64x-linux.xml \
+--- /dev/null
++++ b/gdb/features/s390-gs-linux64.c
+@@ -0,0 +1,198 @@
++/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
++  Original: s390-gs-linux64.xml */
++
++#include "defs.h"
++#include "osabi.h"
++#include "target-descriptions.h"
++
++struct target_desc *tdesc_s390_gs_linux64;
++static void
++initialize_tdesc_s390_gs_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");
++
++  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gs");
++  tdesc_create_reg (feature, "gsd", 122, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "gssm", 123, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "gsepla", 124, 1, "gs", 64, "data_ptr");
++
++  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gsbc");
++  tdesc_create_reg (feature, "bc_gsd", 125, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "bc_gssm", 126, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "bc_gsepla", 127, 1, "gs", 64, "data_ptr");
++
++  tdesc_s390_gs_linux64 = result;
++}
+--- /dev/null
++++ b/gdb/features/s390-gs-linux64.xml
+@@ -0,0 +1,28 @@
++<?xml version="1.0"?>
++<!-- Copyright (C) 2017 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"/>
++  <xi:include href="s390-gs.xml"/>
++  <xi:include href="s390-gsbc.xml"/>
++</target>
+--- /dev/null
++++ b/gdb/features/s390-gs.xml
+@@ -0,0 +1,13 @@
++<?xml version="1.0"?>
++<!-- Copyright (C) 2017 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.gs">
++  <reg name="gsd" bitsize="64" type="uint64" group="gs"/>
++  <reg name="gssm" bitsize="64" type="uint64" group="gs"/>
++  <reg name="gsepla" bitsize="64" type="data_ptr" group="gs"/>
++</feature>
+--- /dev/null
++++ b/gdb/features/s390-gsbc.xml
+@@ -0,0 +1,13 @@
++<?xml version="1.0"?>
++<!-- Copyright (C) 2017 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.gsbc">
++  <reg name="bc_gsd" bitsize="64" type="uint64" group="gs"/>
++  <reg name="bc_gssm" bitsize="64" type="uint64" group="gs"/>
++  <reg name="bc_gsepla" bitsize="64" type="data_ptr" group="gs"/>
++</feature>
+--- /dev/null
++++ b/gdb/features/s390x-gs-linux64.c
+@@ -0,0 +1,182 @@
++/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
++  Original: s390x-gs-linux64.xml */
++
++#include "defs.h"
++#include "osabi.h"
++#include "target-descriptions.h"
++
++struct target_desc *tdesc_s390x_gs_linux64;
++static void
++initialize_tdesc_s390x_gs_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");
++
++  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gs");
++  tdesc_create_reg (feature, "gsd", 106, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "gssm", 107, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "gsepla", 108, 1, "gs", 64, "data_ptr");
++
++  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gsbc");
++  tdesc_create_reg (feature, "bc_gsd", 109, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "bc_gssm", 110, 1, "gs", 64, "uint64");
++  tdesc_create_reg (feature, "bc_gsepla", 111, 1, "gs", 64, "data_ptr");
++
++  tdesc_s390x_gs_linux64 = result;
++}
+--- /dev/null
++++ b/gdb/features/s390x-gs-linux64.xml
+@@ -0,0 +1,27 @@
++<?xml version="1.0"?>
++<!-- Copyright (C) 2017 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"/>
++  <xi:include href="s390-gs.xml"/>
++  <xi:include href="s390-gsbc.xml"/>
++</target>
+--- /dev/null
++++ b/gdb/regformats/s390-gs-linux64.dat
+@@ -0,0 +1,133 @@
++# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
++# Generated from: s390-gs-linux64.xml
++name:s390_gs_linux64
++xmltarget:s390-gs-linux64.xml
++expedite:r14,r15,pswa
++32:pswm
++32:pswa
++32:r0h
++32:r0l
++32:r1h
++32:r1l
++32:r2h
++32:r2l
++32:r3h
++32:r3l
++32:r4h
++32:r4l
++32:r5h
++32:r5l
++32:r6h
++32:r6l
++32:r7h
++32:r7l
++32:r8h
++32:r8l
++32:r9h
++32:r9l
++32:r10h
++32:r10l
++32:r11h
++32:r11l
++32:r12h
++32:r12l
++32:r13h
++32:r13l
++32:r14h
++32:r14l
++32:r15h
++32:r15l
++32:acr0
++32:acr1
++32:acr2
++32:acr3
++32:acr4
++32:acr5
++32:acr6
++32:acr7
++32:acr8
++32:acr9
++32:acr10
++32:acr11
++32:acr12
++32:acr13
++32:acr14
++32:acr15
++32:fpc
++64:f0
++64:f1
++64:f2
++64:f3
++64:f4
++64:f5
++64:f6
++64:f7
++64:f8
++64:f9
++64:f10
++64:f11
++64:f12
++64:f13
++64:f14
++64:f15
++32:orig_r2
++32:last_break
++32:system_call
++64:tdb0
++64:tac
++64:tct
++64:atia
++64:tr0
++64:tr1
++64:tr2
++64:tr3
++64:tr4
++64:tr5
++64:tr6
++64:tr7
++64:tr8
++64:tr9
++64:tr10
++64:tr11
++64:tr12
++64:tr13
++64:tr14
++64:tr15
++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
++64:gsd
++64:gssm
++64:gsepla
++64:bc_gsd
++64:bc_gssm
++64:bc_gsepla
+--- /dev/null
++++ b/gdb/regformats/s390x-gs-linux64.dat
+@@ -0,0 +1,117 @@
++# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
++# Generated from: s390x-gs-linux64.xml
++name:s390x_gs_linux64
++xmltarget:s390x-gs-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
++64:gsd
++64:gssm
++64:gsepla
++64:bc_gsd
++64:bc_gssm
++64:bc_gsepla
diff --git a/gdb-rhbz1498758-3of5.patch b/gdb-rhbz1498758-3of5.patch
new file mode 100755
index 0000000..bcd76a7
--- /dev/null
+++ b/gdb-rhbz1498758-3of5.patch
@@ -0,0 +1,385 @@
+commit 1b63490c9173f8c9770b7885def720516aa9b9f8
+Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
+Date:   Mon Sep 25 16:02:23 2017 +0200
+
+    S390: Add guarded-storage register support to GDB
+    
+    Recognize targets with the new guarded-storage feature and then present
+    the guarded-storage registers and the Linux-specific guarded-storage
+    broadcast control block appropriately.
+    
+    gdb/ChangeLog:
+    
+            * s390-linux-nat.c (have_regset_gs): New static variable.
+            (s390_linux_fetch_inferior_registers): Handle guarded-storage
+            control block and guarded-storage broadcast control regsets.
+            (s390_read_description): Detect whether the target has
+            guarded-storage support, return appropriate tdesc.
+            * s390-linux-tdep.c (features/s390-gs-linux64.c): New include.
+            (features/s390x-gs-linux64.c): Likewise.
+            (struct gdbarch_tdep) <have_gs>: New field.
+            (s390_regmap_gs, s390_regmap_gsbc, s390_gs_regset)
+            (s390_gsbc_regset): New variables.
+            (s390_iterate_over_regset_sections): Iterate over s390_gs_regset
+            and s390_gsbc_regset, if applicable.
+            (s390_core_read_description): Check whether core file was from a
+            target with guarded-storage support; include appropriate regsets.
+            (s390_gdbarch_init): Add registers for guarded-storage support.
+            (_initialize_s390_tdep): Initialize new target descriptions that
+            include registers for guarded-storage support.
+            * s390-linux-tdep.h (HWCAP_S390_GS, S390_GSD_REGNUM)
+            (S390_GSSM_REGNUM, S390_GSEPLA_REGNUM)
+            (S390_BC_GSD_REGNUM, S390_BC_GSSM_REGNUM): New defines.
+            (S390_NUM_REGS): Adjust macro definition.
+            (s390_gs_regset, s390_gsbc_regset, tdesc_s390_gs_linux64)
+            (tdesc_s390x_gs_linux64): New declarations.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,5 +1,31 @@
+ 2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+ 
++	* s390-linux-nat.c (have_regset_gs): New static variable.
++	(s390_linux_fetch_inferior_registers): Handle guarded-storage
++	control block and guarded-storage broadcast control regsets.
++	(s390_read_description): Detect whether the target has
++	guarded-storage support, return appropriate tdesc.
++	* s390-linux-tdep.c (features/s390-gs-linux64.c): New include.
++	(features/s390x-gs-linux64.c): Likewise.
++	(struct gdbarch_tdep) <have_gs>: New field.
++	(s390_regmap_gs, s390_regmap_gsbc, s390_gs_regset)
++	(s390_gsbc_regset): New variables.
++	(s390_iterate_over_regset_sections): Iterate over s390_gs_regset
++	and s390_gsbc_regset, if applicable.
++	(s390_core_read_description): Check whether core file was from a
++	target with guarded-storage support; include appropriate regsets.
++	(s390_gdbarch_init): Add registers for guarded-storage support.
++	(_initialize_s390_tdep): Initialize new target descriptions that
++	include registers for guarded-storage support.
++	* s390-linux-tdep.h (HWCAP_S390_GS, S390_GSD_REGNUM)
++	(S390_GSSM_REGNUM, S390_GSEPLA_REGNUM)
++	(S390_BC_GSD_REGNUM, S390_BC_GSSM_REGNUM): New defines.
++	(S390_NUM_REGS): Adjust macro definition.
++	(s390_gs_regset, s390_gsbc_regset, tdesc_s390_gs_linux64)
++	(tdesc_s390x_gs_linux64): New declarations.
++
++2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
++
+ 	* features/s390-gs-linux64.xml: New file.
+ 	* features/s390-gs.xml: New file.
+ 	* features/s390-gsbc.xml: New file.
+--- a/gdb/s390-linux-nat.c
++++ b/gdb/s390-linux-nat.c
+@@ -54,6 +54,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;
++static int have_regset_gs = 0;
+ 
+ /* Register map for 32-bit executables running under a 64-bit
+    kernel.  */
+@@ -406,6 +407,18 @@ s390_linux_fetch_inferior_registers (struct target_ops *ops,
+ 	fetch_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
+ 		      &s390_vxrs_high_regset);
+     }
++
++  if (have_regset_gs)
++    {
++      if (regnum == -1 || (regnum >= S390_GSD_REGNUM
++			   && regnum <= S390_GSEPLA_REGNUM))
++	fetch_regset (regcache, tid, NT_S390_GS_CB, 4 * 8,
++		      &s390_gs_regset);
++      if (regnum == -1 || (regnum >= S390_BC_GSD_REGNUM
++			   && regnum <= S390_BC_GSEPLA_REGNUM))
++	fetch_regset (regcache, tid, NT_S390_GS_BC, 4 * 8,
++		      &s390_gsbc_regset);
++    }
+ }
+ 
+ /* Store register REGNUM back into the child process.  If REGNUM is
+@@ -974,8 +987,13 @@ s390_read_description (struct target_ops *ops)
+       && check_regset (tid, NT_S390_VXRS_LOW, 16 * 8)
+       && check_regset (tid, NT_S390_VXRS_HIGH, 16 * 16);
+ 
++    have_regset_gs = (hwcap & HWCAP_S390_GS)
++      && check_regset (tid, NT_S390_GS_CB, 4 * 8)
++      && check_regset (tid, NT_S390_GS_BC, 4 * 8);
++
+     if (s390_target_wordsize () == 8)
+-      return (have_regset_vxrs ?
++      return (have_regset_gs ? tdesc_s390x_gs_linux64 :
++	      have_regset_vxrs ?
+ 	      (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
+ 	       tdesc_s390x_vx_linux64) :
+ 	      have_regset_tdb ? tdesc_s390x_te_linux64 :
+@@ -984,7 +1002,8 @@ s390_read_description (struct target_ops *ops)
+ 	      tdesc_s390x_linux64);
+ 
+     if (hwcap & HWCAP_S390_HIGH_GPRS)
+-      return (have_regset_vxrs ?
++      return (have_regset_gs ? tdesc_s390_gs_linux64 :
++	      have_regset_vxrs ?
+ 	      (have_regset_tdb ? tdesc_s390_tevx_linux64 :
+ 	       tdesc_s390_vx_linux64) :
+ 	      have_regset_tdb ? tdesc_s390_te_linux64 :
+--- a/gdb/s390-linux-tdep.c
++++ b/gdb/s390-linux-tdep.c
+@@ -69,12 +69,14 @@
+ #include "features/s390-te-linux64.c"
+ #include "features/s390-vx-linux64.c"
+ #include "features/s390-tevx-linux64.c"
++#include "features/s390-gs-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"
++#include "features/s390x-gs-linux64.c"
+ 
+ #define XML_SYSCALL_FILENAME_S390 "syscalls/s390-linux.xml"
+ #define XML_SYSCALL_FILENAME_S390X "syscalls/s390x-linux.xml"
+@@ -113,6 +115,7 @@ struct gdbarch_tdep
+   int have_linux_v1;
+   int have_linux_v2;
+   int have_tdb;
++  bool have_gs;
+ };
+ 
+ 
+@@ -834,6 +837,24 @@ static const struct regcache_map_entry s390_regmap_vxrs_high[] =
+     { 0 }
+   };
+ 
++static const struct regcache_map_entry s390_regmap_gs[] =
++  {
++    { 1, REGCACHE_MAP_SKIP, 8 },
++    { 1, S390_GSD_REGNUM, 8 },
++    { 1, S390_GSSM_REGNUM, 8 },
++    { 1, S390_GSEPLA_REGNUM, 8 },
++    { 0 }
++  };
++
++static const struct regcache_map_entry s390_regmap_gsbc[] =
++  {
++    { 1, REGCACHE_MAP_SKIP, 8 },
++    { 1, S390_BC_GSD_REGNUM, 8 },
++    { 1, S390_BC_GSSM_REGNUM, 8 },
++    { 1, S390_BC_GSEPLA_REGNUM, 8 },
++    { 0 }
++  };
++
+ 
+ /* Supply the TDB regset.  Like regcache_supply_regset, but invalidate
+    the TDB registers unless the TDB format field is valid.  */
+@@ -905,6 +926,18 @@ const struct regset s390_vxrs_high_regset = {
+   regcache_collect_regset
+ };
+ 
++const struct regset s390_gs_regset = {
++  s390_regmap_gs,
++  regcache_supply_regset,
++  regcache_collect_regset
++};
++
++const struct regset s390_gsbc_regset = {
++  s390_regmap_gsbc,
++  regcache_supply_regset,
++  regcache_collect_regset
++};
++
+ /* Iterate over supported core file register note sections. */
+ 
+ static void
+@@ -951,6 +984,23 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch,
+       cb (".reg-s390-vxrs-high", 16 * 16, &s390_vxrs_high_regset,
+ 	  "s390 vector registers 16-31", cb_data);
+     }
++
++  /* Iterate over the guarded-storage regsets if in "read" mode, or if
++     their registers are available.  */
++  if (tdep->have_gs)
++    {
++      if (regcache == NULL
++	  || REG_VALID == regcache_register_status (regcache,
++						    S390_GSD_REGNUM))
++	cb (".reg-s390-gs-cb", 4 * 8, &s390_gs_regset,
++	    "s390 guarded-storage registers", cb_data);
++
++      if (regcache == NULL
++	  || REG_VALID == regcache_register_status (regcache,
++						    S390_BC_GSD_REGNUM))
++	cb (".reg-s390-gs-bc", 4 * 8, &s390_gsbc_regset,
++	    "s390 guarded-storage broadcast control", cb_data);
++    }
+ }
+ 
+ static const struct target_desc *
+@@ -959,7 +1009,7 @@ s390_core_read_description (struct gdbarch *gdbarch,
+ {
+   asection *section = bfd_get_section_by_name (abfd, ".reg");
+   CORE_ADDR hwcap = 0;
+-  int high_gprs, v1, v2, te, vx;
++  bool high_gprs, v1, v2, te, vx, gs;
+ 
+   target_auxv_search (target, AT_HWCAP, &hwcap);
+   if (!section)
+@@ -971,12 +1021,14 @@ s390_core_read_description (struct gdbarch *gdbarch,
+   v2 = (bfd_get_section_by_name (abfd, ".reg-s390-system-call") != NULL);
+   vx = (hwcap & HWCAP_S390_VX);
+   te = (hwcap & HWCAP_S390_TE);
++  gs = (hwcap & HWCAP_S390_GS);
+ 
+   switch (bfd_section_size (abfd, section))
+     {
+     case s390_sizeof_gregset:
+       if (high_gprs)
+-	return (te && vx ? tdesc_s390_tevx_linux64 :
++	return (gs ? tdesc_s390_gs_linux64 :
++		te && vx ? tdesc_s390_tevx_linux64 :
+ 		vx ? tdesc_s390_vx_linux64 :
+ 		te ? tdesc_s390_te_linux64 :
+ 		v2 ? tdesc_s390_linux64v2 :
+@@ -986,7 +1038,8 @@ s390_core_read_description (struct gdbarch *gdbarch,
+ 		v1 ? tdesc_s390_linux32v1 : tdesc_s390_linux32);
+ 
+     case s390x_sizeof_gregset:
+-      return (te && vx ? tdesc_s390x_tevx_linux64 :
++      return (gs ? tdesc_s390x_gs_linux64 :
++	      te && vx ? tdesc_s390x_tevx_linux64 :
+ 	      vx ? tdesc_s390x_vx_linux64 :
+ 	      te ? tdesc_s390x_te_linux64 :
+ 	      v2 ? tdesc_s390x_linux64v2 :
+@@ -7767,6 +7820,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+   int have_linux_v2 = 0;
+   int have_tdb = 0;
+   int have_vx = 0;
++  int have_gs = 0;
+   int first_pseudo_reg, last_pseudo_reg;
+   static const char *const stap_register_prefixes[] = { "%", NULL };
+   static const char *const stap_register_indirection_prefixes[] = { "(",
+@@ -7834,6 +7888,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+ 	"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24",
+ 	"v25", "v26", "v27", "v28", "v29", "v30", "v31",
+       };
++      static const char *const gs_cb[] = {
++	"gsd", "gssm", "gsepla",
++      };
++      static const char *const gs_bc[] = {
++	"bc_gsd", "bc_gssm", "bc_gsepla",
++      };
+       const struct tdesc_feature *feature;
+       int i, valid_p = 1;
+ 
+@@ -7937,6 +7997,29 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+ 	  have_vx = 1;
+ 	}
+ 
++      /* Guarded-storage registers.  */
++      feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.gs");
++      if (feature)
++	{
++	  for (i = 0; i < 3; i++)
++	    valid_p &= tdesc_numbered_register (feature, tdesc_data,
++						S390_GSD_REGNUM + i,
++						gs_cb[i]);
++	  have_gs = 1;
++	}
++
++      /* Guarded-storage broadcast control.  */
++      feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.gsbc");
++      if (feature)
++	{
++	  valid_p &= have_gs;
++
++	  for (i = 0; i < 3; i++)
++	    valid_p &= tdesc_numbered_register (feature, tdesc_data,
++						S390_BC_GSD_REGNUM + i,
++						gs_bc[i]);
++	}
++
+       if (!valid_p)
+ 	{
+ 	  tdesc_data_cleanup (tdesc_data);
+@@ -7970,6 +8053,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+ 	continue;
+       if ((tdep->gpr_full_regnum != -1) != have_upper)
+ 	continue;
++      if (tdep->have_gs != have_gs)
++	continue;
+       if (tdesc_data != NULL)
+ 	tdesc_data_cleanup (tdesc_data);
+       return arches->gdbarch;
+@@ -7982,6 +8067,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+   tdep->have_linux_v1 = have_linux_v1;
+   tdep->have_linux_v2 = have_linux_v2;
+   tdep->have_tdb = have_tdb;
++  tdep->have_gs = have_gs;
+   gdbarch = gdbarch_alloc (&info, tdep);
+ 
+   set_gdbarch_believe_pcc_promotion (gdbarch, 0);
+@@ -8157,10 +8243,12 @@ _initialize_s390_tdep (void)
+   initialize_tdesc_s390_te_linux64 ();
+   initialize_tdesc_s390_vx_linux64 ();
+   initialize_tdesc_s390_tevx_linux64 ();
++  initialize_tdesc_s390_gs_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 ();
++  initialize_tdesc_s390x_gs_linux64 ();
+ }
+--- a/gdb/s390-linux-tdep.h
++++ b/gdb/s390-linux-tdep.h
+@@ -33,6 +33,10 @@
+ #define HWCAP_S390_VX 2048
+ #endif
+ 
++#ifndef HWCAP_S390_GS
++#define HWCAP_S390_GS 16384
++#endif
++
+ /* Register information.  */
+ 
+ /* Program Status Word.  */
+@@ -166,8 +170,14 @@
+ #define S390_V29_REGNUM 119
+ #define S390_V30_REGNUM 120
+ #define S390_V31_REGNUM 121
++#define S390_GSD_REGNUM 122
++#define S390_GSSM_REGNUM 123
++#define S390_GSEPLA_REGNUM 124
++#define S390_BC_GSD_REGNUM 125
++#define S390_BC_GSSM_REGNUM 126
++#define S390_BC_GSEPLA_REGNUM 127
+ /* Total.  */
+-#define S390_NUM_REGS 122
++#define S390_NUM_REGS 128
+ 
+ /* Special register usage.  */
+ #define S390_SP_REGNUM S390_R15_REGNUM
+@@ -198,6 +208,8 @@ 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;
++extern const struct regset s390_gs_regset;
++extern const struct regset s390_gsbc_regset;
+ 
+ /* GNU/Linux target descriptions.  */
+ extern struct target_desc *tdesc_s390_linux32;
+@@ -209,11 +221,13 @@ 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_s390_gs_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;
++extern struct target_desc *tdesc_s390x_gs_linux64;
+ 
+ #endif
diff --git a/gdb-rhbz1498758-4of5.patch b/gdb-rhbz1498758-4of5.patch
new file mode 100755
index 0000000..ec698bc
--- /dev/null
+++ b/gdb-rhbz1498758-4of5.patch
@@ -0,0 +1,275 @@
+commit ad3396348e0ebb61fdf71cff307bac08175ed366
+Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
+Date:   Mon Sep 25 16:02:23 2017 +0200
+
+    S390: Add guarded-storage register support to gdbserver
+    
+    Enable gdbserver to deal with the new guarded-storage register sets.
+    
+    gdb/gdbserver/ChangeLog:
+    
+            * configure.srv (s390*-*-linux*): Add s390-gs-linux64.o and
+            s390x-gs-linux64.o to srv_regobj.  Add s390-gs-linux64.xml,
+            s390x-gs-linux64.xml, s390-gs.xml, and s390-gsbc.xml to
+            srv_xmlfiles.  Add s390-gs-linux64-ipa.o and
+            s390x-gs-linux64-ipa.o to ipa_obj.
+            * linux-s390-low.c (HWCAP_S390_GS): New define.
+            (s390_fill_gs, s390_store_gs, s390_fill_gsbc, s390_store_gsbc):
+            New functions.
+            (s390_regsets): Add regsets for NT_S390_GS_CB and NT_S390_GS_BC.
+            (s390_arch_setup): Check for guarded-storage support and choose
+            appropriate tdesc.
+            (initialize_low_arch): Invoke init_registers_s390_gs_linux64 and
+            init_registers_s390x_gs_linux64.
+            * linux-s390-tdesc.h (enum s390_linux_tdesc) <S390_TDESC_GS>: New
+            enum value.
+            (init_registers_s390x_gs_linux64, tdesc_s390x_gs_linux64)
+            (init_registers_s390_gs_linux64, tdesc_s390_gs_linux64): Declare.
+
+### a/gdb/gdbserver/ChangeLog
+### b/gdb/gdbserver/ChangeLog
+## -1,3 +1,23 @@
++2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
++
++	* configure.srv (s390*-*-linux*): Add s390-gs-linux64.o and
++	s390x-gs-linux64.o to srv_regobj.  Add s390-gs-linux64.xml,
++	s390x-gs-linux64.xml, s390-gs.xml, and s390-gsbc.xml to
++	srv_xmlfiles.  Add s390-gs-linux64-ipa.o and
++	s390x-gs-linux64-ipa.o to ipa_obj.
++	* linux-s390-low.c (HWCAP_S390_GS): New define.
++	(s390_fill_gs, s390_store_gs, s390_fill_gsbc, s390_store_gsbc):
++	New functions.
++	(s390_regsets): Add regsets for NT_S390_GS_CB and NT_S390_GS_BC.
++	(s390_arch_setup): Check for guarded-storage support and choose
++	appropriate tdesc.
++	(initialize_low_arch): Invoke init_registers_s390_gs_linux64 and
++	init_registers_s390x_gs_linux64.
++	* linux-s390-tdesc.h (enum s390_linux_tdesc) <S390_TDESC_GS>: New
++	enum value.
++	(init_registers_s390x_gs_linux64, tdesc_s390x_gs_linux64)
++	(init_registers_s390_gs_linux64, tdesc_s390_gs_linux64): Declare.
++
+ 2017-09-22  Simon Marchi  <simon.marchi@ericsson.com>
+ 
+ 	* win32-i386-low.c (i386_arch_setup): Call init_target_desc.
+--- a/gdb/gdbserver/configure.srv
++++ b/gdb/gdbserver/configure.srv
+@@ -285,12 +285,14 @@ case "${target}" in
+ 			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} s390-gs-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_regobj="${srv_regobj} s390x-gs-linux64.o"
+ 			srv_tgtobj="$srv_linux_obj linux-s390-low.o"
+ 			srv_xmlfiles="s390-linux32.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390-linux32v1.xml"
+@@ -301,12 +303,14 @@ case "${target}" in
+ 			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} s390-gs-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} s390x-gs-linux64.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390-core32.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390-core64.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390x-core64.xml"
+@@ -314,6 +318,8 @@ case "${target}" in
+ 			srv_xmlfiles="${srv_xmlfiles} s390-fpr.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390-tdb.xml"
+ 			srv_xmlfiles="${srv_xmlfiles} s390-vx.xml"
++			srv_xmlfiles="${srv_xmlfiles} s390-gs.xml"
++			srv_xmlfiles="${srv_xmlfiles} s390-gsbc.xml"
+ 			srv_linux_usrregs=yes
+ 			srv_linux_regsets=yes
+ 			srv_linux_thread_db=yes
+@@ -327,12 +333,14 @@ case "${target}" in
+ 			ipa_obj="${ipa_obj} s390-vx-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390-te-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390-tevx-linux64-ipa.o"
++			ipa_obj="${ipa_obj} s390-gs-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-linux64v1-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-linux64v2-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-vx-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-te-linux64-ipa.o"
+ 			ipa_obj="${ipa_obj} s390x-tevx-linux64-ipa.o"
++			ipa_obj="${ipa_obj} s390x-gs-linux64-ipa.o"
+ 			;;
+   sh*-*-linux*)		srv_regobj=reg-sh.o
+ 			srv_tgtobj="$srv_linux_obj linux-sh-low.o"
+--- a/gdb/gdbserver/linux-s390-low.c
++++ b/gdb/gdbserver/linux-s390-low.c
+@@ -45,6 +45,10 @@
+ #define HWCAP_S390_VX 2048
+ #endif
+ 
++#ifndef HWCAP_S390_GS
++#define HWCAP_S390_GS 16384
++#endif
++
+ #define s390_num_regs 52
+ 
+ static int s390_regmap[] = {
+@@ -370,6 +374,46 @@ s390_store_vxrs_high (struct regcache *regcache, const void *buf)
+     supply_register (regcache, v16 + i, (const char *) buf + 16 * i);
+ }
+ 
++static void
++s390_fill_gs (struct regcache *regcache, void *buf)
++{
++  int gsd = find_regno (regcache->tdesc, "gsd");
++  int i;
++
++  for (i = 0; i < 3; i++)
++    collect_register (regcache, gsd + i, (char *) buf + 8 * (i + 1));
++}
++
++static void
++s390_store_gs (struct regcache *regcache, const void *buf)
++{
++  int gsd = find_regno (regcache->tdesc, "gsd");
++  int i;
++
++  for (i = 0; i < 3; i++)
++    supply_register (regcache, gsd + i, (const char *) buf + 8 * (i + 1));
++}
++
++static void
++s390_fill_gsbc (struct regcache *regcache, void *buf)
++{
++  int bc_gsd = find_regno (regcache->tdesc, "bc_gsd");
++  int i;
++
++  for (i = 0; i < 3; i++)
++    collect_register (regcache, bc_gsd + i, (char *) buf + 8 * (i + 1));
++}
++
++static void
++s390_store_gsbc (struct regcache *regcache, const void *buf)
++{
++  int bc_gsd = find_regno (regcache->tdesc, "bc_gsd");
++  int i;
++
++  for (i = 0; i < 3; i++)
++    supply_register (regcache, bc_gsd + i, (const char *) buf + 8 * (i + 1));
++}
++
+ static struct regset_info s390_regsets[] = {
+   { 0, 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL },
+ #ifndef __s390x__
+@@ -388,6 +432,10 @@ static struct regset_info s390_regsets[] = {
+     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 },
++  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_S390_GS_CB, 0,
++    EXTENDED_REGS, s390_fill_gs, s390_store_gs },
++  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_S390_GS_BC, 0,
++    EXTENDED_REGS, s390_fill_gsbc, s390_store_gsbc },
+   NULL_REGSET
+ };
+ 
+@@ -501,6 +549,8 @@ s390_arch_setup (void)
+   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);
++  int have_regset_gs = s390_check_regset (pid, NT_S390_GS_CB, 32)
++    && s390_check_regset (pid, NT_S390_GS_BC, 32);
+ 
+   /* Assume 31-bit inferior process.  */
+   if (have_regset_system_call)
+@@ -529,8 +579,13 @@ s390_arch_setup (void)
+ 	if (have_regset_vxrs)
+ 	  have_regset_vxrs =
+ 	    (s390_get_hwcap (tdesc_s390x_linux64v2) & HWCAP_S390_VX) != 0;
++	if (have_regset_gs)
++	  have_regset_gs =
++	    (s390_get_hwcap (tdesc_s390x_linux64v2) & HWCAP_S390_GS) != 0;
+ 
+-	if (have_regset_vxrs)
++	if (have_regset_gs)
++	  tdesc = tdesc_s390x_gs_linux64;
++	else if (have_regset_vxrs)
+ 	  tdesc = (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
+ 		   tdesc_s390x_vx_linux64);
+ 	else if (have_regset_tdb)
+@@ -554,8 +609,12 @@ s390_arch_setup (void)
+ 	  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_gs)
++	  have_regset_gs = (s390_get_hwcap (tdesc) & HWCAP_S390_GS) != 0;
+ 
+-	if (have_regset_vxrs)
++	if (have_regset_gs)
++	  tdesc = tdesc_s390_gs_linux64;
++	else if (have_regset_vxrs)
+ 	  tdesc = (have_regset_tdb ? tdesc_s390_tevx_linux64 :
+ 		   tdesc_s390_vx_linux64);
+ 	else if (have_regset_tdb)
+@@ -596,6 +655,9 @@ s390_arch_setup (void)
+ 	case NT_S390_VXRS_HIGH:
+ 	  regset->size = have_regset_vxrs ? 256 : 0;
+ 	  break;
++	case NT_S390_GS_CB:
++	case NT_S390_GS_BC:
++	  regset->size = have_regset_gs ? 32 : 0;
+ 	default:
+ 	  break;
+ 	}
+@@ -2797,6 +2859,7 @@ initialize_low_arch (void)
+   init_registers_s390_te_linux64 ();
+   init_registers_s390_vx_linux64 ();
+   init_registers_s390_tevx_linux64 ();
++  init_registers_s390_gs_linux64 ();
+ #ifdef __s390x__
+   init_registers_s390x_linux64 ();
+   init_registers_s390x_linux64v1 ();
+@@ -2804,6 +2867,7 @@ initialize_low_arch (void)
+   init_registers_s390x_te_linux64 ();
+   init_registers_s390x_vx_linux64 ();
+   init_registers_s390x_tevx_linux64 ();
++  init_registers_s390x_gs_linux64 ();
+ #endif
+ 
+   initialize_regsets_info (&s390_regsets_info);
+--- a/gdb/gdbserver/linux-s390-tdesc.h
++++ b/gdb/gdbserver/linux-s390-tdesc.h
+@@ -31,6 +31,7 @@ enum s390_linux_tdesc {
+   S390_TDESC_TE,
+   S390_TDESC_VX,
+   S390_TDESC_TEVX,
++  S390_TDESC_GS,
+ };
+ 
+ #ifdef __s390x__
+@@ -59,6 +60,10 @@ extern const struct target_desc *tdesc_s390x_vx_linux64;
+ void init_registers_s390x_tevx_linux64 (void);
+ extern const struct target_desc *tdesc_s390x_tevx_linux64;
+ 
++/* Defined in auto-generated file s390x-gs-linux64.c.  */
++void init_registers_s390x_gs_linux64 (void);
++extern const struct target_desc *tdesc_s390x_gs_linux64;
++
+ #endif
+ 
+ #if !defined __s390x__ || !defined IN_PROCESS_AGENT
+@@ -99,4 +104,8 @@ extern const struct target_desc *tdesc_s390_vx_linux64;
+ void init_registers_s390_tevx_linux64 (void);
+ extern const struct target_desc *tdesc_s390_tevx_linux64;
+ 
++/* Defined in auto-generated file s390-gs-linux64.c.  */
++void init_registers_s390_gs_linux64 (void);
++extern const struct target_desc *tdesc_s390_gs_linux64;
++
+ #endif
diff --git a/gdb-rhbz1498758-5of5.patch b/gdb-rhbz1498758-5of5.patch
new file mode 100644
index 0000000..1b59121
--- /dev/null
+++ b/gdb-rhbz1498758-5of5.patch
@@ -0,0 +1,63 @@
+commit 289e23aa03084b22c73ebdcf18371f1e6666ead0
+Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
+Date:   Mon Sep 25 16:02:24 2017 +0200
+
+    S390: Document guarded-storage register support
+    
+    This documents the newly added support for guarded-storage registers on
+    IBM z.
+    
+    gdb/ChangeLog:
+    
+            * NEWS: Advertise support for guarded-storage registers on IBM z.
+    
+    gdb/doc/ChangeLog:
+    
+            * gdb.texinfo (S/390 and System z Features): Document the new
+            features org.gnu.gdb.s390.gs and org.gnu.gdb.s390.gsbc.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,5 +1,9 @@
+ 2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+ 
++	* NEWS: Advertise support for guarded-storage registers on IBM z.
++
++2017-09-25  Andreas Arnez  <arnez@linux.vnet.ibm.com>
++
+ 	* s390-linux-nat.c (have_regset_gs): New static variable.
+ 	(s390_linux_fetch_inferior_registers): Handle guarded-storage
+ 	control block and guarded-storage broadcast control regsets.
+Index: gdb-8.0.1/gdb/NEWS
+===================================================================
+--- gdb-8.0.1.orig/gdb/NEWS	2017-10-07 15:54:48.649165644 +0200
++++ gdb-8.0.1/gdb/NEWS	2017-10-07 15:55:01.006264129 +0200
+@@ -3,6 +3,9 @@
+ 
+ * Fortran: Support pointers to dynamic types.
+ 
++* GDB now supports access to the guarded-storage-control registers and the
++  software-based guarded-storage broadcast control registers on IBM z14.
++
+ *** Changes in GDB 8.0
+ 
+ * GDB now supports access to the PKU register on GNU/Linux. The register is
+Index: gdb-8.0.1/gdb/doc/gdb.texinfo
+===================================================================
+--- gdb-8.0.1.orig/gdb/doc/gdb.texinfo	2017-10-07 15:54:44.891135692 +0200
++++ gdb-8.0.1/gdb/doc/gdb.texinfo	2017-10-07 15:54:48.660165731 +0200
+@@ -41512,6 +41512,14 @@
+ contain the 128-bit wide vector registers @samp{v16} through
+ @samp{v31}.
+ 
++The @samp{org.gnu.gdb.s390.gs} feature is optional.  It should contain
++the 64-bit wide guarded-storage-control registers @samp{gsd},
++@samp{gssm}, and @samp{gsepla}.
++
++The @samp{org.gnu.gdb.s390.gsbc} feature is optional.  It should contain
++the 64-bit wide guarded-storage broadcast control registers
++@samp{bc_gsd}, @samp{bc_gssm}, and @samp{bc_gsepla}.
++
+ @node Sparc Features
+ @subsection Sparc Features
+ @cindex target descriptions, sparc32 features
diff --git a/gdb.spec b/gdb.spec
index ddd183b..466e8c5 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -26,7 +26,7 @@ Version: 8.0.1
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 28%{?dist}
+Release: 29%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
 Group: Development/Debuggers
@@ -726,6 +726,13 @@ Patch1242: gdb-rhbz1420304-s390x-33of35.patch
 Patch1243: gdb-rhbz1420304-s390x-34of35.patch
 Patch1244: gdb-rhbz1420304-s390x-35of35.patch
 
+# [s390x] Backport arch14 guarded-storage register support (RH BZ 1498758).
+Patch1255: gdb-rhbz1498758-1of5.patch
+Patch1256: gdb-rhbz1498758-2of5.patch
+Patch1257: gdb-rhbz1498758-3of5.patch
+Patch1258: gdb-rhbz1498758-4of5.patch
+Patch1259: gdb-rhbz1498758-5of5.patch
+
 %if 0%{!?rhel:1} || 0%{?rhel} > 6
 # RL_STATE_FEDORA_GDB would not be found for:
 # Patch642: gdb-readline62-ask-more-rh.patch
@@ -1133,6 +1140,11 @@ done
 %patch1152 -p1
 %patch1153 -p1
 %patch1155 -p1
+%patch1255 -p1
+%patch1256 -p1
+%patch1257 -p1
+%patch1258 -p1
+%patch1259 -p1
 
 %patch1075 -p1
 %if 0%{?rhel:1} && 0%{?rhel} <= 7
@@ -1715,6 +1727,9 @@ then
 fi
 
 %changelog
+* Sat Oct  7 2017 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.0.1-29.fc26
+- [s390x] Backport arch14 guarded-storage register support (RH BZ 1498758).
+
 * Thu Sep 28 2017 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.0.1-28.fc26
 - Performance fix of gcore to use --readnever (for RH BZ 1493675).