Blame SOURCES/gdb-rhbz1854784-powerpc-remove-region-limit-dawr-2of7.patch

4f0e34
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
4f0e34
From: Alan Hayward <alan.hayward@arm.com>
4f0e34
Date: Wed, 7 Jul 2021 18:13:44 -0400
4f0e34
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-2of7.patch
4f0e34
4f0e34
;; Backport "Add linux_get_hwcap"
4f0e34
;; (Alan Hayward, RH BZ 1854784)
4f0e34
4f0e34
Tidy up calls to read HWCAP (and HWCAP2) by adding common functions,
4f0e34
removing the PPC and AArch64 specific versions.
4f0e34
4f0e34
The only function difference is in aarch64_linux_core_read_description - if
4f0e34
the hwcap read fails it now return a valid description instead of nullptr.
4f0e34
4f0e34
gdb/ChangeLog:
4f0e34
4f0e34
2019-03-25  Alan Hayward  <alan.hayward@arm.com>
4f0e34
4f0e34
	* aarch64-linux-nat.c (aarch64_linux_nat_target::read_description):
4f0e34
	Call linux_get_hwcap.
4f0e34
	* aarch64-linux-tdep.c (aarch64_linux_core_read_description):
4f0e34
	Likewise.
4f0e34
	(aarch64_linux_get_hwcap): Remove function.
4f0e34
	* aarch64-linux-tdep.h (aarch64_linux_get_hwcap): Remove
4f0e34
	declaration.
4f0e34
	* arm-linux-nat.c (arm_linux_nat_target::read_description):Call
4f0e34
	linux_get_hwcap.
4f0e34
	* arm-linux-tdep.c (arm_linux_core_read_description): Likewise.
4f0e34
	* linux-tdep.c (linux_get_hwcap): Add function.
4f0e34
	(linux_get_hwcap2): Likewise.
4f0e34
	* linux-tdep.h (linux_get_hwcap): Add declaration.
4f0e34
	(linux_get_hwcap2): Likewise.
4f0e34
	* ppc-linux-nat.c (ppc_linux_get_hwcap): Remove function.
4f0e34
	(ppc_linux_get_hwcap2): Likewise.
4f0e34
	(ppc_linux_nat_target::region_ok_for_hw_watchpoint): Call
4f0e34
	linux_get_hwcap.
4f0e34
	(ppc_linux_nat_target::insert_watchpoint): Likewise.
4f0e34
	(ppc_linux_nat_target::watchpoint_addr_within_range): Likewise.
4f0e34
	(ppc_linux_nat_target::read_description): Likewise.
4f0e34
	* ppc-linux-tdep.c (ppc_linux_core_read_description): Likewise.
4f0e34
	* s390-linux-nat.c: Likewise.
4f0e34
	* s390-linux-tdep.c (s390_core_read_description): Likewise.
4f0e34
4f0e34
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
4f0e34
--- a/gdb/aarch64-linux-nat.c
4f0e34
+++ b/gdb/aarch64-linux-nat.c
4f0e34
@@ -42,6 +42,7 @@
4f0e34
 #include <asm/ptrace.h>
4f0e34
 
4f0e34
 #include "gregset.h"
4f0e34
+#include "linux-tdep.h"
4f0e34
 
4f0e34
 /* Defines ps_err_e, struct ps_prochandle.  */
4f0e34
 #include "gdb_proc_service.h"
4f0e34
@@ -605,8 +606,7 @@ aarch64_linux_nat_target::read_description ()
4f0e34
   ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
4f0e34
   if (ret == 0)
4f0e34
     return tdesc_arm_with_neon;
4f0e34
-  else
4f0e34
-    return aarch64_read_description (aarch64_sve_get_vq (tid));
4f0e34
+  else return aarch64_read_description (aarch64_sve_get_vq (tid));
4f0e34
 }
4f0e34
 
4f0e34
 /* Convert a native/host siginfo object, into/from the siginfo in the
4f0e34
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
4f0e34
--- a/gdb/aarch64-linux-tdep.c
4f0e34
+++ b/gdb/aarch64-linux-tdep.c
4f0e34
@@ -442,10 +442,7 @@ static const struct target_desc *
4f0e34
 aarch64_linux_core_read_description (struct gdbarch *gdbarch,
4f0e34
 				     struct target_ops *target, bfd *abfd)
4f0e34
 {
4f0e34
-  CORE_ADDR aarch64_hwcap = 0;
4f0e34
-
4f0e34
-  if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
4f0e34
-    return NULL;
4f0e34
+  CORE_ADDR hwcap = linux_get_hwcap (target);
4f0e34
 
4f0e34
   return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd));
4f0e34
 }
4f0e34
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
4f0e34
--- a/gdb/arm-linux-nat.c
4f0e34
+++ b/gdb/arm-linux-nat.c
4f0e34
@@ -533,7 +533,7 @@ ps_get_thread_area (struct ps_prochandle *ph,
4f0e34
 const struct target_desc *
4f0e34
 arm_linux_nat_target::read_description ()
4f0e34
 {
4f0e34
-  CORE_ADDR arm_hwcap = 0;
4f0e34
+  CORE_ADDR arm_hwcap = linux_get_hwcap (this);
4f0e34
 
4f0e34
   if (have_ptrace_getregset == TRIBOOL_UNKNOWN)
4f0e34
     {
4f0e34
@@ -551,11 +551,6 @@ arm_linux_nat_target::read_description ()
4f0e34
 	have_ptrace_getregset = TRIBOOL_TRUE;
4f0e34
     }
4f0e34
 
4f0e34
-  if (target_auxv_search (this, AT_HWCAP, &arm_hwcap) != 1)
4f0e34
-    {
4f0e34
-      return this->beneath ()->read_description ();
4f0e34
-    }
4f0e34
-
4f0e34
   if (arm_hwcap & HWCAP_IWMMXT)
4f0e34
     return tdesc_arm_with_iwmmxt;
4f0e34
 
4f0e34
diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
4f0e34
--- a/gdb/arm-linux-tdep.c
4f0e34
+++ b/gdb/arm-linux-tdep.c
4f0e34
@@ -730,10 +730,7 @@ arm_linux_core_read_description (struct gdbarch *gdbarch,
4f0e34
                                  struct target_ops *target,
4f0e34
                                  bfd *abfd)
4f0e34
 {
4f0e34
-  CORE_ADDR arm_hwcap = 0;
4f0e34
-
4f0e34
-  if (target_auxv_search (target, AT_HWCAP, &arm_hwcap) != 1)
4f0e34
-    return NULL;
4f0e34
+  CORE_ADDR arm_hwcap = linux_get_hwcap (target);
4f0e34
 
4f0e34
   if (arm_hwcap & HWCAP_VFP)
4f0e34
     {
4f0e34
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
4f0e34
--- a/gdb/linux-tdep.c
4f0e34
+++ b/gdb/linux-tdep.c
4f0e34
@@ -2567,6 +2567,28 @@ linux_displaced_step_location (struct gdbarch *gdbarch)
4f0e34
   return addr;
4f0e34
 }
4f0e34
 
4f0e34
+/* See linux-tdep.h.  */
4f0e34
+
4f0e34
+CORE_ADDR
4f0e34
+linux_get_hwcap (struct target_ops *target)
4f0e34
+{
4f0e34
+  CORE_ADDR field;
4f0e34
+  if (target_auxv_search (target, AT_HWCAP, &field) != 1)
4f0e34
+    return 0;
4f0e34
+  return field;
4f0e34
+}
4f0e34
+
4f0e34
+/* See linux-tdep.h.  */
4f0e34
+
4f0e34
+CORE_ADDR
4f0e34
+linux_get_hwcap2 (struct target_ops *target)
4f0e34
+{
4f0e34
+  CORE_ADDR field;
4f0e34
+  if (target_auxv_search (target, AT_HWCAP2, &field) != 1)
4f0e34
+    return 0;
4f0e34
+  return field;
4f0e34
+}
4f0e34
+
4f0e34
 /* Display whether the gcore command is using the
4f0e34
    /proc/PID/coredump_filter file.  */
4f0e34
 
4f0e34
diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h
4f0e34
--- a/gdb/linux-tdep.h
4f0e34
+++ b/gdb/linux-tdep.h
4f0e34
@@ -61,4 +61,12 @@ extern void linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
4f0e34
 
4f0e34
 extern int linux_is_uclinux (void);
4f0e34
 
4f0e34
+/* Fetch the AT_HWCAP entry from the auxv vector for the given TARGET.  On
4f0e34
+   error, 0 is returned.  */
4f0e34
+extern CORE_ADDR linux_get_hwcap (struct target_ops *target);
4f0e34
+
4f0e34
+/* Fetch the AT_HWCAP2 entry from the auxv vector for the given TARGET.  On
4f0e34
+   error, 0 is returned.  */
4f0e34
+extern CORE_ADDR linux_get_hwcap2 (struct target_ops *target);
4f0e34
+
4f0e34
 #endif /* linux-tdep.h */
4f0e34
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
4f0e34
--- a/gdb/ppc-linux-nat.c
4f0e34
+++ b/gdb/ppc-linux-nat.c
4f0e34
@@ -50,6 +50,7 @@
4f0e34
 #include "arch/ppc-linux-common.h"
4f0e34
 #include "arch/ppc-linux-tdesc.h"
4f0e34
 #include "nat/ppc-linux.h"
4f0e34
+#include "linux-tdep.h"
4f0e34
 
4f0e34
 /* Similarly for the hardware watchpoint support.  These requests are used
4f0e34
    when the PowerPC HWDEBUG ptrace interface is not available.  */
4f0e34
@@ -1560,31 +1561,6 @@ store_ppc_registers (const struct regcache *regcache, int tid)
4f0e34
      function to fail most of the time, so we ignore them.  */
4f0e34
 }
4f0e34
 
4f0e34
-/* Fetch the AT_HWCAP entry from the aux vector.  */
4f0e34
-static CORE_ADDR
4f0e34
-ppc_linux_get_hwcap (void)
4f0e34
-{
4f0e34
-  CORE_ADDR field;
4f0e34
-
4f0e34
-  if (target_auxv_search (current_top_target (), AT_HWCAP, &field) != 1)
4f0e34
-    return 0;
4f0e34
-
4f0e34
-  return field;
4f0e34
-}
4f0e34
-
4f0e34
-/* Fetch the AT_HWCAP2 entry from the aux vector.  */
4f0e34
-
4f0e34
-static CORE_ADDR
4f0e34
-ppc_linux_get_hwcap2 (void)
4f0e34
-{
4f0e34
-  CORE_ADDR field;
4f0e34
-
4f0e34
-  if (target_auxv_search (current_top_target (), AT_HWCAP2, &field) != 1)
4f0e34
-    return 0;
4f0e34
-
4f0e34
-  return field;
4f0e34
-}
4f0e34
-
4f0e34
 /* The cached DABR value, to install in new threads.
4f0e34
    This variable is used when the PowerPC HWDEBUG ptrace
4f0e34
    interface is not available.  */
4f0e34
@@ -1741,7 +1717,7 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, LONGEST len)
4f0e34
          takes two hardware watchpoints though.  */
4f0e34
       if (len > 1
4f0e34
 	  && hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE
4f0e34
-	  && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
4f0e34
+	  && linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
4f0e34
 	return 2;
4f0e34
       /* Check if the processor provides DAWR interface.  */
4f0e34
       if (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_DAWR)
4f0e34
@@ -1761,7 +1737,7 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, LONGEST len)
4f0e34
      ptrace interface, DAC-based processors (i.e., embedded processors) will
4f0e34
      use addresses aligned to 4-bytes due to the way the read/write flags are
4f0e34
      passed in the old ptrace interface.  */
4f0e34
-  else if (((ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
4f0e34
+  else if (((linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
4f0e34
 	   && (addr + len) > (addr & ~3) + 4)
4f0e34
 	   || (addr + len) > (addr & ~7) + 8)
4f0e34
     return 0;
4f0e34
@@ -2303,7 +2279,7 @@ ppc_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
4f0e34
       long dabr_value;
4f0e34
       long read_mode, write_mode;
4f0e34
 
4f0e34
-      if (ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
4f0e34
+      if (linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
4f0e34
 	{
4f0e34
 	  /* PowerPC 440 requires only the read/write flags to be passed
4f0e34
 	     to the kernel.  */
4f0e34
@@ -2506,9 +2482,9 @@ ppc_linux_nat_target::watchpoint_addr_within_range (CORE_ADDR addr,
4f0e34
   int mask;
4f0e34
 
4f0e34
   if (have_ptrace_hwdebug_interface ()
4f0e34
-      && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
4f0e34
+      && linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
4f0e34
     return start <= addr && start + length >= addr;
4f0e34
-  else if (ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
4f0e34
+  else if (linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
4f0e34
     mask = 3;
4f0e34
   else
4f0e34
     mask = 7;
4f0e34
@@ -2646,8 +2622,8 @@ ppc_linux_nat_target::read_description ()
4f0e34
 
4f0e34
   features.wordsize = ppc_linux_target_wordsize (tid);
4f0e34
 
4f0e34
-  CORE_ADDR hwcap = ppc_linux_get_hwcap ();
4f0e34
-  CORE_ADDR hwcap2 = ppc_linux_get_hwcap2 ();
4f0e34
+  CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
4f0e34
+  CORE_ADDR hwcap2 = linux_get_hwcap2 (current_top_target ());
4f0e34
 
4f0e34
   if (have_ptrace_getsetvsxregs
4f0e34
       && (hwcap & PPC_FEATURE_HAS_VSX))
4f0e34
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
4f0e34
--- a/gdb/ppc-linux-tdep.c
4f0e34
+++ b/gdb/ppc-linux-tdep.c
4f0e34
@@ -1602,10 +1602,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
4f0e34
   if (vsx)
4f0e34
     features.vsx = true;
4f0e34
 
4f0e34
-  CORE_ADDR hwcap;
4f0e34
-
4f0e34
-  if (target_auxv_search (target, AT_HWCAP, &hwcap) != 1)
4f0e34
-    hwcap = 0;
4f0e34
+  CORE_ADDR hwcap = linux_get_hwcap (target);
4f0e34
 
4f0e34
   features.isa205 = ppc_linux_has_isa205 (hwcap);
4f0e34
 
4f0e34
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
4f0e34
--- a/gdb/s390-linux-nat.c
4f0e34
+++ b/gdb/s390-linux-nat.c
4f0e34
@@ -42,6 +42,7 @@
4f0e34
 #include <elf.h>
4f0e34
 #include <algorithm>
4f0e34
 #include "inf-ptrace.h"
4f0e34
+#include "linux-tdep.h"
4f0e34
 
4f0e34
 /* Per-thread arch-specific data.  */
4f0e34
 
4f0e34
@@ -1018,9 +1019,8 @@ s390_linux_nat_target::read_description ()
4f0e34
      that mode, report s390 architecture with 64-bit GPRs.  */
4f0e34
 #ifdef __s390x__
4f0e34
   {
4f0e34
-    CORE_ADDR hwcap = 0;
4f0e34
+    CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
4f0e34
 
4f0e34
-    target_auxv_search (current_top_target (), AT_HWCAP, &hwcap);
4f0e34
     have_regset_tdb = (hwcap & HWCAP_S390_TE)
4f0e34
       && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
4f0e34
 
4f0e34
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
4f0e34
--- a/gdb/s390-linux-tdep.c
4f0e34
+++ b/gdb/s390-linux-tdep.c
4f0e34
@@ -332,10 +332,9 @@ s390_core_read_description (struct gdbarch *gdbarch,
4f0e34
 			    struct target_ops *target, bfd *abfd)
4f0e34
 {
4f0e34
   asection *section = bfd_get_section_by_name (abfd, ".reg");
4f0e34
-  CORE_ADDR hwcap = 0;
4f0e34
+  CORE_ADDR hwcap = linux_get_hwcap (target);
4f0e34
   bool high_gprs, v1, v2, te, vx, gs;
4f0e34
 
4f0e34
-  target_auxv_search (target, AT_HWCAP, &hwcap);
4f0e34
   if (!section)
4f0e34
     return NULL;
4f0e34