[PATCH] bfd/aarch64: Core file support for FPMR

Richard Earnshaw Richard.Earnshaw@arm.com
Wed Nov 12 15:15:27 GMT 2025


On 04/09/2025 12:23, Ezra.Sitorus@arm.com wrote:
> From: Ezra Sitorus <ezra.sitorus@arm.com>
> 
> Add required code to support core file dumps with NT_ARM_FPMR in them.

These changes are to generic ELF support files, so I think they need 
approval from one of the main maintainers.  However, I have some 
comments below...

> ---
> Regression tested on aarch64-none-linux-gnu.
> 
> Ezra
> 
>   bfd/elf-bfd.h        |  2 ++
>   bfd/elf.c            | 28 ++++++++++++++++++++++++++++
>   binutils/readelf.c   |  2 ++
>   include/elf/common.h |  2 ++
>   4 files changed, 34 insertions(+)
> 
> diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
> index de7cc410a99..7fff172b84e 100644
> --- a/bfd/elf-bfd.h
> +++ b/bfd/elf-bfd.h
> @@ -3003,6 +3003,8 @@ extern char *elfcore_write_aarch_za
>     (bfd *, char *, int *, const void *, int);
>   extern char *elfcore_write_aarch_zt
>     (bfd *, char *, int *, const void *, int);
> +extern char *elfcore_write_aarch_fpmr
> +  (bfd *, char *, int *, const void *, int);
>   extern char *elfcore_write_arc_v2
>     (bfd *, char *, int *, const void *, int);
>   extern char *elfcore_write_riscv_csr
> diff --git a/bfd/elf.c b/bfd/elf.c
> index 6ef60301091..6abfed057da 100644
> --- a/bfd/elf.c
> +++ b/bfd/elf.c
> @@ -61,6 +61,7 @@ SECTION
>   #define NOTE_NAME_LINUX    "LINUX"
>   
>   /* Names of a pseudo-section which represent core notes.  */
> +#define NOTE_PSEUDO_SECTION_AARCH_FPMR		".reg-aarch-fpmr"
>   #define NOTE_PSEUDO_SECTION_AARCH_GCS		".reg-aarch-gcs"
>   #define NOTE_PSEUDO_SECTION_AARCH_HW_BREAK	".reg-aarch-hw-break"
>   #define NOTE_PSEUDO_SECTION_AARCH_HW_WATCH	".reg-aarch-hw-watch"
> @@ -10732,6 +10733,15 @@ elfcore_grok_aarch_gcs (bfd *abfd, Elf_Internal_Note *note)
>     return elfcore_make_note_pseudosection (abfd, NOTE_PSEUDO_SECTION_AARCH_GCS, note);
>   }
>   
> +/* Convert NOTE into a bfd_section called ".reg-aarch-fpmr".  Return TRUE if
> +   successful, otherwise return FALSE.  */
> +
> +static bool
> +elfcore_grok_aarch_fpmr (bfd *abfd, Elf_Internal_Note *note)
> +{
> +  return elfcore_make_note_pseudosection (abfd, NOTE_PSEUDO_SECTION_AARCH_FPMR, note);
> +}
> +

This function looks to be essentially the same as the one before it (and 
possibly the two before that as well) apart from one argument.  That 
makes me wonder if they should be refactored to have one routine that 
takes that varying argument as a parameter.

>   static bool
>   elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note)
>   {
> @@ -11165,6 +11175,7 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
>   	{
>   	case NT_386_TLS:	return elfcore_grok_i386_tls (abfd, note);
>   	case NT_ARC_V2:		return elfcore_grok_arc_v2 (abfd, note);
> +	case NT_ARM_FPMR:	return elfcore_grok_aarch_fpmr (abfd, note);
>   	case NT_ARM_GCS:	return elfcore_grok_aarch_gcs (abfd, note);
>   	case NT_ARM_HW_BREAK:	return elfcore_grok_aarch_hw_break (abfd, note);
>   	case NT_ARM_HW_WATCH:	return elfcore_grok_aarch_hw_watch (abfd, note);
Then the 4 functions above could pass this argument to a single bit of code.

> @@ -12878,6 +12889,22 @@ elfcore_write_aarch_gcs (bfd *abfd, char *buf, int *bufsiz,
>   			     aarch_gcs, size);
>   }
>   
> +/* Write the buffer of FPMR value in AARCH_FPMR (length SIZE) into
> +   the note buffer BUF and update *BUFSIZ.  ABFD is the bfd the note is being
> +   written into.  Return a pointer to the new start of the note buffer, to
> +   replace BUF which may no longer be valid.  */
> +
> +char *
> +elfcore_write_aarch_fpmr (bfd *abfd,
> +			char *buf,
> +			int *bufsiz,
> +			const void *aarch_fpmr,
> +			int size)
> +{
> +  return elfcore_write_note (abfd, buf, bufsiz,
> +			     NOTE_NAME_LINUX, NT_ARM_FPMR, aarch_fpmr, size);
> +}
> +
>   char *
>   elfcore_write_arc_v2 (bfd *abfd,
>   		      char *buf,
> @@ -12984,6 +13011,7 @@ elfcore_write_register_note (bfd *abfd,
>       }
>     note_writers [] =
>       {
> +      { NOTE_PSEUDO_SECTION_AARCH_FPMR,       elfcore_write_aarch_fpmr},
>         { NOTE_PSEUDO_SECTION_AARCH_GCS,        elfcore_write_aarch_gcs},
>         { NOTE_PSEUDO_SECTION_AARCH_HW_BREAK,   elfcore_write_aarch_hw_break},
>         { NOTE_PSEUDO_SECTION_AARCH_HW_WATCH,   elfcore_write_aarch_hw_watch},
> diff --git a/binutils/readelf.c b/binutils/readelf.c
> index 2affc713adb..dda4bb38b72 100644
> --- a/binutils/readelf.c
> +++ b/binutils/readelf.c
> @@ -21347,6 +21347,8 @@ get_note_type (Filedata * filedata, unsigned e_type)
>   	return _("NT_ARM_ZT (AArch64 SME2 ZT registers)");
>         case NT_ARM_PAC_ENABLED_KEYS:
>   	return _("NT_ARM_PAC_ENABLED_KEYS (AArch64 pointer authentication enabled keys)");
> +      case NT_ARM_FPMR:
> +	return _("NT_ARM_FPMR (AArch64 Floating Point Mode Register)");
>         case NT_ARC_V2:
>   	return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
>         case NT_RISCV_CSR:
> diff --git a/include/elf/common.h b/include/elf/common.h
> index 0d9a7b7a8a9..ebe893ebf13 100644
> --- a/include/elf/common.h
> +++ b/include/elf/common.h
> @@ -741,6 +741,8 @@
>   					/*   Note: name must be "LINUX".  */
>   #define NT_ARM_ZT       0x40d           /* AArch64 SME2 ZT registers.  */
>   					/*   Note: name must be "LINUX".  */
> +#define NT_ARM_FPMR     0x40e           /* AArch64 FPMR.  */
> +					/*   Note: name must be "LINUX".  */
>   #define NT_ARM_GCS	0x410		/* AArch64 Guarded Control Stack
>   					   registers.  */
>   					/*   Note  name must be "LINUX".  */R.


More information about the Binutils mailing list