^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_X86_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_X86_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * ELF register definitions..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/user.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/auxvec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/fsgsbase.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) typedef unsigned long elf_greg_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) typedef elf_greg_t elf_gregset_t[ELF_NGREG];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) typedef struct user_i387_struct elf_fpregset_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #ifdef __i386__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define R_386_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define R_386_32 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define R_386_PC32 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define R_386_GOT32 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define R_386_PLT32 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define R_386_COPY 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define R_386_GLOB_DAT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define R_386_JMP_SLOT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define R_386_RELATIVE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define R_386_GOTOFF 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define R_386_GOTPC 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define R_386_NUM 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * These are used to set parameters in the core dumps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ELF_CLASS ELFCLASS32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define ELF_DATA ELFDATA2LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define ELF_ARCH EM_386
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* x86-64 relocation types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define R_X86_64_NONE 0 /* No reloc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define R_X86_64_64 1 /* Direct 64 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define R_X86_64_PC32 2 /* PC relative 32 bit signed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define R_X86_64_GOT32 3 /* 32 bit GOT entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define R_X86_64_PLT32 4 /* 32 bit PLT address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define R_X86_64_COPY 5 /* Copy symbol at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define R_X86_64_RELATIVE 8 /* Adjust by program base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) offset to GOT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define R_X86_64_32 10 /* Direct 32 bit zero extended */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define R_X86_64_32S 11 /* Direct 32 bit sign extended */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define R_X86_64_16 12 /* Direct 16 bit zero extended */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define R_X86_64_8 14 /* Direct 8 bit sign extended */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define R_X86_64_PC64 24 /* Place relative 64-bit signed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * These are used to set parameters in the core dumps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define ELF_CLASS ELFCLASS64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define ELF_DATA ELFDATA2LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define ELF_ARCH EM_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #include <asm/vdso.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) extern unsigned int vdso64_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) extern unsigned int vdso32_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * This is used to ensure we don't load something for the wrong architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define elf_check_arch_ia32(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #include <asm/desc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define elf_check_arch(x) elf_check_arch_ia32(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) contains a pointer to a function which might be registered using `atexit'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) This provides a mean for the dynamic linker to call DT_FINI functions for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) shared libraries that have been loaded before the code runs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) A value of 0 tells we have no such handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) We might as well make sure everything else is cleared too (except for %esp),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) just to make things more deterministic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define ELF_PLAT_INIT(_r, load_addr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) _r->bx = 0; _r->cx = 0; _r->dx = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) _r->si = 0; _r->di = 0; _r->bp = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) _r->ax = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * regs is struct pt_regs, pr_reg is elf_gregset_t (which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * now struct_user_regs, they are different)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define ELF_CORE_COPY_REGS_COMMON(pr_reg, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) pr_reg[0] = regs->bx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) pr_reg[1] = regs->cx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) pr_reg[2] = regs->dx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) pr_reg[3] = regs->si; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) pr_reg[4] = regs->di; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) pr_reg[5] = regs->bp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) pr_reg[6] = regs->ax; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) pr_reg[7] = regs->ds; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) pr_reg[8] = regs->es; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) pr_reg[9] = regs->fs; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) pr_reg[11] = regs->orig_ax; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) pr_reg[12] = regs->ip; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) pr_reg[13] = regs->cs; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) pr_reg[14] = regs->flags; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) pr_reg[15] = regs->sp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) pr_reg[16] = regs->ss; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) } while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define ELF_CORE_COPY_REGS(pr_reg, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) pr_reg[10] = get_user_gs(regs); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) } while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define ELF_CORE_COPY_KERNEL_REGS(pr_reg, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) savesegment(gs, pr_reg[10]); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) } while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define ELF_PLATFORM (utsname()->machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define set_personality_64bit() do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #else /* CONFIG_X86_32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * This is used to ensure we don't load something for the wrong architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define elf_check_arch(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ((x)->e_machine == EM_X86_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define compat_elf_check_arch(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) (elf_check_arch_ia32(x) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) (IS_ENABLED(CONFIG_X86_X32_ABI) && (x)->e_machine == EM_X86_64))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #if __USER32_DS != __USER_DS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) # error "The following code assumes __USER32_DS == __USER_DS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static inline void elf_common_init(struct thread_struct *t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct pt_regs *regs, const u16 ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* ax gets execve's return value. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /*regs->ax = */ regs->bx = regs->cx = regs->dx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) regs->si = regs->di = regs->bp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) regs->r8 = regs->r9 = regs->r10 = regs->r11 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) regs->r12 = regs->r13 = regs->r14 = regs->r15 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) t->fsbase = t->gsbase = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) t->fsindex = t->gsindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) t->ds = t->es = ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define ELF_PLAT_INIT(_r, load_addr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) elf_common_init(¤t->thread, _r, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) elf_common_init(¤t->thread, regs, __USER_DS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define compat_start_thread compat_start_thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) void set_personality_ia32(bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define COMPAT_SET_PERSONALITY(ex) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) set_personality_ia32((ex).e_machine == EM_X86_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define COMPAT_ELF_PLATFORM ("i686")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * regs is struct pt_regs, pr_reg is elf_gregset_t (which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * now struct_user_regs, they are different). Assumes current is the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * getting dumped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #define ELF_CORE_COPY_REGS(pr_reg, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) unsigned v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) (pr_reg)[0] = (regs)->r15; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) (pr_reg)[1] = (regs)->r14; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) (pr_reg)[2] = (regs)->r13; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) (pr_reg)[3] = (regs)->r12; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) (pr_reg)[4] = (regs)->bp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) (pr_reg)[5] = (regs)->bx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) (pr_reg)[6] = (regs)->r11; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) (pr_reg)[7] = (regs)->r10; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) (pr_reg)[8] = (regs)->r9; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) (pr_reg)[9] = (regs)->r8; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) (pr_reg)[10] = (regs)->ax; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) (pr_reg)[11] = (regs)->cx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) (pr_reg)[12] = (regs)->dx; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) (pr_reg)[13] = (regs)->si; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) (pr_reg)[14] = (regs)->di; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) (pr_reg)[15] = (regs)->orig_ax; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) (pr_reg)[16] = (regs)->ip; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) (pr_reg)[17] = (regs)->cs; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) (pr_reg)[18] = (regs)->flags; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) (pr_reg)[19] = (regs)->sp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) (pr_reg)[20] = (regs)->ss; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) (pr_reg)[21] = x86_fsbase_read_cpu(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) (pr_reg)[22] = x86_gsbase_read_cpu_inactive(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) } while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* I'm not sure if we can use '-' here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define ELF_PLATFORM ("x86_64")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) extern void set_personality_64bit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) extern unsigned int sysctl_vsyscall32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) extern int force_personality32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #endif /* !CONFIG_X86_32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define CORE_DUMP_USE_REGSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define ELF_EXEC_PAGESIZE 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * This is the base location for PIE (ET_DYN with INTERP) loads. On
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * 64-bit, this is above 4GB to leave the entire 32-bit address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * space open for things that want to use the area for 32-bit pointers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) (DEFAULT_MAP_WINDOW / 3 * 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) /* This yields a mask that user programs can use to figure out what
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) instruction set this CPU supports. This could be done in user space,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) but it's not easy, and we've already done it here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define ELF_HWCAP (boot_cpu_data.x86_capability[CPUID_1_EDX])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) extern u32 elf_hwcap2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * HWCAP2 supplies mask with kernel enabled CPU features, so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * the application can discover that it can safely use them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * The bits are defined in uapi/asm/hwcap2.h.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define ELF_HWCAP2 (elf_hwcap2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /* This yields a string that ld.so will use to load implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) specific libraries for optimization. This is more specific in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) intent than poking at uname or /proc/cpuinfo.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) For the moment, we have only optimizations for the Intel generations,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) but that could change... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #define SET_PERSONALITY(ex) set_personality_64bit()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * An executable for which elf_read_implies_exec() returns TRUE will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * have the READ_IMPLIES_EXEC personality flag set automatically.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * The decision process for determining the results are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * CPU: | lacks NX* | has NX, ia32 | has NX, x86_64 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * ELF: | | | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * ---------------------|------------|------------------|----------------|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * missing PT_GNU_STACK | exec-all | exec-all | exec-none |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * PT_GNU_STACK == RWX | exec-stack | exec-stack | exec-stack |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * PT_GNU_STACK == RW | exec-none | exec-none | exec-none |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * exec-all : all PROT_READ user mappings are executable, except when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * backed by files on a noexec-filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * exec-none : only PROT_EXEC user mappings are executable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * exec-stack: only the stack and PROT_EXEC user mappings are executable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * *this column has no architectural effect: NX markings are ignored by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * hardware, but may have behavioral effects when "wants X" collides with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * "cannot be X" constraints in memory permission flags, as in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * https://lkml.kernel.org/r/20190418055759.GA3155@mellanox.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define elf_read_implies_exec(ex, executable_stack) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) (mmap_is_ia32() && executable_stack == EXSTACK_DEFAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) struct task_struct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define ARCH_DLINFO_IA32 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if (VDSO_CURRENT_BASE) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) * True on X86_32 or when emulating IA32 on X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) static inline int mmap_is_ia32(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) return IS_ENABLED(CONFIG_X86_32) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) (IS_ENABLED(CONFIG_COMPAT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) test_thread_flag(TIF_ADDR32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) extern unsigned long task_size_32bit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) extern unsigned long task_size_64bit(int full_addr_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) extern unsigned long get_mmap_base(int is_legacy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) extern bool mmap_address_hint_valid(unsigned long addr, unsigned long len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #define __STACK_RND_MASK(is32bit) (0x7ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define STACK_RND_MASK (0x7ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define ARCH_DLINFO ARCH_DLINFO_IA32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #else /* CONFIG_X86_32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) /* 1GB for 64bit, 8MB for 32bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define __STACK_RND_MASK(is32bit) ((is32bit) ? 0x7ff : 0x3fffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define STACK_RND_MASK __STACK_RND_MASK(mmap_is_ia32())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define ARCH_DLINFO \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (vdso64_enabled) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) NEW_AUX_ENT(AT_SYSINFO_EHDR, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) (unsigned long __force)current->mm->context.vdso); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) /* As a historical oddity, the x32 and x86_64 vDSOs are controlled together. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define ARCH_DLINFO_X32 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (vdso64_enabled) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) NEW_AUX_ENT(AT_SYSINFO_EHDR, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) (unsigned long __force)current->mm->context.vdso); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define AT_SYSINFO 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define COMPAT_ARCH_DLINFO \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (test_thread_flag(TIF_X32)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) ARCH_DLINFO_X32; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) ARCH_DLINFO_IA32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #endif /* !CONFIG_X86_32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define VDSO_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) ((unsigned long)current->mm->context.vdso + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) vdso_image_32.sym___kernel_vsyscall)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct linux_binprm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) extern int arch_setup_additional_pages(struct linux_binprm *bprm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) int uses_interp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) int uses_interp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define compat_arch_setup_additional_pages compat_arch_setup_additional_pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) /* Do not change the values. See get_align_mask() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) enum align_flags {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ALIGN_VA_32 = BIT(0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) ALIGN_VA_64 = BIT(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct va_alignment {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) unsigned long mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) unsigned long bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) } ____cacheline_aligned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) extern struct va_alignment va_align;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) extern unsigned long align_vdso_addr(unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #endif /* _ASM_X86_ELF_H */