0001
0002 #ifndef _ASM_X86_ELF_H
0003 #define _ASM_X86_ELF_H
0004
0005
0006
0007
0008 #include <linux/thread_info.h>
0009
0010 #include <asm/ptrace.h>
0011 #include <asm/user.h>
0012 #include <asm/auxvec.h>
0013 #include <asm/fsgsbase.h>
0014
0015 typedef unsigned long elf_greg_t;
0016
0017 #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
0018 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
0019
0020 typedef struct user_i387_struct elf_fpregset_t;
0021
0022 #ifdef __i386__
0023
0024 #define R_386_NONE 0
0025 #define R_386_32 1
0026 #define R_386_PC32 2
0027 #define R_386_GOT32 3
0028 #define R_386_PLT32 4
0029 #define R_386_COPY 5
0030 #define R_386_GLOB_DAT 6
0031 #define R_386_JMP_SLOT 7
0032 #define R_386_RELATIVE 8
0033 #define R_386_GOTOFF 9
0034 #define R_386_GOTPC 10
0035 #define R_386_NUM 11
0036
0037
0038
0039
0040 #define ELF_CLASS ELFCLASS32
0041 #define ELF_DATA ELFDATA2LSB
0042 #define ELF_ARCH EM_386
0043
0044 #else
0045
0046
0047 #define R_X86_64_NONE 0
0048 #define R_X86_64_64 1
0049 #define R_X86_64_PC32 2
0050 #define R_X86_64_GOT32 3
0051 #define R_X86_64_PLT32 4
0052 #define R_X86_64_COPY 5
0053 #define R_X86_64_GLOB_DAT 6
0054 #define R_X86_64_JUMP_SLOT 7
0055 #define R_X86_64_RELATIVE 8
0056 #define R_X86_64_GOTPCREL 9
0057
0058 #define R_X86_64_32 10
0059 #define R_X86_64_32S 11
0060 #define R_X86_64_16 12
0061 #define R_X86_64_PC16 13
0062 #define R_X86_64_8 14
0063 #define R_X86_64_PC8 15
0064 #define R_X86_64_PC64 24
0065
0066
0067
0068
0069 #define ELF_CLASS ELFCLASS64
0070 #define ELF_DATA ELFDATA2LSB
0071 #define ELF_ARCH EM_X86_64
0072
0073 #endif
0074
0075 #include <asm/vdso.h>
0076
0077 #ifdef CONFIG_X86_64
0078 extern unsigned int vdso64_enabled;
0079 #endif
0080 #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
0081 extern unsigned int vdso32_enabled;
0082 #endif
0083
0084
0085
0086
0087 #define elf_check_arch_ia32(x) \
0088 (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
0089
0090 #include <asm/processor.h>
0091
0092 #ifdef CONFIG_X86_32
0093 #include <asm/desc.h>
0094
0095 #define elf_check_arch(x) elf_check_arch_ia32(x)
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 #define ELF_PLAT_INIT(_r, load_addr) \
0108 do { \
0109 _r->bx = 0; _r->cx = 0; _r->dx = 0; \
0110 _r->si = 0; _r->di = 0; _r->bp = 0; \
0111 _r->ax = 0; \
0112 } while (0)
0113
0114
0115
0116
0117
0118
0119 #define ELF_CORE_COPY_REGS(pr_reg, regs) \
0120 do { \
0121 pr_reg[0] = regs->bx; \
0122 pr_reg[1] = regs->cx; \
0123 pr_reg[2] = regs->dx; \
0124 pr_reg[3] = regs->si; \
0125 pr_reg[4] = regs->di; \
0126 pr_reg[5] = regs->bp; \
0127 pr_reg[6] = regs->ax; \
0128 pr_reg[7] = regs->ds; \
0129 pr_reg[8] = regs->es; \
0130 pr_reg[9] = regs->fs; \
0131 savesegment(gs, pr_reg[10]); \
0132 pr_reg[11] = regs->orig_ax; \
0133 pr_reg[12] = regs->ip; \
0134 pr_reg[13] = regs->cs; \
0135 pr_reg[14] = regs->flags; \
0136 pr_reg[15] = regs->sp; \
0137 pr_reg[16] = regs->ss; \
0138 } while (0);
0139
0140 #define ELF_PLATFORM (utsname()->machine)
0141 #define set_personality_64bit() do { } while (0)
0142
0143 #else
0144
0145
0146
0147
0148 #define elf_check_arch(x) \
0149 ((x)->e_machine == EM_X86_64)
0150
0151 #define compat_elf_check_arch(x) \
0152 (elf_check_arch_ia32(x) || \
0153 (IS_ENABLED(CONFIG_X86_X32_ABI) && (x)->e_machine == EM_X86_64))
0154
0155 #if __USER32_DS != __USER_DS
0156 # error "The following code assumes __USER32_DS == __USER_DS"
0157 #endif
0158
0159 static inline void elf_common_init(struct thread_struct *t,
0160 struct pt_regs *regs, const u16 ds)
0161 {
0162
0163 regs->bx = regs->cx = regs->dx = 0;
0164 regs->si = regs->di = regs->bp = 0;
0165 regs->r8 = regs->r9 = regs->r10 = regs->r11 = 0;
0166 regs->r12 = regs->r13 = regs->r14 = regs->r15 = 0;
0167 t->fsbase = t->gsbase = 0;
0168 t->fsindex = t->gsindex = 0;
0169 t->ds = t->es = ds;
0170 }
0171
0172 #define ELF_PLAT_INIT(_r, load_addr) \
0173 elf_common_init(¤t->thread, _r, 0)
0174
0175 #define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
0176 elf_common_init(¤t->thread, regs, __USER_DS)
0177
0178 void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp, bool x32);
0179 #define COMPAT_START_THREAD(ex, regs, new_ip, new_sp) \
0180 compat_start_thread(regs, new_ip, new_sp, ex->e_machine == EM_X86_64)
0181
0182 void set_personality_ia32(bool);
0183 #define COMPAT_SET_PERSONALITY(ex) \
0184 set_personality_ia32((ex).e_machine == EM_X86_64)
0185
0186 #define COMPAT_ELF_PLATFORM ("i686")
0187
0188
0189
0190
0191
0192
0193
0194 #define ELF_CORE_COPY_REGS(pr_reg, regs) \
0195 do { \
0196 unsigned v; \
0197 (pr_reg)[0] = (regs)->r15; \
0198 (pr_reg)[1] = (regs)->r14; \
0199 (pr_reg)[2] = (regs)->r13; \
0200 (pr_reg)[3] = (regs)->r12; \
0201 (pr_reg)[4] = (regs)->bp; \
0202 (pr_reg)[5] = (regs)->bx; \
0203 (pr_reg)[6] = (regs)->r11; \
0204 (pr_reg)[7] = (regs)->r10; \
0205 (pr_reg)[8] = (regs)->r9; \
0206 (pr_reg)[9] = (regs)->r8; \
0207 (pr_reg)[10] = (regs)->ax; \
0208 (pr_reg)[11] = (regs)->cx; \
0209 (pr_reg)[12] = (regs)->dx; \
0210 (pr_reg)[13] = (regs)->si; \
0211 (pr_reg)[14] = (regs)->di; \
0212 (pr_reg)[15] = (regs)->orig_ax; \
0213 (pr_reg)[16] = (regs)->ip; \
0214 (pr_reg)[17] = (regs)->cs; \
0215 (pr_reg)[18] = (regs)->flags; \
0216 (pr_reg)[19] = (regs)->sp; \
0217 (pr_reg)[20] = (regs)->ss; \
0218 (pr_reg)[21] = x86_fsbase_read_cpu(); \
0219 (pr_reg)[22] = x86_gsbase_read_cpu_inactive(); \
0220 asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \
0221 asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \
0222 asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \
0223 asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \
0224 } while (0);
0225
0226
0227 #define ELF_PLATFORM ("x86_64")
0228 extern void set_personality_64bit(void);
0229 extern unsigned int sysctl_vsyscall32;
0230 extern int force_personality32;
0231
0232 #endif
0233
0234 #define CORE_DUMP_USE_REGSET
0235 #define ELF_EXEC_PAGESIZE 4096
0236
0237
0238
0239
0240
0241
0242 #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \
0243 (DEFAULT_MAP_WINDOW / 3 * 2))
0244
0245
0246
0247
0248
0249 #define ELF_HWCAP (boot_cpu_data.x86_capability[CPUID_1_EDX])
0250
0251 extern u32 elf_hwcap2;
0252
0253
0254
0255
0256
0257
0258 #define ELF_HWCAP2 (elf_hwcap2)
0259
0260
0261
0262
0263
0264
0265
0266
0267 #define SET_PERSONALITY(ex) set_personality_64bit()
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293 #define elf_read_implies_exec(ex, executable_stack) \
0294 (mmap_is_ia32() && executable_stack == EXSTACK_DEFAULT)
0295
0296 struct task_struct;
0297
0298 #define ARCH_DLINFO_IA32 \
0299 do { \
0300 if (VDSO_CURRENT_BASE) { \
0301 NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
0302 NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
0303 } \
0304 NEW_AUX_ENT(AT_MINSIGSTKSZ, get_sigframe_size()); \
0305 } while (0)
0306
0307
0308
0309
0310 static inline int mmap_is_ia32(void)
0311 {
0312 return IS_ENABLED(CONFIG_X86_32) ||
0313 (IS_ENABLED(CONFIG_COMPAT) &&
0314 test_thread_flag(TIF_ADDR32));
0315 }
0316
0317 extern unsigned long task_size_32bit(void);
0318 extern unsigned long task_size_64bit(int full_addr_space);
0319 extern unsigned long get_mmap_base(int is_legacy);
0320 extern bool mmap_address_hint_valid(unsigned long addr, unsigned long len);
0321 extern unsigned long get_sigframe_size(void);
0322
0323 #ifdef CONFIG_X86_32
0324
0325 #define __STACK_RND_MASK(is32bit) (0x7ff)
0326 #define STACK_RND_MASK (0x7ff)
0327
0328 #define ARCH_DLINFO ARCH_DLINFO_IA32
0329
0330
0331
0332 #else
0333
0334
0335 #define __STACK_RND_MASK(is32bit) ((is32bit) ? 0x7ff : 0x3fffff)
0336 #define STACK_RND_MASK __STACK_RND_MASK(mmap_is_ia32())
0337
0338 #define ARCH_DLINFO \
0339 do { \
0340 if (vdso64_enabled) \
0341 NEW_AUX_ENT(AT_SYSINFO_EHDR, \
0342 (unsigned long __force)current->mm->context.vdso); \
0343 NEW_AUX_ENT(AT_MINSIGSTKSZ, get_sigframe_size()); \
0344 } while (0)
0345
0346
0347 #define ARCH_DLINFO_X32 \
0348 do { \
0349 if (vdso64_enabled) \
0350 NEW_AUX_ENT(AT_SYSINFO_EHDR, \
0351 (unsigned long __force)current->mm->context.vdso); \
0352 NEW_AUX_ENT(AT_MINSIGSTKSZ, get_sigframe_size()); \
0353 } while (0)
0354
0355 #define AT_SYSINFO 32
0356
0357 #define COMPAT_ARCH_DLINFO \
0358 if (exec->e_machine == EM_X86_64) \
0359 ARCH_DLINFO_X32; \
0360 else if (IS_ENABLED(CONFIG_IA32_EMULATION)) \
0361 ARCH_DLINFO_IA32
0362
0363 #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000)
0364
0365 #endif
0366
0367 #define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)
0368
0369 #define VDSO_ENTRY \
0370 ((unsigned long)current->mm->context.vdso + \
0371 vdso_image_32.sym___kernel_vsyscall)
0372
0373 struct linux_binprm;
0374
0375 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
0376 extern int arch_setup_additional_pages(struct linux_binprm *bprm,
0377 int uses_interp);
0378 extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
0379 int uses_interp, bool x32);
0380 #define COMPAT_ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter) \
0381 compat_arch_setup_additional_pages(bprm, interpreter, \
0382 (ex->e_machine == EM_X86_64))
0383
0384 extern bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs);
0385
0386
0387 enum align_flags {
0388 ALIGN_VA_32 = BIT(0),
0389 ALIGN_VA_64 = BIT(1),
0390 };
0391
0392 struct va_alignment {
0393 int flags;
0394 unsigned long mask;
0395 unsigned long bits;
0396 } ____cacheline_aligned;
0397
0398 extern struct va_alignment va_align;
0399 extern unsigned long align_vdso_addr(unsigned long);
0400 #endif