The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xen/interface/libelf.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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__ */

Cache object: ac26c38cce49ca8ae7b22744b9e33cf7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.