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

4f0e34
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
4f0e34
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
4f0e34
Date: Wed, 7 Jul 2021 18:45:37 -0400
4f0e34
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-3of7.patch
4f0e34
4f0e34
;; Backport "[PowerPC] Move up some register access routines"
4f0e34
;; (Pedro Franco de Carvalho, RH BZ 1854784)
4f0e34
4f0e34
Keep the routines related to register access grouped together.
4f0e34
4f0e34
gdb/ChangeLog:
4f0e34
2020-03-30  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
4f0e34
4f0e34
	* ppc-linux-nat.c (ppc_linux_nat_target::store_registers)
4f0e34
	(ppc_linux_nat_target::auxv_parse)
4f0e34
	(ppc_linux_nat_target::read_description)
4f0e34
	(supply_gregset, fill_gregset, supply_fpregset, fill_fpregset):
4f0e34
	Move up.
4f0e34
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
@@ -1561,6 +1561,170 @@ store_ppc_registers (const struct regcache *regcache, int tid)
4f0e34
      function to fail most of the time, so we ignore them.  */
4f0e34
 }
4f0e34
 
4f0e34
+void
4f0e34
+ppc_linux_nat_target::store_registers (struct regcache *regcache, int regno)
4f0e34
+{
4f0e34
+  pid_t tid = get_ptrace_pid (regcache->ptid ());
4f0e34
+
4f0e34
+  if (regno >= 0)
4f0e34
+    store_register (regcache, tid, regno);
4f0e34
+  else
4f0e34
+    store_ppc_registers (regcache, tid);
4f0e34
+}
4f0e34
+
4f0e34
+/* Functions for transferring registers between a gregset_t or fpregset_t
4f0e34
+   (see sys/ucontext.h) and gdb's regcache.  The word size is that used
4f0e34
+   by the ptrace interface, not the current program's ABI.  Eg. if a
4f0e34
+   powerpc64-linux gdb is being used to debug a powerpc32-linux app, we
4f0e34
+   read or write 64-bit gregsets.  This is to suit the host libthread_db.  */
4f0e34
+
4f0e34
+void
4f0e34
+supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
4f0e34
+{
4f0e34
+  const struct regset *regset = ppc_linux_gregset (sizeof (long));
4f0e34
+
4f0e34
+  ppc_supply_gregset (regset, regcache, -1, gregsetp, sizeof (*gregsetp));
4f0e34
+}
4f0e34
+
4f0e34
+void
4f0e34
+fill_gregset (const struct regcache *regcache,
4f0e34
+	      gdb_gregset_t *gregsetp, int regno)
4f0e34
+{
4f0e34
+  const struct regset *regset = ppc_linux_gregset (sizeof (long));
4f0e34
+
4f0e34
+  if (regno == -1)
4f0e34
+    memset (gregsetp, 0, sizeof (*gregsetp));
4f0e34
+  ppc_collect_gregset (regset, regcache, regno, gregsetp, sizeof (*gregsetp));
4f0e34
+}
4f0e34
+
4f0e34
+void
4f0e34
+supply_fpregset (struct regcache *regcache, const gdb_fpregset_t * fpregsetp)
4f0e34
+{
4f0e34
+  const struct regset *regset = ppc_linux_fpregset ();
4f0e34
+
4f0e34
+  ppc_supply_fpregset (regset, regcache, -1,
4f0e34
+		       fpregsetp, sizeof (*fpregsetp));
4f0e34
+}
4f0e34
+
4f0e34
+void
4f0e34
+fill_fpregset (const struct regcache *regcache,
4f0e34
+	       gdb_fpregset_t *fpregsetp, int regno)
4f0e34
+{
4f0e34
+  const struct regset *regset = ppc_linux_fpregset ();
4f0e34
+
4f0e34
+  ppc_collect_fpregset (regset, regcache, regno,
4f0e34
+			fpregsetp, sizeof (*fpregsetp));
4f0e34
+}
4f0e34
+
4f0e34
+int
4f0e34
+ppc_linux_nat_target::auxv_parse (gdb_byte **readptr,
4f0e34
+				  gdb_byte *endptr, CORE_ADDR *typep,
4f0e34
+				  CORE_ADDR *valp)
4f0e34
+{
4f0e34
+  int tid = inferior_ptid.lwp ();
4f0e34
+  if (tid == 0)
4f0e34
+    tid = inferior_ptid.pid ();
4f0e34
+
4f0e34
+  int sizeof_auxv_field = ppc_linux_target_wordsize (tid);
4f0e34
+
4f0e34
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
4f0e34
+  gdb_byte *ptr = *readptr;
4f0e34
+
4f0e34
+  if (endptr == ptr)
4f0e34
+    return 0;
4f0e34
+
4f0e34
+  if (endptr - ptr < sizeof_auxv_field * 2)
4f0e34
+    return -1;
4f0e34
+
4f0e34
+  *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
4f0e34
+  ptr += sizeof_auxv_field;
4f0e34
+  *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
4f0e34
+  ptr += sizeof_auxv_field;
4f0e34
+
4f0e34
+  *readptr = ptr;
4f0e34
+  return 1;
4f0e34
+}
4f0e34
+
4f0e34
+const struct target_desc *
4f0e34
+ppc_linux_nat_target::read_description ()
4f0e34
+{
4f0e34
+  int tid = inferior_ptid.lwp ();
4f0e34
+  if (tid == 0)
4f0e34
+    tid = inferior_ptid.pid ();
4f0e34
+
4f0e34
+  if (have_ptrace_getsetevrregs)
4f0e34
+    {
4f0e34
+      struct gdb_evrregset_t evrregset;
4f0e34
+
4f0e34
+      if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0)
4f0e34
+        return tdesc_powerpc_e500l;
4f0e34
+
4f0e34
+      /* EIO means that the PTRACE_GETEVRREGS request isn't supported.
4f0e34
+	 Anything else needs to be reported.  */
4f0e34
+      else if (errno != EIO)
4f0e34
+	perror_with_name (_("Unable to fetch SPE registers"));
4f0e34
+    }
4f0e34
+
4f0e34
+  struct ppc_linux_features features = ppc_linux_no_features;
4f0e34
+
4f0e34
+  features.wordsize = ppc_linux_target_wordsize (tid);
4f0e34
+
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
+    {
4f0e34
+      gdb_vsxregset_t vsxregset;
4f0e34
+
4f0e34
+      if (ptrace (PTRACE_GETVSXREGS, tid, 0, &vsxregset) >= 0)
4f0e34
+	features.vsx = true;
4f0e34
+
4f0e34
+      /* EIO means that the PTRACE_GETVSXREGS request isn't supported.
4f0e34
+	 Anything else needs to be reported.  */
4f0e34
+      else if (errno != EIO)
4f0e34
+	perror_with_name (_("Unable to fetch VSX registers"));
4f0e34
+    }
4f0e34
+
4f0e34
+  if (have_ptrace_getvrregs
4f0e34
+      && (hwcap & PPC_FEATURE_HAS_ALTIVEC))
4f0e34
+    {
4f0e34
+      gdb_vrregset_t vrregset;
4f0e34
+
4f0e34
+      if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
4f0e34
+        features.altivec = true;
4f0e34
+
4f0e34
+      /* EIO means that the PTRACE_GETVRREGS request isn't supported.
4f0e34
+	 Anything else needs to be reported.  */
4f0e34
+      else if (errno != EIO)
4f0e34
+	perror_with_name (_("Unable to fetch AltiVec registers"));
4f0e34
+    }
4f0e34
+
4f0e34
+  features.isa205 = ppc_linux_has_isa205 (hwcap);
4f0e34
+
4f0e34
+  if ((hwcap2 & PPC_FEATURE2_DSCR)
4f0e34
+      && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
4f0e34
+      && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
4f0e34
+    {
4f0e34
+      features.ppr_dscr = true;
4f0e34
+      if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
4f0e34
+	  && (hwcap2 & PPC_FEATURE2_TAR)
4f0e34
+	  && (hwcap2 & PPC_FEATURE2_EBB)
4f0e34
+	  && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)
4f0e34
+	  && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET)
4f0e34
+	  && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET))
4f0e34
+	{
4f0e34
+	  features.isa207 = true;
4f0e34
+	  if ((hwcap2 & PPC_FEATURE2_HTM)
4f0e34
+	      && check_regset (tid, NT_PPC_TM_SPR,
4f0e34
+			       PPC_LINUX_SIZEOF_TM_SPRREGSET))
4f0e34
+	    features.htm = true;
4f0e34
+	}
4f0e34
+    }
4f0e34
+
4f0e34
+  return ppc_linux_match_description (features);
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
@@ -2514,173 +2678,7 @@ ppc_linux_nat_target::masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask
4f0e34
     return 2;
4f0e34
 }
4f0e34
 
4f0e34
-void
4f0e34
-ppc_linux_nat_target::store_registers (struct regcache *regcache, int regno)
4f0e34
-{
4f0e34
-  pid_t tid = get_ptrace_pid (regcache->ptid ());
4f0e34
-
4f0e34
-  if (regno >= 0)
4f0e34
-    store_register (regcache, tid, regno);
4f0e34
-  else
4f0e34
-    store_ppc_registers (regcache, tid);
4f0e34
-}
4f0e34
-
4f0e34
-/* Functions for transferring registers between a gregset_t or fpregset_t
4f0e34
-   (see sys/ucontext.h) and gdb's regcache.  The word size is that used
4f0e34
-   by the ptrace interface, not the current program's ABI.  Eg. if a
4f0e34
-   powerpc64-linux gdb is being used to debug a powerpc32-linux app, we
4f0e34
-   read or write 64-bit gregsets.  This is to suit the host libthread_db.  */
4f0e34
-
4f0e34
-void
4f0e34
-supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
4f0e34
-{
4f0e34
-  const struct regset *regset = ppc_linux_gregset (sizeof (long));
4f0e34
-
4f0e34
-  ppc_supply_gregset (regset, regcache, -1, gregsetp, sizeof (*gregsetp));
4f0e34
-}
4f0e34
-
4f0e34
-void
4f0e34
-fill_gregset (const struct regcache *regcache,
4f0e34
-	      gdb_gregset_t *gregsetp, int regno)
4f0e34
-{
4f0e34
-  const struct regset *regset = ppc_linux_gregset (sizeof (long));
4f0e34
-
4f0e34
-  if (regno == -1)
4f0e34
-    memset (gregsetp, 0, sizeof (*gregsetp));
4f0e34
-  ppc_collect_gregset (regset, regcache, regno, gregsetp, sizeof (*gregsetp));
4f0e34
-}
4f0e34
-
4f0e34
-void
4f0e34
-supply_fpregset (struct regcache *regcache, const gdb_fpregset_t * fpregsetp)
4f0e34
-{
4f0e34
-  const struct regset *regset = ppc_linux_fpregset ();
4f0e34
-
4f0e34
-  ppc_supply_fpregset (regset, regcache, -1,
4f0e34
-		       fpregsetp, sizeof (*fpregsetp));
4f0e34
-}
4f0e34
-
4f0e34
-void
4f0e34
-fill_fpregset (const struct regcache *regcache,
4f0e34
-	       gdb_fpregset_t *fpregsetp, int regno)
4f0e34
-{
4f0e34
-  const struct regset *regset = ppc_linux_fpregset ();
4f0e34
-
4f0e34
-  ppc_collect_fpregset (regset, regcache, regno,
4f0e34
-			fpregsetp, sizeof (*fpregsetp));
4f0e34
-}
4f0e34
-
4f0e34
-int
4f0e34
-ppc_linux_nat_target::auxv_parse (gdb_byte **readptr,
4f0e34
-				  gdb_byte *endptr, CORE_ADDR *typep,
4f0e34
-				  CORE_ADDR *valp)
4f0e34
-{
4f0e34
-  int tid = inferior_ptid.lwp ();
4f0e34
-  if (tid == 0)
4f0e34
-    tid = inferior_ptid.pid ();
4f0e34
-
4f0e34
-  int sizeof_auxv_field = ppc_linux_target_wordsize (tid);
4f0e34
-
4f0e34
-  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
4f0e34
-  gdb_byte *ptr = *readptr;
4f0e34
-
4f0e34
-  if (endptr == ptr)
4f0e34
-    return 0;
4f0e34
-
4f0e34
-  if (endptr - ptr < sizeof_auxv_field * 2)
4f0e34
-    return -1;
4f0e34
-
4f0e34
-  *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
4f0e34
-  ptr += sizeof_auxv_field;
4f0e34
-  *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
4f0e34
-  ptr += sizeof_auxv_field;
4f0e34
-
4f0e34
-  *readptr = ptr;
4f0e34
-  return 1;
4f0e34
-}
4f0e34
-
4f0e34
-const struct target_desc *
4f0e34
-ppc_linux_nat_target::read_description ()
4f0e34
-{
4f0e34
-  int tid = inferior_ptid.lwp ();
4f0e34
-  if (tid == 0)
4f0e34
-    tid = inferior_ptid.pid ();
4f0e34
-
4f0e34
-  if (have_ptrace_getsetevrregs)
4f0e34
-    {
4f0e34
-      struct gdb_evrregset_t evrregset;
4f0e34
-
4f0e34
-      if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0)
4f0e34
-        return tdesc_powerpc_e500l;
4f0e34
-
4f0e34
-      /* EIO means that the PTRACE_GETEVRREGS request isn't supported.
4f0e34
-	 Anything else needs to be reported.  */
4f0e34
-      else if (errno != EIO)
4f0e34
-	perror_with_name (_("Unable to fetch SPE registers"));
4f0e34
-    }
4f0e34
-
4f0e34
-  struct ppc_linux_features features = ppc_linux_no_features;
4f0e34
-
4f0e34
-  features.wordsize = ppc_linux_target_wordsize (tid);
4f0e34
-
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
-    {
4f0e34
-      gdb_vsxregset_t vsxregset;
4f0e34
-
4f0e34
-      if (ptrace (PTRACE_GETVSXREGS, tid, 0, &vsxregset) >= 0)
4f0e34
-	features.vsx = true;
4f0e34
-
4f0e34
-      /* EIO means that the PTRACE_GETVSXREGS request isn't supported.
4f0e34
-	 Anything else needs to be reported.  */
4f0e34
-      else if (errno != EIO)
4f0e34
-	perror_with_name (_("Unable to fetch VSX registers"));
4f0e34
-    }
4f0e34
-
4f0e34
-  if (have_ptrace_getvrregs
4f0e34
-      && (hwcap & PPC_FEATURE_HAS_ALTIVEC))
4f0e34
-    {
4f0e34
-      gdb_vrregset_t vrregset;
4f0e34
-
4f0e34
-      if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
4f0e34
-        features.altivec = true;
4f0e34
-
4f0e34
-      /* EIO means that the PTRACE_GETVRREGS request isn't supported.
4f0e34
-	 Anything else needs to be reported.  */
4f0e34
-      else if (errno != EIO)
4f0e34
-	perror_with_name (_("Unable to fetch AltiVec registers"));
4f0e34
-    }
4f0e34
-
4f0e34
-  if (hwcap & PPC_FEATURE_CELL)
4f0e34
-    features.cell = true;
4f0e34
-
4f0e34
-  features.isa205 = ppc_linux_has_isa205 (hwcap);
4f0e34
-
4f0e34
-  if ((hwcap2 & PPC_FEATURE2_DSCR)
4f0e34
-      && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
4f0e34
-      && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
4f0e34
-    {
4f0e34
-      features.ppr_dscr = true;
4f0e34
-      if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
4f0e34
-	  && (hwcap2 & PPC_FEATURE2_TAR)
4f0e34
-	  && (hwcap2 & PPC_FEATURE2_EBB)
4f0e34
-	  && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)
4f0e34
-	  && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET)
4f0e34
-	  && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET))
4f0e34
-	{
4f0e34
-	  features.isa207 = true;
4f0e34
-	  if ((hwcap2 & PPC_FEATURE2_HTM)
4f0e34
-	      && check_regset (tid, NT_PPC_TM_SPR,
4f0e34
-			       PPC_LINUX_SIZEOF_TM_SPRREGSET))
4f0e34
-	    features.htm = true;
4f0e34
-	}
4f0e34
-    }
4f0e34
-
4f0e34
-  return ppc_linux_match_description (features);
4f0e34
-}
4f0e34
-
4f0e34
+void _initialize_ppc_linux_nat ();
4f0e34
 void
4f0e34
 _initialize_ppc_linux_nat (void)
4f0e34
 {