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