Blame SOURCES/gdb-rhbz1105165-ibm-tdb-support-system-z-4of9.patch

01917d
From 6682d9595ed8d9b9bba5470bfd7fd1ccd378f19a Mon Sep 17 00:00:00 2001
01917d
From: Andreas Arnez <arnez at linux dot vnet dot ibm dot com>
01917d
Date: Tue, 5 Nov 2013 18:43:50 +0100
01917d
Subject: [PATCH] S390: Fix TDB regset recognition
01917d
01917d
When checking for the presence of the TDB regset, the current code
01917d
interprets ENODATA from PTRACE_GETREGSET as an indication that the TDB
01917d
regset *could* occur on this system, but the inferior stopped outside
01917d
a transaction.  However, the Linux kernel actually reports ENODATA
01917d
even on systems without the transactional execution facility.  Thus
01917d
the logic is now changed to check the TE field in the HWCAP as well.
01917d
01917d
This version also checks the existence of the TDB regset -- just to be
01917d
on the safe side when running on TE-enabled hardware with a kernel
01917d
that does not offer the TDB regset for some reason.
01917d
01917d
gdb/
01917d
	* s390-linux-nat.c (s390_read_description): Consider the TE field
01917d
	in the HWCAP for determining 'have_regset_tdb'.
01917d
01917d
gdbserver/
01917d
	* linux-s390-low.c (HWCAP_S390_TE): New define.
01917d
	(s390_arch_setup): Consider the TE field in the HWCAP for
01917d
	determining 'have_regset_tdb'.
01917d
---
01917d
 gdb/ChangeLog                  |  5 +++++
01917d
 gdb/gdbserver/ChangeLog        |  6 ++++++
01917d
 gdb/gdbserver/linux-s390-low.c | 48 ++++++++++++++++++++++++++----------------
01917d
 gdb/s390-linux-nat.c           |  5 +++--
01917d
 4 files changed, 44 insertions(+), 20 deletions(-)
01917d
01917d
Index: gdb-7.6.1/gdb/gdbserver/linux-s390-low.c
01917d
===================================================================
01917d
--- gdb-7.6.1.orig/gdb/gdbserver/linux-s390-low.c
01917d
+++ gdb-7.6.1/gdb/gdbserver/linux-s390-low.c
01917d
@@ -32,6 +32,10 @@
01917d
 #define HWCAP_S390_HIGH_GPRS 512
01917d
 #endif
01917d
 
01917d
+#ifndef HWCAP_S390_TE
01917d
+#define HWCAP_S390_TE 1024
01917d
+#endif
01917d
+
01917d
 #ifndef PTRACE_GETREGSET
01917d
 #define PTRACE_GETREGSET 0x4204
01917d
 #endif
01917d
@@ -390,23 +394,6 @@ s390_arch_setup (void)
01917d
     = s390_check_regset (pid, NT_S390_SYSTEM_CALL, 4);
01917d
   int have_regset_tdb = s390_check_regset (pid, NT_S390_TDB, 256);
01917d
 
01917d
-  /* Update target_regsets according to available register sets.  */
01917d
-  for (regset = target_regsets; regset->fill_function != NULL; regset++)
01917d
-    if (regset->get_request == PTRACE_GETREGSET)
01917d
-      switch (regset->nt_type)
01917d
-	{
01917d
-	case NT_S390_LAST_BREAK:
01917d
-	  regset->size = have_regset_last_break? 8 : 0;
01917d
-	  break;
01917d
-	case NT_S390_SYSTEM_CALL:
01917d
-	  regset->size = have_regset_system_call? 4 : 0;
01917d
-	  break;
01917d
-	case NT_S390_TDB:
01917d
-	  regset->size = have_regset_tdb ? 256 : 0;
01917d
-	default:
01917d
-	  break;
01917d
-	}
01917d
-
01917d
   /* Assume 31-bit inferior process.  */
01917d
   if (have_regset_system_call)
01917d
     init_registers_s390_linux32v2 ();
01917d
@@ -424,6 +411,7 @@ s390_arch_setup (void)
01917d
   {
01917d
     unsigned int pswm;
01917d
     struct regcache *regcache = new_register_cache ();
01917d
+
01917d
     fetch_inferior_registers (regcache, find_regno ("pswm"));
01917d
     collect_register_by_name (regcache, "pswm", &pswm);
01917d
     free_register_cache (regcache);
01917d
@@ -431,8 +419,12 @@ s390_arch_setup (void)
01917d
     if (pswm & 1)
01917d
       {
01917d
 	if (have_regset_tdb)
01917d
+	  have_regset_tdb =
01917d
+	    (s390_get_hwcap () & HWCAP_S390_TE) != 0;
01917d
+
01917d
+	if (have_regset_tdb)
01917d
 	  init_registers_s390x_te_linux64 ();
01917d
-	if (have_regset_system_call)
01917d
+	else if (have_regset_system_call)
01917d
 	  init_registers_s390x_linux64v2 ();
01917d
 	else if (have_regset_last_break)
01917d
 	  init_registers_s390x_linux64v1 ();
01917d
@@ -445,6 +437,9 @@ s390_arch_setup (void)
01917d
     else if (s390_get_hwcap () & HWCAP_S390_HIGH_GPRS)
01917d
       {
01917d
 	if (have_regset_tdb)
01917d
+	  have_regset_tdb = (s390_get_hwcap () & HWCAP_S390_TE) != 0;
01917d
+
01917d
+	if (have_regset_tdb)
01917d
 	  init_registers_s390_te_linux64 ();
01917d
 	if (have_regset_system_call)
01917d
 	  init_registers_s390_linux64v2 ();
01917d
@@ -458,6 +453,22 @@ s390_arch_setup (void)
01917d
       }
01917d
   }
01917d
 #endif
01917d
+  /* Update target_regsets according to available register sets.  */
01917d
+  for (regset = target_regsets; regset->fill_function != NULL; regset++)
01917d
+    if (regset->get_request == PTRACE_GETREGSET)
01917d
+      switch (regset->nt_type)
01917d
+	{
01917d
+	case NT_S390_LAST_BREAK:
01917d
+	  regset->size = have_regset_last_break? 8 : 0;
01917d
+	  break;
01917d
+	case NT_S390_SYSTEM_CALL:
01917d
+	  regset->size = have_regset_system_call? 4 : 0;
01917d
+	  break;
01917d
+	case NT_S390_TDB:
01917d
+	  regset->size = have_regset_tdb ? 256 : 0;
01917d
+	default:
01917d
+	  break;
01917d
+	}
01917d
 }
01917d
 
01917d
 
01917d
Index: gdb-7.6.1/gdb/s390-nat.c
01917d
===================================================================
01917d
--- gdb-7.6.1.orig/gdb/s390-nat.c
01917d
+++ gdb-7.6.1/gdb/s390-nat.c
01917d
@@ -632,8 +632,6 @@ s390_read_description (struct target_ops
01917d
     = check_regset (tid, NT_S390_LAST_BREAK, 8);
01917d
   have_regset_system_call
01917d
     = check_regset (tid, NT_S390_SYSTEM_CALL, 4);
01917d
-  have_regset_tdb
01917d
-    = check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
01917d
 
01917d
 #ifdef __s390x__
01917d
   /* If GDB itself is compiled as 64-bit, we are running on a machine in
01917d
@@ -642,6 +640,9 @@ s390_read_description (struct target_ops
01917d
      addressing mode, but the kernel supports using 64-bit registers in
01917d
      that mode, report s390 architecture with 64-bit GPRs.  */
01917d
 
01917d
+  have_regset_tdb = (s390_get_hwcap () & HWCAP_S390_TE) ?
01917d
+    check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset) : 0;
01917d
+
01917d
   if (s390_target_wordsize () == 8)
01917d
     return (have_regset_tdb ? tdesc_s390x_te_linux64 :
01917d
 	    have_regset_system_call? tdesc_s390x_linux64v2 :