diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2024-05-20 12:12:10 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2024-05-20 12:12:10 +0100 |
commit | f65d4a2f81060e58d86616e8773fb0af38cab33b (patch) | |
tree | 35ff150ec391a492f8837fc7626499fea59e2099 /binutils | |
parent | 3ce12d6d4adb0e3dbdf90628a3e0d37a6ea21512 (diff) | |
download | gdb-f65d4a2f81060e58d86616e8773fb0af38cab33b.zip gdb-f65d4a2f81060e58d86616e8773fb0af38cab33b.tar.gz gdb-f65d4a2f81060e58d86616e8773fb0af38cab33b.tar.bz2 |
Let avr-objdump show .note.gnu.avr.deviceinfo
PR 31704
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/od-elf32_avr.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/binutils/od-elf32_avr.c b/binutils/od-elf32_avr.c index d32bd4f..4e6b6fa 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\ ")); } @@ -347,6 +350,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) { @@ -354,6 +406,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 = |