linux/arch/sh/include/asm/elf.h
<<
>>
Prefs
   1#ifndef __ASM_SH_ELF_H
   2#define __ASM_SH_ELF_H
   3
   4#include <linux/utsname.h>
   5#include <asm/auxvec.h>
   6#include <asm/ptrace.h>
   7#include <asm/user.h>
   8
   9/* ELF header e_flags defines */
  10#define EF_SH_PIC               0x100   /* -fpic */
  11#define EF_SH_FDPIC             0x8000  /* -mfdpic */
  12
  13/* SH (particularly SHcompact) relocation types  */
  14#define R_SH_NONE               0
  15#define R_SH_DIR32              1
  16#define R_SH_REL32              2
  17#define R_SH_DIR8WPN            3
  18#define R_SH_IND12W             4
  19#define R_SH_DIR8WPL            5
  20#define R_SH_DIR8WPZ            6
  21#define R_SH_DIR8BP             7
  22#define R_SH_DIR8W              8
  23#define R_SH_DIR8L              9
  24#define R_SH_SWITCH16           25
  25#define R_SH_SWITCH32           26
  26#define R_SH_USES               27
  27#define R_SH_COUNT              28
  28#define R_SH_ALIGN              29
  29#define R_SH_CODE               30
  30#define R_SH_DATA               31
  31#define R_SH_LABEL              32
  32#define R_SH_SWITCH8            33
  33#define R_SH_GNU_VTINHERIT      34
  34#define R_SH_GNU_VTENTRY        35
  35#define R_SH_TLS_GD_32          144
  36#define R_SH_TLS_LD_32          145
  37#define R_SH_TLS_LDO_32         146
  38#define R_SH_TLS_IE_32          147
  39#define R_SH_TLS_LE_32          148
  40#define R_SH_TLS_DTPMOD32       149
  41#define R_SH_TLS_DTPOFF32       150
  42#define R_SH_TLS_TPOFF32        151
  43#define R_SH_GOT32              160
  44#define R_SH_PLT32              161
  45#define R_SH_COPY               162
  46#define R_SH_GLOB_DAT           163
  47#define R_SH_JMP_SLOT           164
  48#define R_SH_RELATIVE           165
  49#define R_SH_GOTOFF             166
  50#define R_SH_GOTPC              167
  51
  52/* FDPIC relocs */
  53#define R_SH_GOT20              201
  54#define R_SH_GOTOFF20           202
  55#define R_SH_GOTFUNCDESC        203
  56#define R_SH_GOTFUNCDESC20      204
  57#define R_SH_GOTOFFFUNCDESC     205
  58#define R_SH_GOTOFFFUNCDESC20   206
  59#define R_SH_FUNCDESC           207
  60#define R_SH_FUNCDESC_VALUE     208
  61
  62/* SHmedia relocs */
  63#define R_SH_IMM_LOW16          246
  64#define R_SH_IMM_LOW16_PCREL    247
  65#define R_SH_IMM_MEDLOW16       248
  66#define R_SH_IMM_MEDLOW16_PCREL 249
  67/* Keep this the last entry.  */
  68#define R_SH_NUM                256
  69
  70/*
  71 * ELF register definitions..
  72 */
  73
  74typedef unsigned long elf_greg_t;
  75
  76#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
  77typedef elf_greg_t elf_gregset_t[ELF_NGREG];
  78
  79typedef struct user_fpu_struct elf_fpregset_t;
  80
  81/*
  82 * These are used to set parameters in the core dumps.
  83 */
  84#define ELF_CLASS       ELFCLASS32
  85#ifdef __LITTLE_ENDIAN__
  86#define ELF_DATA        ELFDATA2LSB
  87#else
  88#define ELF_DATA        ELFDATA2MSB
  89#endif
  90#define ELF_ARCH        EM_SH
  91
  92#ifdef __KERNEL__
  93/*
  94 * This is used to ensure we don't load something for the wrong architecture.
  95 */
  96#define elf_check_arch(x)               ((x)->e_machine == EM_SH)
  97#define elf_check_fdpic(x)              ((x)->e_flags & EF_SH_FDPIC)
  98#define elf_check_const_displacement(x) ((x)->e_flags & EF_SH_PIC)
  99
 100/*
 101 * Enable dump using regset.
 102 * This covers all of general/DSP/FPU regs.
 103 */
 104#define CORE_DUMP_USE_REGSET
 105
 106#define ELF_FDPIC_CORE_EFLAGS   EF_SH_FDPIC
 107#define ELF_EXEC_PAGESIZE       PAGE_SIZE
 108
 109/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
 110   use of this is to invoke "./ld.so someprog" to test out a new version of
 111   the loader.  We need to make sure that it is out of the way of the program
 112   that it will "exec", and that there is sufficient room for the brk.  */
 113
 114#define ELF_ET_DYN_BASE         (2 * TASK_SIZE / 3)
 115
 116#define ELF_CORE_COPY_REGS(_dest,_regs)                         \
 117        memcpy((char *) &_dest, (char *) _regs,                 \
 118               sizeof(struct pt_regs));
 119
 120/* This yields a mask that user programs can use to figure out what
 121   instruction set this CPU supports.  This could be done in user space,
 122   but it's not easy, and we've already done it here.  */
 123
 124#define ELF_HWCAP       (boot_cpu_data.flags)
 125
 126/* This yields a string that ld.so will use to load implementation
 127   specific libraries for optimization.  This is more specific in
 128   intent than poking at uname or /proc/cpuinfo.
 129
 130   For the moment, we have only optimizations for the Intel generations,
 131   but that could change... */
 132
 133#define ELF_PLATFORM    (utsname()->machine)
 134
 135#ifdef __SH5__
 136#define ELF_PLAT_INIT(_r, load_addr) \
 137  do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
 138       _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
 139       _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
 140       _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; _r->regs[15]=0; \
 141       _r->regs[16]=0; _r->regs[17]=0; _r->regs[18]=0; _r->regs[19]=0; \
 142       _r->regs[20]=0; _r->regs[21]=0; _r->regs[22]=0; _r->regs[23]=0; \
 143       _r->regs[24]=0; _r->regs[25]=0; _r->regs[26]=0; _r->regs[27]=0; \
 144       _r->regs[28]=0; _r->regs[29]=0; _r->regs[30]=0; _r->regs[31]=0; \
 145       _r->regs[32]=0; _r->regs[33]=0; _r->regs[34]=0; _r->regs[35]=0; \
 146       _r->regs[36]=0; _r->regs[37]=0; _r->regs[38]=0; _r->regs[39]=0; \
 147       _r->regs[40]=0; _r->regs[41]=0; _r->regs[42]=0; _r->regs[43]=0; \
 148       _r->regs[44]=0; _r->regs[45]=0; _r->regs[46]=0; _r->regs[47]=0; \
 149       _r->regs[48]=0; _r->regs[49]=0; _r->regs[50]=0; _r->regs[51]=0; \
 150       _r->regs[52]=0; _r->regs[53]=0; _r->regs[54]=0; _r->regs[55]=0; \
 151       _r->regs[56]=0; _r->regs[57]=0; _r->regs[58]=0; _r->regs[59]=0; \
 152       _r->regs[60]=0; _r->regs[61]=0; _r->regs[62]=0; \
 153       _r->tregs[0]=0; _r->tregs[1]=0; _r->tregs[2]=0; _r->tregs[3]=0; \
 154       _r->tregs[4]=0; _r->tregs[5]=0; _r->tregs[6]=0; _r->tregs[7]=0; \
 155       _r->sr = SR_FD | SR_MMU; } while (0)
 156#else
 157#define ELF_PLAT_INIT(_r, load_addr) \
 158  do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
 159       _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
 160       _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
 161       _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
 162       _r->sr = SR_FD; } while (0)
 163
 164#define ELF_FDPIC_PLAT_INIT(_r, _exec_map_addr, _interp_map_addr,       \
 165                            _dynamic_addr)                              \
 166do {                                                                    \
 167        _r->regs[0]     = 0;                                            \
 168        _r->regs[1]     = 0;                                            \
 169        _r->regs[2]     = 0;                                            \
 170        _r->regs[3]     = 0;                                            \
 171        _r->regs[4]     = 0;                                            \
 172        _r->regs[5]     = 0;                                            \
 173        _r->regs[6]     = 0;                                            \
 174        _r->regs[7]     = 0;                                            \
 175        _r->regs[8]     = _exec_map_addr;                               \
 176        _r->regs[9]     = _interp_map_addr;                             \
 177        _r->regs[10]    = _dynamic_addr;                                \
 178        _r->regs[11]    = 0;                                            \
 179        _r->regs[12]    = 0;                                            \
 180        _r->regs[13]    = 0;                                            \
 181        _r->regs[14]    = 0;                                            \
 182        _r->sr          = SR_FD;                                        \
 183} while (0)
 184#endif
 185
 186#define SET_PERSONALITY(ex) \
 187        set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))
 188
 189#ifdef CONFIG_VSYSCALL
 190/* vDSO has arch_setup_additional_pages */
 191#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
 192struct linux_binprm;
 193extern int arch_setup_additional_pages(struct linux_binprm *bprm,
 194                                       int uses_interp);
 195
 196extern unsigned int vdso_enabled;
 197extern void __kernel_vsyscall;
 198
 199#define VDSO_BASE               ((unsigned long)current->mm->context.vdso)
 200#define VDSO_SYM(x)             (VDSO_BASE + (unsigned long)(x))
 201
 202#define VSYSCALL_AUX_ENT                                        \
 203        if (vdso_enabled)                                       \
 204                NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);        \
 205        else                                                    \
 206                NEW_AUX_ENT(AT_IGNORE, 0)
 207#else
 208#define VSYSCALL_AUX_ENT        NEW_AUX_ENT(AT_IGNORE, 0)
 209#endif /* CONFIG_VSYSCALL */
 210
 211#ifdef CONFIG_SH_FPU
 212#define FPU_AUX_ENT     NEW_AUX_ENT(AT_FPUCW, FPSCR_INIT)
 213#else
 214#define FPU_AUX_ENT     NEW_AUX_ENT(AT_IGNORE, 0)
 215#endif
 216
 217extern int l1i_cache_shape, l1d_cache_shape, l2_cache_shape;
 218
 219/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
 220#define ARCH_DLINFO                                             \
 221do {                                                            \
 222        /* Optional FPU initialization */                       \
 223        FPU_AUX_ENT;                                            \
 224                                                                \
 225        /* Optional vsyscall entry */                           \
 226        VSYSCALL_AUX_ENT;                                       \
 227                                                                \
 228        /* Cache desc */                                        \
 229        NEW_AUX_ENT(AT_L1I_CACHESHAPE, l1i_cache_shape);        \
 230        NEW_AUX_ENT(AT_L1D_CACHESHAPE, l1d_cache_shape);        \
 231        NEW_AUX_ENT(AT_L2_CACHESHAPE, l2_cache_shape);          \
 232} while (0)
 233
 234#endif /* __KERNEL__ */
 235#endif /* __ASM_SH_ELF_H */
 236