diff options
author | Anton Kolesov <Anton.Kolesov@synopsys.com> | 2017-05-15 16:17:29 +0300 |
---|---|---|
committer | Claudiu Zissulescu <claziss@gmail.com> | 2020-04-23 11:09:09 +0300 |
commit | 2745674244d6aecddcf636475034bdb9c0a6b4a0 (patch) | |
tree | 9dccc5b7f4444f1971361691119062f69c24c57c /bfd | |
parent | 96038148d0e9f7dc89284310d065e27a3fa375f2 (diff) | |
download | gdb-2745674244d6aecddcf636475034bdb9c0a6b4a0.zip gdb-2745674244d6aecddcf636475034bdb9c0a6b4a0.tar.gz gdb-2745674244d6aecddcf636475034bdb9c0a6b4a0.tar.bz2 |
arc: Add support for ARC HS extra registers in core files
When a coredump is generated, there are a few registers in
ARC HS that are put under a special section, namely ".reg-v2".
It is for backward compatibility reasons with older tools that
we have decided not to extend the generic ".reg" section.
This patch makes it possible to display the information better
regarding that section. Compare the output of "readelf" without
and with these changes:
$ readelf -n core # without the patch
...
LINUX 0x0000000c Unknown note type: (0x00000600)
description data: 78 08 00 00 2f 6c 64 2d 75 43 6c 69
$ readelf -n core # with the patch
...
LINUX 0x0000000c NT_ARC_V2 (ARC HS accumulator/extra registers)
description data: 78 08 00 00 2f 6c 64 2d 75 43 6c 69
In another commit (soon to be submitted), GDB will makes use of these
changes to parse the extra section and its registers.
bfd/ChangeLog
2020-03-26 Anton Kolesov <anton.kolesov@synopsys.com>
* elf-bfd.h (elfcore_write_arc_v2): Add prototype.
* elf.c (elfcore_grok_arc_v2): New function.
(elfcore_grok_note): Call the new function to handle the corresponding
note.
(elfcore_write_arc_v2): New function.
(elfcore_write_register_note): Call the new function to handle the
corresponding pseudo-sections.
binutils/ChangeLog
2020-03-26 Anton Kolesov <anton.kolesov@synopsys.com>
* readelf.c (get_note_type): Handle NT_ARC_V2.
include/elf/ChangeLog
2020-03-26 Anton Kolesov <anton.kolesov@synopsys.com>
* common.h (NT_ARC_V2): New macro definitions.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 2 | ||||
-rw-r--r-- | bfd/elf.c | 27 |
3 files changed, 39 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index adba80c..c81b97b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2020-04-23 Anton Kolesov <anton.kolesov@synopsys.com> + + * elf-bfd.h (elfcore_write_arc_v2): Add prototype. + * elf.c (elfcore_grok_arc_v2): New function. + (elfcore_grok_note): Call the new function to handle the corresponding + note. + (elfcore_write_arc_v2): New function. + (elfcore_write_register_note): Call the new function to handle the + corresponding pseudo-sections. + 2020-04-22 Max Filippov <jcmvbkbc@gmail.com> PR ld/25861 diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 3ae9842..e69234d 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2738,6 +2738,8 @@ extern char *elfcore_write_aarch_sve (bfd *, char *, int *, const void *, int); extern char *elfcore_write_aarch_pauth (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_arc_v2 + (bfd *, char *, int *, const void *, int); extern char *elfcore_write_lwpstatus (bfd *, char *, int *, long, int, const void *); extern char *elfcore_write_register_note @@ -9865,6 +9865,12 @@ elfcore_grok_aarch_pauth (bfd *abfd, Elf_Internal_Note *note) return elfcore_make_note_pseudosection (abfd, ".reg-aarch-pauth", note); } +static bfd_boolean +elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note) +{ + return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note); +} + #if defined (HAVE_PRPSINFO_T) typedef prpsinfo_t elfcore_psinfo_t; #if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */ @@ -10424,6 +10430,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) else return TRUE; + case NT_ARC_V2: + if (note->namesz == 6 + && strcmp (note->namedata, "LINUX") == 0) + return elfcore_grok_arc_v2 (abfd, note); + else + return TRUE; + case NT_ARM_VFP: if (note->namesz == 6 && strcmp (note->namedata, "LINUX") == 0) @@ -11836,6 +11849,18 @@ elfcore_write_aarch_pauth (bfd *abfd, } char * +elfcore_write_arc_v2 (bfd *abfd, + char *buf, + int *bufsiz, + const void *arc_v2, + int size) +{ + char *note_name = "LINUX"; + return elfcore_write_note (abfd, buf, bufsiz, + note_name, NT_ARC_V2, arc_v2, size); +} + +char * elfcore_write_register_note (bfd *abfd, char *buf, int *bufsiz, @@ -11917,6 +11942,8 @@ elfcore_write_register_note (bfd *abfd, return elfcore_write_aarch_sve (abfd, buf, bufsiz, data, size); if (strcmp (section, ".reg-aarch-pauth") == 0) return elfcore_write_aarch_pauth (abfd, buf, bufsiz, data, size); + if (strcmp (section, ".reg-arc-v2") == 0) + return elfcore_write_arc_v2 (abfd, buf, bufsiz, data, size); return NULL; } |