This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[Patch, ARM/AArch64] Add new elf note types
- From: Yufeng Zhang <Yufeng dot Zhang at arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Date: Thu, 15 Nov 2012 16:29:21 +0000
- Subject: [Patch, ARM/AArch64] Add new elf note types
Hi,
This patch adds support for three ARM elf note types in bfd and readelf.
Is it OK to commit it?
Thanks,
Yufeng
include/elf/
2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
* common.h (NT_ARM_TLS, NT_ARM_HW_BREAK, NT_ARM_HW_WATCH): New
macro
definitions.
bfd/
2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
* elf-bfd.h (elfcore_write_arm_tls): Add prototype.
(elfcore_write_arm_hw_break): Likewise.
(elfcore_write_arm_hw_watch): Likewise.
* elf.c (elfcore_grok_arm_tls): New function.
(elfcore_grok_arm_hw_break): Likewise.
(elfcore_grok_arm_hw_watch): Likewise.
(elfcore_grok_note): Call the new functions to handle the
corresponding notes.
(elfcore_write_arm_tls): New function.
(elfcore_write_arm_hw_break): Likewise.
(elfcore_write_arm_hw_watch): Likewise.
(elfcore_write_register_note): Call the new functions to handle the
corresponding pseudo sections.
binutils/
2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
* readelf.c (get_note_type): Handle NT_ARM_TLS, NT_ARM_HW_BREAK
and NT_ARM_HW_WATCH.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index b8d82b1..9d42f44 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2269,6 +2269,12 @@ extern char *elfcore_write_s390_system_call
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_arm_vfp
(bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_arm_tls
+ (bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_arm_hw_break
+ (bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_arm_hw_watch
+ (bfd *, char *, int *, const void *, int);
extern char *elfcore_write_lwpstatus
(bfd *, char *, int *, long, int, const void *);
extern char *elfcore_write_register_note
diff --git a/bfd/elf.c b/bfd/elf.c
index cab1cc7..2bb243d 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -8140,6 +8140,24 @@ elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
}
+static bfd_boolean
+elfcore_grok_arm_tls (bfd *abfd, Elf_Internal_Note *note)
+{
+ return elfcore_make_note_pseudosection (abfd, ".reg-arm-tls", note);
+}
+
+static bfd_boolean
+elfcore_grok_arm_hw_break (bfd *abfd, Elf_Internal_Note *note)
+{
+ return elfcore_make_note_pseudosection (abfd, ".reg-arm-hw-break", note);
+}
+
+static bfd_boolean
+elfcore_grok_arm_hw_watch (bfd *abfd, Elf_Internal_Note *note)
+{
+ return elfcore_make_note_pseudosection (abfd, ".reg-arm-hw-watch", note);
+}
+
#if defined (HAVE_PRPSINFO_T)
typedef prpsinfo_t elfcore_psinfo_t;
#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
@@ -8580,6 +8598,27 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
else
return TRUE;
+ case NT_ARM_TLS:
+ if (note->namesz == 6
+ && strcmp (note->namedata, "LINUX") == 0)
+ return elfcore_grok_arm_tls (abfd, note);
+ else
+ return TRUE;
+
+ case NT_ARM_HW_BREAK:
+ if (note->namesz == 6
+ && strcmp (note->namedata, "LINUX") == 0)
+ return elfcore_grok_arm_hw_break (abfd, note);
+ else
+ return TRUE;
+
+ case NT_ARM_HW_WATCH:
+ if (note->namesz == 6
+ && strcmp (note->namedata, "LINUX") == 0)
+ return elfcore_grok_arm_hw_watch (abfd, note);
+ else
+ return TRUE;
+
case NT_PRPSINFO:
case NT_PSINFO:
if (bed->elf_backend_grok_psinfo)
@@ -9376,6 +9415,42 @@ elfcore_write_arm_vfp (bfd *abfd,
}
char *
+elfcore_write_arm_tls (bfd *abfd,
+ char *buf,
+ int *bufsiz,
+ const void *arm_tls,
+ int size)
+{
+ char *note_name = "LINUX";
+ return elfcore_write_note (abfd, buf, bufsiz,
+ note_name, NT_ARM_TLS, arm_tls, size);
+}
+
+char *
+elfcore_write_arm_hw_break (bfd *abfd,
+ char *buf,
+ int *bufsiz,
+ const void *arm_hw_break,
+ int size)
+{
+ char *note_name = "LINUX";
+ return elfcore_write_note (abfd, buf, bufsiz,
+ note_name, NT_ARM_HW_BREAK, arm_hw_break, size);
+}
+
+char *
+elfcore_write_arm_hw_watch (bfd *abfd,
+ char *buf,
+ int *bufsiz,
+ const void *arm_hw_watch,
+ int size)
+{
+ char *note_name = "LINUX";
+ return elfcore_write_note (abfd, buf, bufsiz,
+ note_name, NT_ARM_HW_WATCH, arm_hw_watch, size);
+}
+
+char *
elfcore_write_register_note (bfd *abfd,
char *buf,
int *bufsiz,
@@ -9411,6 +9486,12 @@ elfcore_write_register_note (bfd *abfd,
return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
if (strcmp (section, ".reg-arm-vfp") == 0)
return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
+ if (strcmp (section, ".reg-arm-tls") == 0)
+ return elfcore_write_arm_tls (abfd, buf, bufsiz, data, size);
+ if (strcmp (section, ".reg-arm-hw-break") == 0)
+ return elfcore_write_arm_hw_break (abfd, buf, bufsiz, data, size);
+ if (strcmp (section, ".reg-arm-hw-watch") == 0)
+ return elfcore_write_arm_hw_watch (abfd, buf, bufsiz, data, size);
return NULL;
}
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 2fbf2ae..1a52130 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -12600,6 +12600,12 @@ get_note_type (unsigned e_type)
return _("NT_S390_PREFIX (s390 prefix register)");
case NT_ARM_VFP:
return _("NT_ARM_VFP (arm VFP registers)");
+ case NT_ARM_TLS:
+ return _("NT_ARM_TLS (arm TLS registers)");
+ case NT_ARM_HW_BREAK:
+ return _("NT_ARM_HW_BREAK (arm hardware breakpoint registers)");
+ case NT_ARM_HW_WATCH:
+ return _("NT_ARM_HW_WATCH (arm hardware watchpoint registers)");
case NT_PSTATUS:
return _("NT_PSTATUS (pstatus structure)");
case NT_FPREGS:
diff --git a/include/elf/common.h b/include/elf/common.h
index 1c681d5..7814733 100644
--- a/include/elf/common.h
+++ b/include/elf/common.h
@@ -549,6 +549,12 @@
/* note name must be "LINUX". */
#define NT_ARM_VFP 0x400 /* ARM VFP registers */
/* note name must be "LINUX". */
+#define NT_ARM_TLS 0x401 /* ARM TLS registers */
+ /* note name must be "LINUX". */
+#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */
+ /* note name must be "LINUX". */
+#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */
+ /* note name must be "LINUX". */
/* Note segments for core files on dir-style procfs systems. */