bfd/ 2010-01-27 H.J. Lu * 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 * readelf.c (get_note_type): Handle NT_X86_XSTATE. include/elf/ 2010-01-27 H.J. Lu * 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". */