Annotation of Gnu-Mach/xen/public/libelf.h, revision 1.1

1.1     ! root        1: /******************************************************************************
        !             2:  * libelf.h
        !             3:  * 
        !             4:  * Permission is hereby granted, free of charge, to any person obtaining a copy
        !             5:  * of this software and associated documentation files (the "Software"), to
        !             6:  * deal in the Software without restriction, including without limitation the
        !             7:  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
        !             8:  * sell copies of the Software, and to permit persons to whom the Software is
        !             9:  * furnished to do so, subject to the following conditions:
        !            10:  *
        !            11:  * The above copyright notice and this permission notice shall be included in
        !            12:  * all copies or substantial portions of the Software.
        !            13:  *
        !            14:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            15:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        !            17:  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            18:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
        !            19:  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
        !            20:  * DEALINGS IN THE SOFTWARE.
        !            21:  */
        !            22: 
        !            23: #ifndef __XC_LIBELF__
        !            24: #define __XC_LIBELF__ 1
        !            25: 
        !            26: #if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
        !            27: #define XEN_ELF_LITTLE_ENDIAN
        !            28: #else
        !            29: #error define architectural endianness
        !            30: #endif
        !            31: 
        !            32: #undef ELFSIZE
        !            33: #include "elfnote.h"
        !            34: #include "elfstructs.h"
        !            35: #include "features.h"
        !            36: 
        !            37: /* ------------------------------------------------------------------------ */
        !            38: 
        !            39: typedef union {
        !            40:     Elf32_Ehdr e32;
        !            41:     Elf64_Ehdr e64;
        !            42: } elf_ehdr;
        !            43: 
        !            44: typedef union {
        !            45:     Elf32_Phdr e32;
        !            46:     Elf64_Phdr e64;
        !            47: } elf_phdr;
        !            48: 
        !            49: typedef union {
        !            50:     Elf32_Shdr e32;
        !            51:     Elf64_Shdr e64;
        !            52: } elf_shdr;
        !            53: 
        !            54: typedef union {
        !            55:     Elf32_Sym e32;
        !            56:     Elf64_Sym e64;
        !            57: } elf_sym;
        !            58: 
        !            59: typedef union {
        !            60:     Elf32_Rel e32;
        !            61:     Elf64_Rel e64;
        !            62: } elf_rel;
        !            63: 
        !            64: typedef union {
        !            65:     Elf32_Rela e32;
        !            66:     Elf64_Rela e64;
        !            67: } elf_rela;
        !            68: 
        !            69: typedef union {
        !            70:     Elf32_Note e32;
        !            71:     Elf64_Note e64;
        !            72: } elf_note;
        !            73: 
        !            74: struct elf_binary {
        !            75:     /* elf binary */
        !            76:     const char *image;
        !            77:     size_t size;
        !            78:     char class;
        !            79:     char data;
        !            80: 
        !            81:     const elf_ehdr *ehdr;
        !            82:     const char *sec_strtab;
        !            83:     const elf_shdr *sym_tab;
        !            84:     const char *sym_strtab;
        !            85: 
        !            86:     /* loaded to */
        !            87:     char *dest;
        !            88:     uint64_t pstart;
        !            89:     uint64_t pend;
        !            90:     uint64_t reloc_offset;
        !            91: 
        !            92:     uint64_t bsd_symtab_pstart;
        !            93:     uint64_t bsd_symtab_pend;
        !            94: 
        !            95: #ifndef __XEN__
        !            96:     /* misc */
        !            97:     FILE *log;
        !            98: #endif
        !            99:     int verbose;
        !           100: };
        !           101: 
        !           102: /* ------------------------------------------------------------------------ */
        !           103: /* accessing elf header fields                                              */
        !           104: 
        !           105: #ifdef XEN_ELF_BIG_ENDIAN
        !           106: # define NATIVE_ELFDATA ELFDATA2MSB
        !           107: #else
        !           108: # define NATIVE_ELFDATA ELFDATA2LSB
        !           109: #endif
        !           110: 
        !           111: #define elf_32bit(elf) (ELFCLASS32 == (elf)->class)
        !           112: #define elf_64bit(elf) (ELFCLASS64 == (elf)->class)
        !           113: #define elf_msb(elf)   (ELFDATA2MSB == (elf)->data)
        !           114: #define elf_lsb(elf)   (ELFDATA2LSB == (elf)->data)
        !           115: #define elf_swap(elf)  (NATIVE_ELFDATA != (elf)->data)
        !           116: 
        !           117: #define elf_uval(elf, str, elem)                                        \
        !           118:     ((ELFCLASS64 == (elf)->class)                                       \
        !           119:      ? elf_access_unsigned((elf), (str),                                \
        !           120:                            offsetof(typeof(*(str)),e64.elem),           \
        !           121:                            sizeof((str)->e64.elem))                     \
        !           122:      : elf_access_unsigned((elf), (str),                                \
        !           123:                            offsetof(typeof(*(str)),e32.elem),           \
        !           124:                            sizeof((str)->e32.elem)))
        !           125: 
        !           126: #define elf_sval(elf, str, elem)                                        \
        !           127:     ((ELFCLASS64 == (elf)->class)                                       \
        !           128:      ? elf_access_signed((elf), (str),                                  \
        !           129:                          offsetof(typeof(*(str)),e64.elem),             \
        !           130:                          sizeof((str)->e64.elem))                       \
        !           131:      : elf_access_signed((elf), (str),                                  \
        !           132:                          offsetof(typeof(*(str)),e32.elem),             \
        !           133:                          sizeof((str)->e32.elem)))
        !           134: 
        !           135: #define elf_size(elf, str)                              \
        !           136:     ((ELFCLASS64 == (elf)->class)                       \
        !           137:      ? sizeof((str)->e64) : sizeof((str)->e32))
        !           138: 
        !           139: uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr,
        !           140:                              uint64_t offset, size_t size);
        !           141: int64_t elf_access_signed(struct elf_binary *elf, const void *ptr,
        !           142:                           uint64_t offset, size_t size);
        !           143: 
        !           144: uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr);
        !           145: 
        !           146: /* ------------------------------------------------------------------------ */
        !           147: /* xc_libelf_tools.c                                                        */
        !           148: 
        !           149: int elf_shdr_count(struct elf_binary *elf);
        !           150: int elf_phdr_count(struct elf_binary *elf);
        !           151: 
        !           152: const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name);
        !           153: const elf_shdr *elf_shdr_by_index(struct elf_binary *elf, int index);
        !           154: const elf_phdr *elf_phdr_by_index(struct elf_binary *elf, int index);
        !           155: 
        !           156: const char *elf_section_name(struct elf_binary *elf, const elf_shdr * shdr);
        !           157: const void *elf_section_start(struct elf_binary *elf, const elf_shdr * shdr);
        !           158: const void *elf_section_end(struct elf_binary *elf, const elf_shdr * shdr);
        !           159: 
        !           160: const void *elf_segment_start(struct elf_binary *elf, const elf_phdr * phdr);
        !           161: const void *elf_segment_end(struct elf_binary *elf, const elf_phdr * phdr);
        !           162: 
        !           163: const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol);
        !           164: const elf_sym *elf_sym_by_index(struct elf_binary *elf, int index);
        !           165: 
        !           166: const char *elf_note_name(struct elf_binary *elf, const elf_note * note);
        !           167: const void *elf_note_desc(struct elf_binary *elf, const elf_note * note);
        !           168: uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note);
        !           169: const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note);
        !           170: 
        !           171: int elf_is_elfbinary(const void *image);
        !           172: int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr);
        !           173: 
        !           174: /* ------------------------------------------------------------------------ */
        !           175: /* xc_libelf_loader.c                                                       */
        !           176: 
        !           177: int elf_init(struct elf_binary *elf, const char *image, size_t size);
        !           178: #ifdef __XEN__
        !           179: void elf_set_verbose(struct elf_binary *elf);
        !           180: #else
        !           181: void elf_set_logfile(struct elf_binary *elf, FILE * log, int verbose);
        !           182: #endif
        !           183: 
        !           184: void elf_parse_binary(struct elf_binary *elf);
        !           185: void elf_load_binary(struct elf_binary *elf);
        !           186: 
        !           187: void *elf_get_ptr(struct elf_binary *elf, unsigned long addr);
        !           188: uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol);
        !           189: 
        !           190: void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */
        !           191: 
        !           192: /* ------------------------------------------------------------------------ */
        !           193: /* xc_libelf_relocate.c                                                     */
        !           194: 
        !           195: int elf_reloc(struct elf_binary *elf);
        !           196: 
        !           197: /* ------------------------------------------------------------------------ */
        !           198: /* xc_libelf_dominfo.c                                                      */
        !           199: 
        !           200: #define UNSET_ADDR          ((uint64_t)-1)
        !           201: 
        !           202: enum xen_elfnote_type {
        !           203:     XEN_ENT_NONE = 0,
        !           204:     XEN_ENT_LONG = 1,
        !           205:     XEN_ENT_STR  = 2
        !           206: };
        !           207: 
        !           208: struct xen_elfnote {
        !           209:     enum xen_elfnote_type type;
        !           210:     const char *name;
        !           211:     union {
        !           212:         const char *str;
        !           213:         uint64_t num;
        !           214:     } data;
        !           215: };
        !           216: 
        !           217: struct elf_dom_parms {
        !           218:     /* raw */
        !           219:     const char *guest_info;
        !           220:     const void *elf_note_start;
        !           221:     const void *elf_note_end;
        !           222:     struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1];
        !           223:   
        !           224:     /* parsed */
        !           225:     char guest_os[16];
        !           226:     char guest_ver[16];
        !           227:     char xen_ver[16];
        !           228:     char loader[16];
        !           229:     int pae;
        !           230:     int bsd_symtab;
        !           231:     uint64_t virt_base;
        !           232:     uint64_t virt_entry;
        !           233:     uint64_t virt_hypercall;
        !           234:     uint64_t virt_hv_start_low;
        !           235:     uint64_t elf_paddr_offset;
        !           236:     uint32_t f_supported[XENFEAT_NR_SUBMAPS];
        !           237:     uint32_t f_required[XENFEAT_NR_SUBMAPS];
        !           238: 
        !           239:     /* calculated */
        !           240:     uint64_t virt_offset;
        !           241:     uint64_t virt_kstart;
        !           242:     uint64_t virt_kend;
        !           243: };
        !           244: 
        !           245: static inline void elf_xen_feature_set(int nr, uint32_t * addr)
        !           246: {
        !           247:     addr[nr >> 5] |= 1 << (nr & 31);
        !           248: }
        !           249: static inline int elf_xen_feature_get(int nr, uint32_t * addr)
        !           250: {
        !           251:     return !!(addr[nr >> 5] & (1 << (nr & 31)));
        !           252: }
        !           253: 
        !           254: int elf_xen_parse_features(const char *features,
        !           255:                            uint32_t *supported,
        !           256:                            uint32_t *required);
        !           257: int elf_xen_parse_note(struct elf_binary *elf,
        !           258:                        struct elf_dom_parms *parms,
        !           259:                        const elf_note *note);
        !           260: int elf_xen_parse_guest_info(struct elf_binary *elf,
        !           261:                              struct elf_dom_parms *parms);
        !           262: int elf_xen_parse(struct elf_binary *elf,
        !           263:                   struct elf_dom_parms *parms);
        !           264: 
        !           265: #endif /* __XC_LIBELF__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.