[avr] PR31704: Let avr-objdump show .note.gnu.avr.deviceinfo

Message ID a14a1fef-921a-49ee-bb7d-1c97741dc06c@gjlay.de
State New
Headers
Series [avr] PR31704: Let avr-objdump show .note.gnu.avr.deviceinfo |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Testing passed

Commit Message

Georg-Johann Lay May 6, 2024, 12:24 p.m. UTC
  AVR: binutils/31704 - Let avr-objdump show .note.gnu.avr.deviceinfo

This patch supports

      avr-objdump -P avr-deviceinfo

which displays the contents of the .note.gnu.avr.deviceinfo section,
which is added by the startup code from AVR-LibC in crt<mcu>.o.

binutils/
	PR binutils/31704
	* od-elf32_avr.c (OPT_AVRDEVICEINFO): New macro.
	(objdump_private_option options): Set [2] to "avr-deviceinfo".
	(elf32_avr_help): Help on new -P avr-deviceinfo.
	(elf32_avr_dump) [OPT_AVRDEVICEINFO]: Run...
	(elf32_avr_dump_avr_deviceinfo): ...this new static function.
  

Comments

Georg-Johann Lay May 16, 2024, 3:45 p.m. UTC | #1
Ping #1 for

https://sourceware.org/pipermail/binutils/2024-May/133978.html

Johann

Am 06.05.24 um 14:24 schrieb Georg-Johann Lay:
> AVR: binutils/31704 - Let avr-objdump show .note.gnu.avr.deviceinfo
> 
> This patch supports
> 
>       avr-objdump -P avr-deviceinfo
> 
> which displays the contents of the .note.gnu.avr.deviceinfo section,
> which is added by the startup code from AVR-LibC in crt<mcu>.o.
> 
> binutils/
>      PR binutils/31704
>      * od-elf32_avr.c (OPT_AVRDEVICEINFO): New macro.
>      (objdump_private_option options): Set [2] to "avr-deviceinfo".
>      (elf32_avr_help): Help on new -P avr-deviceinfo.
>      (elf32_avr_dump) [OPT_AVRDEVICEINFO]: Run...
>      (elf32_avr_dump_avr_deviceinfo): ...this new static function.
  

Patch

diff --git a/binutils/od-elf32_avr.c b/binutils/od-elf32_avr.c
index 1e7a8b49935..c495fc973fe 100644
--- a/binutils/od-elf32_avr.c
+++ b/binutils/od-elf32_avr.c
@@ -36,12 +36,14 @@ 
 /* Index of the options in the options[] array.  */
 #define OPT_MEMUSAGE 0
 #define OPT_AVRPROP 1
+#define OPT_AVRDEVICEINFO 2
 
 /* List of actions.  */
 static struct objdump_private_option options[] =
   {
     { "mem-usage", 0 },
     { "avr-prop",  0},
+    { "avr-deviceinfo",  0},
     { NULL, 0 }
   };
 
@@ -52,8 +54,9 @@  elf32_avr_help (FILE *stream)
 {
   fprintf (stream, _("\
 For AVR ELF files:\n\
-  mem-usage   Display memory usage\n\
-  avr-prop    Display contents of .avr.prop section\n\
+  mem-usage       Display memory usage\n\
+  avr-prop        Display contents of .avr.prop section\n\
+  avr-deviceinfo  Display contents of .note.gnu.avr.deviceinfo section\n\
 "));
 }
 
@@ -323,6 +326,55 @@  elf32_avr_dump_avr_prop (bfd *abfd)
   free (r_list);
 }
 
+
+static void
+elf32_avr_dump_avr_deviceinfo (bfd *abfd)
+{
+  char *description = NULL;
+  bfd_size_type sec_size, desc_size;
+
+  deviceinfo dinfo = { 0, 0, 0, 0, 0, 0, NULL };
+  dinfo.name = "Unknown";
+
+  char *contents = elf32_avr_get_note_section_contents (abfd, &sec_size);
+
+  if (contents == NULL)
+    return;
+
+  description = elf32_avr_get_note_desc (abfd, contents, sec_size, &desc_size);
+  elf32_avr_get_device_info (abfd, description, desc_size, &dinfo);
+
+  printf ("AVR Device Info\n"
+	  "----------------\n"
+	  "Device: %s\n\n", dinfo.name);
+
+  printf ("Memory     Start      Size      Start      Size\n");
+
+  printf ("Flash  %9" PRIu32 " %9" PRIu32 "  %#9" PRIx32 " %#9" PRIx32 "\n",
+	  dinfo.flash_start, dinfo.flash_size,
+	  dinfo.flash_start, dinfo.flash_size);
+
+  /* FIXME: There are devices like ATtiny11 without RAM, and where the
+     avr/io*.h header has defines like
+	 #define RAMSTART    0x60
+	 // Last memory addresses
+	 #define RAMEND	     0x1F
+     which results in a negative RAM size.  The correct display would be to
+     show a size of 0, however we also want to show what's actually in the
+     note section as precise as possible.  Hence, display the decimal size
+     as %d, not as %u.	*/
+  printf ("RAM    %9" PRIu32 " %9" PRId32 "  %#9" PRIx32 " %#9" PRIx32 "\n",
+	  dinfo.ram_start, dinfo.ram_size,
+	  dinfo.ram_start, dinfo.ram_size);
+
+  printf ("EEPROM %9" PRIu32 " %9" PRIu32 "  %#9" PRIx32 " %#9" PRIx32 "\n",
+	  dinfo.eeprom_start, dinfo.eeprom_size,
+	  dinfo.eeprom_start, dinfo.eeprom_size);
+
+  free (contents);
+}
+
+
 static void
 elf32_avr_dump (bfd *abfd)
 {
@@ -330,6 +382,8 @@  elf32_avr_dump (bfd *abfd)
     elf32_avr_dump_mem_usage (abfd);
   if (options[OPT_AVRPROP].selected)
     elf32_avr_dump_avr_prop (abfd);
+  if (options[OPT_AVRDEVICEINFO].selected)
+    elf32_avr_dump_avr_deviceinfo (abfd);
 }
 
 const struct objdump_private_desc objdump_private_desc_elf32_avr =