]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd/binutils: add support for RISC-V CSRs in core files
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 27 Nov 2020 14:04:16 +0000 (14:04 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 5 Mar 2021 17:21:41 +0000 (17:21 +0000)
Adds support for including RISC-V control and status registers into
core files.

The value for the define NT_RISCV_CSR is set to 0x900, this
corresponds to a patch I have proposed for the Linux kernel here:

  http://lists.infradead.org/pipermail/linux-riscv/2020-December/003910.html

As I have not yet heard if the above patch will be accepted into the
kernel or not I have set the note name string to "GDB", and the note
type to NT_RISCV_CSR.

This means that if the above patch is rejected from the kernel, and
the note type number 0x900 is assigned to some other note type, we
will still be able to distinguish between the GDB produced
NT_RISCV_CSR, and the kernel produced notes, where the name would be
set to "CORE".

bfd/ChangeLog:

* elf-bfd.h (elfcore_write_riscv_csr): Declare.
* elf.c (elfcore_grok_riscv_csr): New function.
(elfcore_grok_note): Handle NT_RISCV_CSR.
(elfcore_write_riscv_csr): New function.
(elfcore_write_register_note): Handle '.reg-riscv-csr'.

binutils/ChangeLog:

* readelf.c (get_note_type): Handle NT_RISCV_CSR.

include/ChangeLog:

* elf/common.h (NT_RISCV_CSR): Define.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
binutils/ChangeLog
binutils/readelf.c
include/ChangeLog
include/elf/common.h

index 9e7f90e16253def5b505603e9a3294480df59459..dac602b907616cad8181e2cf1bd5c96191564606 100644 (file)
@@ -1,3 +1,12 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * elf-bfd.h (elfcore_write_riscv_csr): Declare.
+       * elf.c (elfcore_grok_riscv_csr): New function.
+       (elfcore_grok_note): Handle NT_RISCV_CSR.
+       (elfcore_write_riscv_csr): New function.
+       (elfcore_write_register_note): Handle '.reg-riscv-csr'.
+
 2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
            Andrew Burgess  <andrew.burgess@embecosm.com>
 
index 69e18036a49730e89e9374952d3a6a4e2e0ef6b3..c40030bdca639ef63c3215644d71da535da942f1 100644 (file)
@@ -2798,6 +2798,8 @@ 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_riscv_csr
+  (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_gdb_tdesc
   (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_lwpstatus
index 2d66e9b999f57303a21c973108e64d04dc61154b..553fa65a1184118f706bf35682ef10f01a06c2d9 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9912,6 +9912,15 @@ elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note)
   return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note);
 }
 
+/* Convert NOTE into a bfd_section called ".reg-riscv-csr".  Return TRUE if
+   successful otherwise, return FALSE.  */
+
+static bfd_boolean
+elfcore_grok_riscv_csr (bfd *abfd, Elf_Internal_Note *note)
+{
+  return elfcore_make_note_pseudosection (abfd, ".reg-riscv-csr", note);
+}
+
 /* Convert NOTE into a bfd_section called ".gdb-tdesc".  Return TRUE if
    successful otherwise, return FALSE.  */
 
@@ -10586,6 +10595,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
       else
         return TRUE;
 
+    case NT_RISCV_CSR:
+      if (note->namesz == 4
+          && strcmp (note->namedata, "GDB") == 0)
+        return elfcore_grok_riscv_csr (abfd, note);
+      else
+       return TRUE;
+
     case NT_PRPSINFO:
     case NT_PSINFO:
       if (bed->elf_backend_grok_psinfo)
@@ -11967,6 +11983,23 @@ elfcore_write_arc_v2 (bfd *abfd,
                             note_name, NT_ARC_V2, arc_v2, size);
 }
 
+/* Write the buffer of csr values in CSRS (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_riscv_csr (bfd *abfd,
+                         char *buf,
+                         int *bufsiz,
+                         const void *csrs,
+                         int size)
+{
+  const char *note_name = "GDB";
+  return elfcore_write_note (abfd, buf, bufsiz,
+                            note_name, NT_RISCV_CSR, csrs, size);
+}
+
 /* Write the target description (a string) pointed to by TDESC, 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
@@ -12070,6 +12103,8 @@ elfcore_write_register_note (bfd *abfd,
     return elfcore_write_arc_v2 (abfd, buf, bufsiz, data, size);
   if (strcmp (section, ".gdb-tdesc") == 0)
     return elfcore_write_gdb_tdesc (abfd, buf, bufsiz, data, size);
+  if (strcmp (section, ".reg-riscv-csr") == 0)
+    return elfcore_write_riscv_csr (abfd, buf, bufsiz, data, size);
   return NULL;
 }
 
index 80b6ea6a4c7d05c62c6a42a6ef48c63cbadfcb57..b5a9b56954cd59da49e9e6495c44c47182b6483e 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * readelf.c (get_note_type): Handle NT_RISCV_CSR.
+
 2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
            Andrew Burgess  <andrew.burgess@embecosm.com>
 
index fe58ebf6ac4130ff1a7ad4a868d3e6400f7a868f..1994eebd91065c83f6601c023ccacf8d177cca27 100644 (file)
@@ -18577,6 +18577,8 @@ get_note_type (Filedata * filedata, unsigned e_type)
        return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
       case NT_ARC_V2:
        return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
+      case NT_RISCV_CSR:
+       return _("NT_RISCV_CSR (RISC-V control and status registers)");
       case NT_PSTATUS:
        return _("NT_PSTATUS (pstatus structure)");
       case NT_FPREGS:
index 08c45673be65efeac406ce4c67684d4a1f08edc4..0a6e4b6f535277cd4cca0298814962a876130f60 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * elf/common.h (NT_RISCV_CSR): Define.
+
 2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
            Andrew Burgess  <andrew.burgess@embecosm.com>
 
index e6e9c278faa50276b908a23724040273608041b3..4cb3748e4fd6bb398987ac24525ef57ecd3f6858 100644 (file)
                                        /*   note name must be "LINUX".  */
 #define NT_ARC_V2      0x600           /* ARC HS accumulator/extra registers.  */
                                        /*   note name must be "LINUX".  */
+#define NT_RISCV_CSR    0x900          /* RISC-V Control and Status Registers */
+                                       /*   note name must be "CORE".  */
 #define NT_SIGINFO     0x53494749      /* Fields of siginfo_t.  */
 #define NT_FILE                0x46494c45      /* Description of mapped files.  */