avr-libc-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-libc-dev] [Patch] Include a device info note section in gcrt1.S


From: Senthil Kumar Selvaraj
Subject: Re: [avr-libc-dev] [Patch] Include a device info note section in gcrt1.S
Date: Fri, 21 Nov 2014 11:05:01 +0530
User-agent: Mutt/1.5.23 (2014-03-12)

On Mon, Nov 10, 2014 at 10:50:12AM +0530, Senthil Kumar Selvaraj wrote:
> Ping!
> 
> Regards
> Senthil
> On Mon, Nov 03, 2014 at 04:50:32PM +0530, Senthil Kumar Selvaraj wrote:
> > On Tue, Oct 14, 2014 at 04:29:19PM +0530, Senthil Kumar Selvaraj wrote:
> > > On Sat, Oct 11, 2014 at 10:35:22AM +0200, Joerg Wunsch wrote:
> > > > I finally had a chance to test all this.
> > > > 
> > > > For reference, here's the result for an ATmega1281:
> > > > 
> > > > % avr-objdump -h -j .note.gnu.avr.deviceinfo -s 
> > > > avr/lib/avr5/atmega1281/crtm1281.o
> > > > 
> > > > avr/lib/avr5/atmega1281/crtm1281.o:     file format elf32-avr
> > > > 
> > > > Sections:
> > > > Idx Name          Size      VMA       LMA       File off  Algn
> > > >  11 .note.gnu.avr.deviceinfo 00000034  00000000  00000000  0000181c  
> > > > 2**2
> > > >                   CONTENTS, READONLY
> > > > Contents of section .note.gnu.avr.deviceinfo:
> > > >  0000 04000000 23000000 01000000 41565200  ....#.......AVR.
> > > >  0010 00000000 00000200 00020000 00200000  ............. ..
> > > >  0020 00000000 00100000 08000000 01000000  ................
> > > >  0030 00000000                             ....            
> > > > 
> > > > 
> > > > As Senthil Kumar Selvaraj wrote:
> > > > 
> > > > > How does the below patch look? Once you guys find it ok, I'll follow 
> > > > > it
> > > > > up with a documentation patch. Note that the part above the
> > > > > L__desc_start label (and the .balign directive at the end) are there 
> > > > > as
> > > > > per the ELF spec for a note section.
> > > > 
> > > > OK, if that's required, we have to stick with that.
> > > > 
> > > > Wouldn't the note name string also possibly need padding
> > > > for alignment behind it?  (In the case of the "AVR\0",
> > > > it only incidentally aligns the following .long values
> > > > to a long boundary.)
> > > 
> > > Yes, I figured it's only going to be "AVR\0", so I skipped the align
> > > directive. I'll add it.
> > > > 
> > > > For the documentation, please include a C struct definition
> > > > as explanation:
> > > > 
> > > > #define __NOTE_NAME_LEN 4
> > > > struct __note_gnu_avr_deviceinfo
> > > > {
> > > >     struct
> > > >     {
> > > >         uint32_t note_name_len;          /* = __NOTE_NAME_LEN */
> > > >         uint32_t desc_len;
> > > >         char note_name[__NOTE_NAME_LEN]; /* = "AVR\0" */
> > > >     }
> > > >     elfinfo_hdr;
> > > >     struct
> > > >     {
> > > >         uint32_t flash_start;
> > > >         uint32_t flash_size;
> > > >         uint32_t sram_start;
> > > >         uint32_t sram_size;
> > > >         uint32_t eeprom_start;
> > > >         uint32_t eeprom_size;
> > > >         uint32_t offset_table[2];  /* index 0: ... */
> > > >         // ???
> > > >     }
> > > >     avr_desc;
> > > > };
> > > 
> > > Ok, will do.
> > > > 
> > > > > +.L__stroffsettab_end:
> > > > > +    /* String table for storing arbitrary strings.
> > > > > +    Offsets are stored in the string offset table above */
> > > > > +.L__strtab_start:
> > > > > +    .byte 0
> > > > > +.L__device_name_start:
> > > > > +    .asciz DEVICE_NAME
> > > > > +.L__device_name_end:
> > > > > +    .byte 0
> > > > > +.L__strtab_end:
> > > > 
> > > > I don't quite understand the purpose of the two ".byte 0" definitions.
> > > 
> > > I used the standard ELF string table convention - the first and last
> > > bytes are null. From http://man7.org/linux/man-pages/man5/elf.5.html,
> > > 
> > > "String table sections hold null-terminated character sequences,
> > > commonly called strings.  The object file uses these strings to
> > > represent symbol and section names.  One references a string as an
> > > index into the string table section.  The first byte, which is index
> > > zero, is defined to hold a null byte ('\0').  Similarly, a string
> > > table's last byte is defined to hold a null byte, ensuring null
> > > termination for all strings."
> > > 
> > > There's no need to follow that convention though - the descriptor's
> > > layout/interpretation can be arbitrary. If you think it is redundant,
> > > I'll drop it.
> > > 
> > > I'll send a new patch with all the changes.
> > > 
> > 
> > Does the below patch look good? I've added documentation about the
> > section's layout to doc/api/sections.dox.
> > 
> > Regards
> > Senthil
> > 
> > ChangeLog
> > 
> > 2014-11-03  Senthil Kumar Selvaraj <address@hidden>
> > 
> >     * crt1/gcrt1.S: Add a note section embedding device info.
> >     * doc/api/sections.dox: Document it.
> > 
> > diff --git avr-libc/crt1/gcrt1.S avr-libc/crt1/gcrt1.S
> > index 2d341a4..777bedb 100644
> > --- avr-libc/crt1/gcrt1.S
> > +++ avr-libc/crt1/gcrt1.S
> > @@ -304,3 +304,71 @@ __do_copy_data:
> >  #endif     /* __AVR_ASM_ONLY__ */
> >  ;  .endfunc
> >  
> > +    .section .note.gnu.avr.deviceinfo, "", @note
> > +#define NOTE_NAME "AVR"
> > +#ifdef __AVR_DEVICE_NAME__
> > +    #define DEVICE_NAME STR(__AVR_DEVICE_NAME__)
> > +#else
> > +    #define DEVICE_NAME ""
> > +#endif
> > +
> > +    .long .L__note_name_end - .L__note_name_start
> > +    .long .L__desc_end - .L__desc_start
> > +    .long 1 ; Type 1 - this is the only known note type for AVR.
> > +.L__note_name_start:
> > +    .asciz NOTE_NAME
> > +    .balign 4
> > +.L__note_name_end:
> > +.L__desc_start:
> > +#ifdef FLASHSTART
> > +    .long FLASHSTART
> > +#else
> > +    .long 0
> > +#endif
> > +#ifdef PROGMEM_SIZE
> > +    .long PROGMEM_SIZE
> > +#elif FLASHEND > 0
> > +    .long FLASHEND + 1
> > +#else
> > +    .long FLASHEND
> > +#endif
> > +    .long RAMSTART
> > +#ifdef RAMSIZE
> > +    .long RAMSIZE
> > +#elif RAMEND > 0
> > +    .long RAMEND - RAMSTART + 1
> > +#else
> > +    .long RAMEND
> > +#endif
> > +#ifdef E2START
> > +    .long E2START
> > +#else
> > +    .long 0
> > +#endif
> > +#ifdef EEPROM_SIZE
> > +    .long EEPROM_SIZE
> > +#elif E2END > 0
> > +    .long E2END + 1
> > +#else
> > +    .long E2END
> > +#endif
> > +    /* String offsets table.
> > +    Index 0 - Size of offset table in bytes
> > +    Index 1 - Device name byte offset
> > +    */
> > +.L__stroffsettab_start:
> > +.long .L__stroffsettab_end - .L__stroffsettab_start /* Size of index table 
> > in bytes */
> > +.long .L__device_name_start - .L__strtab_start /* Byte offset of device 
> > name */
> > +.L__stroffsettab_end:
> > +    /* String table for storing arbitrary strings.
> > +    Offsets are stored in the string offset table above */
> > +.L__strtab_start:
> > +    .byte 0
> > +.L__device_name_start:
> > +    .asciz DEVICE_NAME
> > +.L__device_name_end:
> > +    .byte 0
> > +.L__strtab_end:
> > +.L__desc_end:
> > +    .balign 4
> > +
> > diff --git avr-libc/doc/api/sections.dox avr-libc/doc/api/sections.dox
> > index a93dec4..a71f13b 100644
> > --- avr-libc/doc/api/sections.dox
> > +++ avr-libc/doc/api/sections.dox
> > @@ -207,6 +207,51 @@ Unused. User definable.
> >  Goes into an infinite loop after program termination and completion of any
> >  _exit() code (execution of code in the .fini9 -> .fini1 sections).
> >  
> > +\section sec_dot_note The .note.gnu.avr.deviceinfo Section
> > +
> > +This section contains device specific information picked up from the device
> > +header file and compiler builtin macros. The layout conforms to the 
> > standard ELF
> > +note section layout 
> > (http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-18048.html).
> > +
> > +The section contents are laid out as below.
> > +
> > +\code
> > +#define __NOTE_NAME_LEN 4
> > +struct __note_gnu_avr_deviceinfo
> > +{
> > +    struct
> > +    {
> > +        uint32_t namesz;          /* = __NOTE_NAME_LEN */
> > +        uint32_t descsz;          /* =  size of avr_desc */
> > +        uint32_t type;            /* = 1 - no other AVR note types exist */
> > +        char note_name[__NOTE_NAME_LEN]; /* = "AVR\0" */
> > +    }
> > +    note_header;
> > +    struct
> > +    {
> > +        uint32_t flash_start;
> > +        uint32_t flash_size;
> > +        uint32_t sram_start;
> > +        uint32_t sram_size;
> > +        uint32_t eeprom_start;
> > +        uint32_t eeprom_size;
> > +        uint32_t offset_table_size;
> > +        uint32_t offset_table[1];  /* Offset table containing byte offsets 
> > into
> > +                                      string table that immediately 
> > follows it.
> > +                                      index 0: Device name byte offset
> > +                                    */
> > +        char str_table [2 +
> > +          strlen(__AVR_DEVICE_NAME__)]; /* Standard ELF string table.
> > +                                           index 0 : NULL
> > +                                           index 1 : Device name
> > +                                           index 2 : NULL
> > +                                        */
> > +    }
> > +    avr_desc;
> > +};
> > +\endcode
> > +
> > +
> >  \section asm_sections Using Sections in Assembler Code
> >  
> >  Example:
> > 
> > _______________________________________________
> > AVR-libc-dev mailing list
> > address@hidden
> > https://lists.nongnu.org/mailman/listinfo/avr-libc-dev
> 

Committed as rev #2459.

Regards
Senthil



reply via email to

[Prev in Thread] Current Thread [Next in Thread]