components/gdb/patches/gdb.bfd.elf32-sparc.c.patch
author Mike Sullivan <Mike.Sullivan@Oracle.COM>
Tue, 17 Jun 2014 10:59:59 -0700
branchs11-update
changeset 3184 5e069d70e84c
parent 2814 dff3ca0071d6
child 6420 65948e9e205b
permissions -rw-r--r--
Close of build 42.1.

--- gdb-7.6/bfd/elf32-sparc.c	2013-02-20 19:02:29.000000000 -0800
+++ gdb-7.6/bfd/elf32-sparc.c	2013-10-06 14:13:09.059973200 -0700
@@ -30,34 +30,135 @@
 #include "elfxx-sparc.h"
 #include "elf-vxworks.h"
 
-/* Support for core dump NOTE sections.  */
+#include <stddef.h>
+#include <sys/elf.h>
+#include <sys/procfs.h>
+#include <sys/regset.h>
+#include <sys/auxv.h>
 
+/* Support for Solaris core dump NOTE sections.  */
 static bfd_boolean
-elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
-{
-  switch (note->descsz)
+solaris_elf32_sparc_grok_info (bfd *abfd, Elf_Internal_Note *note)
     {
-    default:
-      return FALSE;
+  asection *sect;
+  /* 32-bit regset sizes */
+  size_t gregset_size = 152;
+  size_t fpregset_size = 144;
+  char reg2_section_name[16];
+  auxv_t* p_auxv = NULL;
+
+  switch (note->type)
+  {
+    case SOLARIS_NT_PRSTATUS:
+      if (note->descsz == 508) /* sizeof(prstatus_t) */
+      {
+        elf_tdata (abfd)->core->signal =
+          bfd_get_16 (abfd, note->descdata + 136);
+        elf_tdata (abfd)->core->pid =
+          bfd_get_32 (abfd, note->descdata + 216);
+        elf_tdata (abfd)->core->lwpid =
+          bfd_get_32 (abfd, note->descdata + 308);
 
-    case 260:			/* Solaris prpsinfo_t.  */
+        sect = bfd_get_section_by_name (abfd, ".reg");
+
+        if (sect != NULL)
+          sect->size = sizeof(prgregset_t);
+
+         return _bfd_elfcore_make_pseudosection (abfd, ".reg", gregset_size,
+             note->descpos + 356);
+      }
+      return TRUE;
+      break;
+    case SOLARIS_NT_PRFPREG:
+      return TRUE;
+      break;
+    case SOLARIS_NT_PRPSINFO:
+      if (note->descsz == 260) /* sizeof(prpsinfo_t) */
+      {
       elf_tdata (abfd)->core->program
 	= _bfd_elfcore_strndup (abfd, note->descdata + 84, 16);
       elf_tdata (abfd)->core->command
 	= _bfd_elfcore_strndup (abfd, note->descdata + 100, 80);
+      }
+      return TRUE;
       break;
-
-    case 336:			/* Solaris psinfo_t.  */
+    case SOLARIS_NT_PRXREG:
+      return TRUE;
+      break;
+    case SOLARIS_NT_PLATFORM:
+      return TRUE;
+      break;
+    case SOLARIS_NT_AUXV:
+      return TRUE;
+    case SOLARIS_NT_PSTATUS:
+      return TRUE;
+      break;
+    case SOLARIS_NT_PSINFO:
+      if (note->descsz == 336) /* sizeof(psinfo_t) */
+      {
       elf_tdata (abfd)->core->program
 	= _bfd_elfcore_strndup (abfd, note->descdata + 88, 16);
       elf_tdata (abfd)->core->command
 	= _bfd_elfcore_strndup (abfd, note->descdata + 104, 80);
+      }
+      return TRUE;
+      break;
+    case SOLARIS_NT_PRCRED:
+      return TRUE;
+      break;
+    case SOLARIS_NT_UTSNAME:
+      return TRUE;
+      break;
+    case SOLARIS_NT_LWPSTATUS:
+      if (note->descsz == 896) /* sizeof(lwpstatus_t) */
+      {
+        (void) snprintf (reg2_section_name, 16, "%s/%i", ".reg2", 1);
+        sect = bfd_get_section_by_name (abfd, reg2_section_name);
+        if (sect != NULL)
+        {
+          sect->size = fpregset_size;
+          sect->filepos = note->descpos + 496;
+          sect->alignment_power = 2;
+          return TRUE;
+        }
+        else
+          return _bfd_elfcore_make_pseudosection (abfd, reg2_section_name,
+              fpregset_size, note->descpos + 496);
+      }
+      return TRUE;
+      break;
+    case SOLARIS_NT_LWPSINFO:
+      return TRUE;
+      break;
+    case SOLARIS_NT_PRCPUXREG:
+      return TRUE;
+      break;
+    default:
+      return TRUE;
       break;
     }
-
   return TRUE;
 }
 
+static bfd_boolean
+elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
+{
+  return solaris_elf32_sparc_grok_info (abfd, note);
+}
+
+
+static bfd_boolean
+elf32_sparc_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
+{
+  return solaris_elf32_sparc_grok_info (abfd, note);
+}
+
+static bfd_boolean
+elf32_sparc_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
+{
+  return solaris_elf32_sparc_grok_info (abfd, note);
+}
+
 /* Functions for dealing with the e_flags field.
 
    We don't define set_private_flags or copy_private_bfd_data because
@@ -201,6 +302,9 @@
 #define elf_backend_final_write_processing \
 					elf32_sparc_final_write_processing
 #define elf_backend_grok_psinfo		elf32_sparc_grok_psinfo
+#define elf_backend_grok_prstatus       elf32_sparc_grok_prstatus
+#define elf_backend_grok_lwpstatus      elf32_sparc_grok_lwpstatus
+#define elf_backend_grok_lwpinfo        elf32_sparc_grok_lwpinfo
 #define elf_backend_reloc_type_class	elf32_sparc_reloc_type_class
 
 #define elf_info_to_howto		_bfd_sparc_elf_info_to_howto