Blame SOURCES/gdb-rhbz1669953-aarch64-sve-binutils.patch

190f2a
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
190f2a
From: Keith Seitz <keiths@redhat.com>
190f2a
Date: Tue, 19 Mar 2019 11:38:37 -0700
190f2a
Subject: gdb-rhbz1669953-aarch64-sve-binutils.patch
190f2a
190f2a
;; Fix 'gdb fails to read zN registers from corefile with aarch64 SVE'
190f2a
;; Alan Hayward, RH BZ 1669953
190f2a
190f2a
Add checks for the NT_ARM_SVE section in a core file.
190f2a
190f2a
The NT_ARM_SVE section is documented here:
190f2a
  https://github.com/torvalds/linux/blob/master/Documentation/arm64/sve.txt
190f2a
  * A NT_ARM_SVE note will be added to each coredump for each thread of the
190f2a
   dumped process.  The contents will be equivalent to the data that would have
190f2a
   been read if a PTRACE_GETREGSET of NT_ARM_SVE were executed for each thread
190f2a
   when the coredump was generated.
190f2a
190f2a
        * elf.c (elfcore_grok_aarch_sve): New function.
190f2a
        (elfcore_grok_note): Check for Aarch64 SVE.
190f2a
        (elfcore_write_aarch_sve): New function.
190f2a
        (elfcore_write_register_note): Check for Aarch64 SVE.
190f2a
        * elf-bfd.h(elfcore_grok_aarch_sve): New declaration.
190f2a
190f2a
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
190f2a
--- a/bfd/elf-bfd.h
190f2a
+++ b/bfd/elf-bfd.h
190f2a
@@ -2601,6 +2601,8 @@ extern char *elfcore_write_aarch_hw_break
190f2a
   (bfd *, char *, int *, const void *, int);
190f2a
 extern char *elfcore_write_aarch_hw_watch
190f2a
   (bfd *, char *, int *, const void *, int);
190f2a
+extern char *elfcore_write_aarch_sve
190f2a
+  (bfd *, char *, int *, const void *, int);
190f2a
 extern char *elfcore_write_lwpstatus
190f2a
   (bfd *, char *, int *, long, int, const void *);
190f2a
 extern char *elfcore_write_register_note
190f2a
diff --git a/bfd/elf.c b/bfd/elf.c
190f2a
--- a/bfd/elf.c
190f2a
+++ b/bfd/elf.c
190f2a
@@ -9340,6 +9340,12 @@ elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
190f2a
   return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
190f2a
 }
190f2a
 
190f2a
+static bfd_boolean
190f2a
+elfcore_grok_aarch_sve (bfd *abfd, Elf_Internal_Note *note)
190f2a
+{
190f2a
+  return elfcore_make_note_pseudosection (abfd, ".reg-aarch-sve", note);
190f2a
+}
190f2a
+
190f2a
 #if defined (HAVE_PRPSINFO_T)
190f2a
 typedef prpsinfo_t   elfcore_psinfo_t;
190f2a
 #if defined (HAVE_PRPSINFO32_T)		/* Sparc64 cross Sparc32 */
190f2a
@@ -9836,6 +9842,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
190f2a
       else
190f2a
 	return TRUE;
190f2a
 
190f2a
+    case NT_ARM_SVE:
190f2a
+      if (note->namesz == 6
190f2a
+	  && strcmp (note->namedata, "LINUX") == 0)
190f2a
+	return elfcore_grok_aarch_sve (abfd, note);
190f2a
+      else
190f2a
+	return TRUE;
190f2a
+
190f2a
     case NT_PRPSINFO:
190f2a
     case NT_PSINFO:
190f2a
       if (bed->elf_backend_grok_psinfo)
190f2a
@@ -11027,6 +11040,18 @@ elfcore_write_aarch_hw_watch (bfd *abfd,
190f2a
 			     note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
190f2a
 }
190f2a
 
190f2a
+char *
190f2a
+elfcore_write_aarch_sve (bfd *abfd,
190f2a
+			 char *buf,
190f2a
+			 int *bufsiz,
190f2a
+			 const void *aarch_sve,
190f2a
+			 int size)
190f2a
+{
190f2a
+  char *note_name = "LINUX";
190f2a
+  return elfcore_write_note (abfd, buf, bufsiz,
190f2a
+			     note_name, NT_ARM_SVE, aarch_sve, size);
190f2a
+}
190f2a
+
190f2a
 char *
190f2a
 elfcore_write_register_note (bfd *abfd,
190f2a
 			     char *buf,
190f2a
@@ -11079,6 +11104,8 @@ elfcore_write_register_note (bfd *abfd,
190f2a
     return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
190f2a
   if (strcmp (section, ".reg-aarch-hw-watch") == 0)
190f2a
     return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
190f2a
+  if (strcmp (section, ".reg-aarch-sve") == 0)
190f2a
+    return elfcore_write_aarch_sve (abfd, buf, bufsiz, data, size);
190f2a
   return NULL;
190f2a
 }
190f2a