Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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(&current->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(&current->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 */