PATCH [1/n]: Support AVX core dump

H.J. Lu hjl.tools@gmail.com
Tue Feb 2 05:56:00 GMT 2010


On Mon, Feb 1, 2010 at 6:30 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> Hi,
>
> Here is the first patch to support AVX core dump and debug. OK to install?
>
> Thanks.
>
>
> H.J.
> ---
>
> bfd/
>
> 2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>
>
>        * elf-bfd.h (elfcore_write_xstatereg): New.
>
>        * elf.c (elfcore_grok_xstatereg): New.
>        (elfcore_write_xstatereg): Likewise.
>        (elfcore_grok_note): Handle NT_X86_XSTATE.
>        (elfcore_write_register_note): Handle .reg-xstate section.
>
> binutils/
>
> 2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>
>
>        * readelf.c (get_note_type): Handle NT_X86_XSTATE.
>
> include/elf/
>
> 2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>
>
>        * common.h (NT_386_XSTATE): New.
>
>

Hi,

The AVX debug support has been checked into kernel. I'd like to check in this
binutils support. Full gdb patch will come later.

Thanks.

-- 
H.J.
-------------- next part --------------
bfd/

2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>

	* elf-bfd.h (elfcore_write_xstatereg): New.

	* elf.c (elfcore_grok_xstatereg): New.
	(elfcore_write_xstatereg): Likewise.
	(elfcore_grok_note): Handle NT_X86_XSTATE.
	(elfcore_write_register_note): Handle .reg-xstate section.

binutils/

2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>

	* readelf.c (get_note_type): Handle NT_X86_XSTATE.

include/elf/

2010-01-27  H.J. Lu  <hongjiu.lu@intel.com>

	* common.h (NT_386_XSTATE): New.

diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index daa2b62..3c3ac9b 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2149,6 +2149,8 @@ extern char *elfcore_write_prfpreg
   (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_prxfpreg
   (bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_xstatereg
+  (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_ppc_vmx
   (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_ppc_vsx
diff --git a/bfd/elf.c b/bfd/elf.c
index aac3314..4fff4a7 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7628,6 +7628,16 @@ elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
   return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
 }
 
+/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
+   with a note type of NT_X86_XSTATE.  Just include the whole note's
+   contents literally.  */
+
+static bfd_boolean
+elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
+{
+  return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
+}
+
 static bfd_boolean
 elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
 {
@@ -7993,6 +8003,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
       else
 	return TRUE;
 
+    case NT_X86_XSTATE:		/* Linux XSAVE extension */
+      if (note->namesz == 6
+	  && strcmp (note->namedata, "LINUX") == 0)
+	return elfcore_grok_xstatereg (abfd, note);
+      else
+	return TRUE;
+
     case NT_PPC_VMX:
       if (note->namesz == 6
 	  && strcmp (note->namedata, "LINUX") == 0)
@@ -8633,6 +8650,15 @@ elfcore_write_prxfpreg (bfd *abfd,
 }
 
 char *
+elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
+			 const void *xfpregs, int size)
+{
+  char *note_name = "LINUX";
+  return elfcore_write_note (abfd, buf, bufsiz,
+			     note_name, NT_X86_XSTATE, xfpregs, size);
+}
+
+char *
 elfcore_write_ppc_vmx (bfd *abfd,
 		       char *buf,
 		       int *bufsiz,
@@ -8681,6 +8707,8 @@ elfcore_write_register_note (bfd *abfd,
     return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
   if (strcmp (section, ".reg-xfp") == 0)
     return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
+  if (strcmp (section, ".reg-xstate") == 0)
+    return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
   if (strcmp (section, ".reg-ppc-vmx") == 0)
     return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
   if (strcmp (section, ".reg-ppc-vsx") == 0)
diff --git a/binutils/readelf.c b/binutils/readelf.c
index b9de73a..34dbfac 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -10415,6 +10415,8 @@ get_note_type (unsigned e_type)
 	return _("NT_PPC_VMX (ppc Altivec registers)");
       case NT_PPC_VSX:
 	return _("NT_PPC_VSX (ppc VSX registers)");
+      case NT_X86_XSTATE:
+	return _("NT_X86_XSTATE (x86 XSAVE extended state)");
       case NT_S390_HIGH_GPRS:
 	return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
       case NT_PSTATUS:
diff --git a/include/elf/common.h b/include/elf/common.h
index 703916e..a762902 100644
--- a/include/elf/common.h
+++ b/include/elf/common.h
@@ -513,6 +513,8 @@
 					/*   note name must be "LINUX".  */
 #define NT_PPC_VSX	0x102		/* PowerPC VSX registers */
 					/*   note name must be "LINUX".  */
+#define NT_X86_XSTATE	0x202		/* x86 XSAVE extended state */
+					/*   note name must be "LINUX".  */
 #define NT_S390_HIGH_GPRS 0x300		/* S/390 upper halves of GPRs  */
 					/*   note name must be "LINUX".  */
 


More information about the Binutils mailing list