19c9b8b38SJeremy Fitzhardinge #ifndef _LINUX_ELFNOTE_H 29c9b8b38SJeremy Fitzhardinge #define _LINUX_ELFNOTE_H 39c9b8b38SJeremy Fitzhardinge /* 49c9b8b38SJeremy Fitzhardinge * Helper macros to generate ELF Note structures, which are put into a 59c9b8b38SJeremy Fitzhardinge * PT_NOTE segment of the final vmlinux image. These are useful for 69c9b8b38SJeremy Fitzhardinge * including name-value pairs of metadata into the kernel binary (or 79c9b8b38SJeremy Fitzhardinge * modules?) for use by external programs. 89c9b8b38SJeremy Fitzhardinge * 99c9b8b38SJeremy Fitzhardinge * Each note has three parts: a name, a type and a desc. The name is 109c9b8b38SJeremy Fitzhardinge * intended to distinguish the note's originator, so it would be a 119c9b8b38SJeremy Fitzhardinge * company, project, subsystem, etc; it must be in a suitable form for 129c9b8b38SJeremy Fitzhardinge * use in a section name. The type is an integer which is used to tag 139c9b8b38SJeremy Fitzhardinge * the data, and is considered to be within the "name" namespace (so 149c9b8b38SJeremy Fitzhardinge * "FooCo"'s type 42 is distinct from "BarProj"'s type 42). The 159c9b8b38SJeremy Fitzhardinge * "desc" field is the actual data. There are no constraints on the 169c9b8b38SJeremy Fitzhardinge * desc field's contents, though typically they're fairly small. 179c9b8b38SJeremy Fitzhardinge * 189c9b8b38SJeremy Fitzhardinge * All notes from a given NAME are put into a section named 199c9b8b38SJeremy Fitzhardinge * .note.NAME. When the kernel image is finally linked, all the notes 209c9b8b38SJeremy Fitzhardinge * are packed into a single .notes section, which is mapped into the 219c9b8b38SJeremy Fitzhardinge * PT_NOTE segment. Because notes for a given name are grouped into 229c9b8b38SJeremy Fitzhardinge * the same section, they'll all be adjacent the output file. 239c9b8b38SJeremy Fitzhardinge * 249c9b8b38SJeremy Fitzhardinge * This file defines macros for both C and assembler use. Their 259c9b8b38SJeremy Fitzhardinge * syntax is slightly different, but they're semantically similar. 269c9b8b38SJeremy Fitzhardinge * 279c9b8b38SJeremy Fitzhardinge * See the ELF specification for more detail about ELF notes. 289c9b8b38SJeremy Fitzhardinge */ 299c9b8b38SJeremy Fitzhardinge 309c9b8b38SJeremy Fitzhardinge #ifdef __ASSEMBLER__ 319c9b8b38SJeremy Fitzhardinge /* 329c9b8b38SJeremy Fitzhardinge * Generate a structure with the same shape as Elf{32,64}_Nhdr (which 339c9b8b38SJeremy Fitzhardinge * turn out to be the same size and shape), followed by the name and 345091e746SIan Campbell * desc data with appropriate padding. The 'desctype' argument is the 355091e746SIan Campbell * assembler pseudo op defining the type of the data e.g. .asciz while 365091e746SIan Campbell * 'descdata' is the data itself e.g. "hello, world". 375091e746SIan Campbell * 385091e746SIan Campbell * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two") 395091e746SIan Campbell * ELFNOTE(XYZCo, 12, .long, 0xdeadbeef) 409c9b8b38SJeremy Fitzhardinge */ 41810bab44SJeremy Fitzhardinge #define ELFNOTE_START(name, type, flags) \ 42810bab44SJeremy Fitzhardinge .pushsection .note.name, flags,@note ; \ 43810bab44SJeremy Fitzhardinge .balign 4 ; \ 445091e746SIan Campbell .long 2f - 1f /* namesz */ ; \ 45810bab44SJeremy Fitzhardinge .long 4484f - 3f /* descsz */ ; \ 465091e746SIan Campbell .long type ; \ 4703df4f6eSJeremy Fitzhardinge 1:.asciz #name ; \ 48810bab44SJeremy Fitzhardinge 2:.balign 4 ; \ 49810bab44SJeremy Fitzhardinge 3: 50810bab44SJeremy Fitzhardinge 51810bab44SJeremy Fitzhardinge #define ELFNOTE_END \ 52810bab44SJeremy Fitzhardinge 4484:.balign 4 ; \ 535091e746SIan Campbell .popsection ; 54810bab44SJeremy Fitzhardinge 55810bab44SJeremy Fitzhardinge #define ELFNOTE(name, type, desc) \ 56810bab44SJeremy Fitzhardinge ELFNOTE_START(name, type, "") \ 57810bab44SJeremy Fitzhardinge desc ; \ 58810bab44SJeremy Fitzhardinge ELFNOTE_END 59810bab44SJeremy Fitzhardinge 609c9b8b38SJeremy Fitzhardinge #else /* !__ASSEMBLER__ */ 619c9b8b38SJeremy Fitzhardinge #include <linux/elf.h> 629c9b8b38SJeremy Fitzhardinge /* 639c9b8b38SJeremy Fitzhardinge * Use an anonymous structure which matches the shape of 649c9b8b38SJeremy Fitzhardinge * Elf{32,64}_Nhdr, but includes the name and desc data. The size and 659c9b8b38SJeremy Fitzhardinge * type of name and desc depend on the macro arguments. "name" must 669c9b8b38SJeremy Fitzhardinge * be a literal string, and "desc" must be passed by value. You may 679c9b8b38SJeremy Fitzhardinge * only define one note per line, since __LINE__ is used to generate 689c9b8b38SJeremy Fitzhardinge * unique symbols. 699c9b8b38SJeremy Fitzhardinge */ 709c9b8b38SJeremy Fitzhardinge #define _ELFNOTE_PASTE(a,b) a##b 719c9b8b38SJeremy Fitzhardinge #define _ELFNOTE(size, name, unique, type, desc) \ 729c9b8b38SJeremy Fitzhardinge static const struct { \ 739c9b8b38SJeremy Fitzhardinge struct elf##size##_note _nhdr; \ 749c9b8b38SJeremy Fitzhardinge unsigned char _name[sizeof(name)] \ 759c9b8b38SJeremy Fitzhardinge __attribute__((aligned(sizeof(Elf##size##_Word)))); \ 769c9b8b38SJeremy Fitzhardinge typeof(desc) _desc \ 779c9b8b38SJeremy Fitzhardinge __attribute__((aligned(sizeof(Elf##size##_Word)))); \ 789c9b8b38SJeremy Fitzhardinge } _ELFNOTE_PASTE(_note_, unique) \ 79*3ff6eeccSAdrian Bunk __used \ 809c9b8b38SJeremy Fitzhardinge __attribute__((section(".note." name), \ 819c9b8b38SJeremy Fitzhardinge aligned(sizeof(Elf##size##_Word)), \ 829c9b8b38SJeremy Fitzhardinge unused)) = { \ 839c9b8b38SJeremy Fitzhardinge { \ 849c9b8b38SJeremy Fitzhardinge sizeof(name), \ 859c9b8b38SJeremy Fitzhardinge sizeof(desc), \ 869c9b8b38SJeremy Fitzhardinge type, \ 879c9b8b38SJeremy Fitzhardinge }, \ 889c9b8b38SJeremy Fitzhardinge name, \ 899c9b8b38SJeremy Fitzhardinge desc \ 909c9b8b38SJeremy Fitzhardinge } 919c9b8b38SJeremy Fitzhardinge #define ELFNOTE(size, name, type, desc) \ 929c9b8b38SJeremy Fitzhardinge _ELFNOTE(size, name, __LINE__, type, desc) 939c9b8b38SJeremy Fitzhardinge 949c9b8b38SJeremy Fitzhardinge #define ELFNOTE32(name, type, desc) ELFNOTE(32, name, type, desc) 959c9b8b38SJeremy Fitzhardinge #define ELFNOTE64(name, type, desc) ELFNOTE(64, name, type, desc) 969c9b8b38SJeremy Fitzhardinge #endif /* __ASSEMBLER__ */ 979c9b8b38SJeremy Fitzhardinge 989c9b8b38SJeremy Fitzhardinge #endif /* _LINUX_ELFNOTE_H */ 99