From 4339cae0bb39a38117d51fc52066e659dccaee29 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 2 Feb 2010 12:37:40 +0000 Subject: [PATCH] Add NT_386_XSTATE. bfd/ 2010-02-02 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-02-02 H.J. Lu * readelf.c (get_note_type): Handle NT_X86_XSTATE. include/elf/ 2010-02-02 H.J. Lu * common.h (NT_386_XSTATE): New. --- bfd/ChangeLog | 9 +++++++++ bfd/elf-bfd.h | 2 ++ bfd/elf.c | 28 ++++++++++++++++++++++++++++ binutils/ChangeLog | 4 ++++ binutils/readelf.c | 2 ++ include/elf/ChangeLog | 6 +++++- include/elf/common.h | 2 ++ 7 files changed, 52 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7e1f1c29a67..791ec74424e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2010-02-02 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. + 2010-02-01 Tristan Gingold * som.c (som_write_ar_hdr): Define this macro. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index daa2b62d9a5..3c3ac9b256b 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 19e4695f2b6..c1762564ac1 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) { @@ -7996,6 +8006,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) @@ -8635,6 +8652,15 @@ elfcore_write_prxfpreg (bfd *abfd, note_name, NT_PRXFPREG, xfpregs, size); } +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, @@ -8684,6 +8710,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/ChangeLog b/binutils/ChangeLog index 719192b5ff2..ede4c6de667 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2010-02-02 H.J. Lu + + * readelf.c (get_note_type): Handle NT_X86_XSTATE. + 2010-02-01 Nathan Sidwell * objcopy.c (copy_object): Set SEC_LINKER_CREATED when adding diff --git a/binutils/readelf.c b/binutils/readelf.c index b9de73a116a..34dbfacf516 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/ChangeLog b/include/elf/ChangeLog index ee204ccb101..41f1286c29a 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,6 +1,10 @@ +2010-02-02 H.J. Lu + + * common.h (NT_386_XSTATE): New. + 2010-01-19 Daisuke Hatayama - * common.h (PN_XNUM): Define. + * common.h (PN_XNUM): Define. 2009-12-18 Ulrich Weigand diff --git a/include/elf/common.h b/include/elf/common.h index 703916e6490..a7629023193 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". */ -- 2.30.2