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