···1-#ifdef __KERNEL__2-# ifdef CONFIG_X86_323-# include "elf_32.h"4-# else5-# include "elf_64.h"6-# endif0000000000000000000000000000000000007#else8-# ifdef __i386__9-# include "elf_32.h"10-# else11-# include "elf_64.h"12-# endif000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013#endif
···1+#ifndef _ASM_X86_ELF_H2+#define _ASM_X86_ELF_H3+4+/*5+ * ELF register definitions..6+ */7+8+#include <asm/ptrace.h>9+#include <asm/user.h>10+#include <asm/auxvec.h>11+12+typedef unsigned long elf_greg_t;13+14+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))15+typedef elf_greg_t elf_gregset_t[ELF_NGREG];16+17+typedef struct user_i387_struct elf_fpregset_t;18+19+#ifdef __i386__20+21+typedef struct user_fxsr_struct elf_fpxregset_t;22+23+#define R_386_NONE 024+#define R_386_32 125+#define R_386_PC32 226+#define R_386_GOT32 327+#define R_386_PLT32 428+#define R_386_COPY 529+#define R_386_GLOB_DAT 630+#define R_386_JMP_SLOT 731+#define R_386_RELATIVE 832+#define R_386_GOTOFF 933+#define R_386_GOTPC 1034+#define R_386_NUM 1135+36+/*37+ * These are used to set parameters in the core dumps.38+ */39+#define ELF_CLASS ELFCLASS3240+#define ELF_DATA ELFDATA2LSB41+#define ELF_ARCH EM_38642+43#else44+45+/* x86-64 relocation types */46+#define R_X86_64_NONE 0 /* No reloc */47+#define R_X86_64_64 1 /* Direct 64 bit */48+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */49+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */50+#define R_X86_64_PLT32 4 /* 32 bit PLT address */51+#define R_X86_64_COPY 5 /* Copy symbol at runtime */52+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */53+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */54+#define R_X86_64_RELATIVE 8 /* Adjust by program base */55+#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative56+ offset to GOT */57+#define R_X86_64_32 10 /* Direct 32 bit zero extended */58+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */59+#define R_X86_64_16 12 /* Direct 16 bit zero extended */60+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */61+#define R_X86_64_8 14 /* Direct 8 bit sign extended */62+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */63+64+#define R_X86_64_NUM 1665+66+/*67+ * These are used to set parameters in the core dumps.68+ */69+#define ELF_CLASS ELFCLASS6470+#define ELF_DATA ELFDATA2LSB71+#define ELF_ARCH EM_X86_6472+73+#endif74+75+#ifdef __KERNEL__76+77+#ifdef CONFIG_X86_3278+#include <asm/processor.h>79+#include <asm/system.h> /* for savesegment */80+#include <asm/desc.h>81+82+/*83+ * This is used to ensure we don't load something for the wrong architecture.84+ */85+#define elf_check_arch(x) \86+ (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))87+88+/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx89+ contains a pointer to a function which might be registered using `atexit'.90+ This provides a mean for the dynamic linker to call DT_FINI functions for91+ shared libraries that have been loaded before the code runs.92+93+ A value of 0 tells we have no such handler.94+95+ We might as well make sure everything else is cleared too (except for %esp),96+ just to make things more deterministic.97+ */98+#define ELF_PLAT_INIT(_r, load_addr) do { \99+ _r->ebx = 0; _r->ecx = 0; _r->edx = 0; \100+ _r->esi = 0; _r->edi = 0; _r->ebp = 0; \101+ _r->eax = 0; \102+} while (0)103+104+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is105+ now struct_user_regs, they are different) */106+107+#define ELF_CORE_COPY_REGS(pr_reg, regs) \108+ pr_reg[0] = regs->ebx; \109+ pr_reg[1] = regs->ecx; \110+ pr_reg[2] = regs->edx; \111+ pr_reg[3] = regs->esi; \112+ pr_reg[4] = regs->edi; \113+ pr_reg[5] = regs->ebp; \114+ pr_reg[6] = regs->eax; \115+ pr_reg[7] = regs->xds & 0xffff; \116+ pr_reg[8] = regs->xes & 0xffff; \117+ pr_reg[9] = regs->xfs & 0xffff; \118+ savesegment(gs,pr_reg[10]); \119+ pr_reg[11] = regs->orig_eax; \120+ pr_reg[12] = regs->eip; \121+ pr_reg[13] = regs->xcs & 0xffff; \122+ pr_reg[14] = regs->eflags; \123+ pr_reg[15] = regs->esp; \124+ pr_reg[16] = regs->xss & 0xffff;125+126+#define ELF_PLATFORM (utsname()->machine)127+#define set_personality_64bit() do { } while (0)128+extern unsigned int vdso_enabled;129+130+#else /* CONFIG_X86_32 */131+132+#include <asm/processor.h>133+134+/*135+ * This is used to ensure we don't load something for the wrong architecture.136+ */137+#define elf_check_arch(x) \138+ ((x)->e_machine == EM_X86_64)139+140+#define ELF_PLAT_INIT(_r, load_addr) do { \141+ struct task_struct *cur = current; \142+ (_r)->rbx = 0; (_r)->rcx = 0; (_r)->rdx = 0; \143+ (_r)->rsi = 0; (_r)->rdi = 0; (_r)->rbp = 0; \144+ (_r)->rax = 0; \145+ (_r)->r8 = 0; \146+ (_r)->r9 = 0; \147+ (_r)->r10 = 0; \148+ (_r)->r11 = 0; \149+ (_r)->r12 = 0; \150+ (_r)->r13 = 0; \151+ (_r)->r14 = 0; \152+ (_r)->r15 = 0; \153+ cur->thread.fs = 0; cur->thread.gs = 0; \154+ cur->thread.fsindex = 0; cur->thread.gsindex = 0; \155+ cur->thread.ds = 0; cur->thread.es = 0; \156+ clear_thread_flag(TIF_IA32); \157+} while (0)158+159+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is160+ now struct_user_regs, they are different). Assumes current is the process161+ getting dumped. */162+163+#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \164+ unsigned v; \165+ (pr_reg)[0] = (regs)->r15; \166+ (pr_reg)[1] = (regs)->r14; \167+ (pr_reg)[2] = (regs)->r13; \168+ (pr_reg)[3] = (regs)->r12; \169+ (pr_reg)[4] = (regs)->rbp; \170+ (pr_reg)[5] = (regs)->rbx; \171+ (pr_reg)[6] = (regs)->r11; \172+ (pr_reg)[7] = (regs)->r10; \173+ (pr_reg)[8] = (regs)->r9; \174+ (pr_reg)[9] = (regs)->r8; \175+ (pr_reg)[10] = (regs)->rax; \176+ (pr_reg)[11] = (regs)->rcx; \177+ (pr_reg)[12] = (regs)->rdx; \178+ (pr_reg)[13] = (regs)->rsi; \179+ (pr_reg)[14] = (regs)->rdi; \180+ (pr_reg)[15] = (regs)->orig_rax; \181+ (pr_reg)[16] = (regs)->rip; \182+ (pr_reg)[17] = (regs)->cs; \183+ (pr_reg)[18] = (regs)->eflags; \184+ (pr_reg)[19] = (regs)->rsp; \185+ (pr_reg)[20] = (regs)->ss; \186+ (pr_reg)[21] = current->thread.fs; \187+ (pr_reg)[22] = current->thread.gs; \188+ asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \189+ asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \190+ asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \191+ asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \192+} while(0);193+194+/* I'm not sure if we can use '-' here */195+#define ELF_PLATFORM ("x86_64")196+extern void set_personality_64bit(void);197+extern int vdso_enabled;198+199+#endif /* !CONFIG_X86_32 */200+201+#define USE_ELF_CORE_DUMP202+#define ELF_EXEC_PAGESIZE 4096203+204+/* This is the location that an ET_DYN program is loaded if exec'ed. Typical205+ use of this is to invoke "./ld.so someprog" to test out a new version of206+ the loader. We need to make sure that it is out of the way of the program207+ that it will "exec", and that there is sufficient room for the brk. */208+209+#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)210+211+/* This yields a mask that user programs can use to figure out what212+ instruction set this CPU supports. This could be done in user space,213+ but it's not easy, and we've already done it here. */214+215+#define ELF_HWCAP (boot_cpu_data.x86_capability[0])216+217+/* This yields a string that ld.so will use to load implementation218+ specific libraries for optimization. This is more specific in219+ intent than poking at uname or /proc/cpuinfo.220+221+ For the moment, we have only optimizations for the Intel generations,222+ but that could change... */223+224+#define SET_PERSONALITY(ex, ibcs2) set_personality_64bit()225+226+/*227+ * An executable for which elf_read_implies_exec() returns TRUE will228+ * have the READ_IMPLIES_EXEC personality flag set automatically.229+ */230+#define elf_read_implies_exec(ex, executable_stack) \231+ (executable_stack != EXSTACK_DISABLE_X)232+233+struct task_struct;234+235+extern int dump_task_regs (struct task_struct *, elf_gregset_t *);236+extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);237+238+#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)239+#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)240+241+#ifdef CONFIG_X86_32242+extern int dump_task_extended_fpu (struct task_struct *,243+ struct user_fxsr_struct *);244+#define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) \245+ dump_task_extended_fpu(tsk, elf_xfpregs)246+#define ELF_CORE_XFPREG_TYPE NT_PRXFPREG247+248+#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))249+#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)250+#define VDSO_PRELINK 0251+252+#define VDSO_SYM(x) \253+ (VDSO_CURRENT_BASE + (unsigned long)(x) - VDSO_PRELINK)254+255+#define VDSO_HIGH_EHDR ((const struct elfhdr *) VDSO_HIGH_BASE)256+#define VDSO_EHDR ((const struct elfhdr *) VDSO_CURRENT_BASE)257+258+extern void __kernel_vsyscall;259+260+#define VDSO_ENTRY VDSO_SYM(&__kernel_vsyscall)261+262+/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */263+264+#define ARCH_DLINFO \265+do if (vdso_enabled) { \266+ NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \267+ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \268+} while (0)269+270+#else /* CONFIG_X86_32 */271+272+/* 1GB for 64bit, 8MB for 32bit */273+#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)274+275+#define ARCH_DLINFO \276+do if (vdso_enabled) { \277+ NEW_AUX_ENT(AT_SYSINFO_EHDR,(unsigned long)current->mm->context.vdso);\278+} while (0)279+280+#endif /* !CONFIG_X86_32 */281+282+struct linux_binprm;283+284+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1285+extern int arch_setup_additional_pages(struct linux_binprm *bprm,286+ int executable_stack);287+288+#endif /* __KERNEL__ */289+290#endif
-165
include/asm-x86/elf_32.h
···1-#ifndef __ASMi386_ELF_H2-#define __ASMi386_ELF_H3-4-/*5- * ELF register definitions..6- */7-8-#include <asm/ptrace.h>9-#include <asm/user.h>10-#include <asm/auxvec.h>11-12-#define R_386_NONE 013-#define R_386_32 114-#define R_386_PC32 215-#define R_386_GOT32 316-#define R_386_PLT32 417-#define R_386_COPY 518-#define R_386_GLOB_DAT 619-#define R_386_JMP_SLOT 720-#define R_386_RELATIVE 821-#define R_386_GOTOFF 922-#define R_386_GOTPC 1023-#define R_386_NUM 1124-25-typedef unsigned long elf_greg_t;26-27-#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))28-typedef elf_greg_t elf_gregset_t[ELF_NGREG];29-30-typedef struct user_i387_struct elf_fpregset_t;31-typedef struct user_fxsr_struct elf_fpxregset_t;32-33-/*34- * This is used to ensure we don't load something for the wrong architecture.35- */36-#define elf_check_arch(x) \37- (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))38-39-/*40- * These are used to set parameters in the core dumps.41- */42-#define ELF_CLASS ELFCLASS3243-#define ELF_DATA ELFDATA2LSB44-#define ELF_ARCH EM_38645-46-#ifdef __KERNEL__47-48-#include <asm/processor.h>49-#include <asm/system.h> /* for savesegment */50-#include <asm/desc.h>51-52-/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx53- contains a pointer to a function which might be registered using `atexit'.54- This provides a mean for the dynamic linker to call DT_FINI functions for55- shared libraries that have been loaded before the code runs.56-57- A value of 0 tells we have no such handler. 58-59- We might as well make sure everything else is cleared too (except for %esp),60- just to make things more deterministic.61- */62-#define ELF_PLAT_INIT(_r, load_addr) do { \63- _r->ebx = 0; _r->ecx = 0; _r->edx = 0; \64- _r->esi = 0; _r->edi = 0; _r->ebp = 0; \65- _r->eax = 0; \66-} while (0)67-68-#define USE_ELF_CORE_DUMP69-#define ELF_EXEC_PAGESIZE 409670-71-/* This is the location that an ET_DYN program is loaded if exec'ed. Typical72- use of this is to invoke "./ld.so someprog" to test out a new version of73- the loader. We need to make sure that it is out of the way of the program74- that it will "exec", and that there is sufficient room for the brk. */75-76-#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)77-78-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is79- now struct_user_regs, they are different) */80-81-#define ELF_CORE_COPY_REGS(pr_reg, regs) \82- pr_reg[0] = regs->ebx; \83- pr_reg[1] = regs->ecx; \84- pr_reg[2] = regs->edx; \85- pr_reg[3] = regs->esi; \86- pr_reg[4] = regs->edi; \87- pr_reg[5] = regs->ebp; \88- pr_reg[6] = regs->eax; \89- pr_reg[7] = regs->xds & 0xffff; \90- pr_reg[8] = regs->xes & 0xffff; \91- pr_reg[9] = regs->xfs & 0xffff; \92- savesegment(gs,pr_reg[10]); \93- pr_reg[11] = regs->orig_eax; \94- pr_reg[12] = regs->eip; \95- pr_reg[13] = regs->xcs & 0xffff; \96- pr_reg[14] = regs->eflags; \97- pr_reg[15] = regs->esp; \98- pr_reg[16] = regs->xss & 0xffff;99-100-/* This yields a mask that user programs can use to figure out what101- instruction set this CPU supports. This could be done in user space,102- but it's not easy, and we've already done it here. */103-104-#define ELF_HWCAP (boot_cpu_data.x86_capability[0])105-106-/* This yields a string that ld.so will use to load implementation107- specific libraries for optimization. This is more specific in108- intent than poking at uname or /proc/cpuinfo.109-110- For the moment, we have only optimizations for the Intel generations,111- but that could change... */112-113-#define ELF_PLATFORM (utsname()->machine)114-115-#define SET_PERSONALITY(ex, ibcs2) do { } while (0)116-117-/*118- * An executable for which elf_read_implies_exec() returns TRUE will119- * have the READ_IMPLIES_EXEC personality flag set automatically.120- */121-#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X)122-123-struct task_struct;124-125-extern int dump_task_regs (struct task_struct *, elf_gregset_t *);126-extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);127-extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct *);128-129-#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)130-#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)131-#define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) dump_task_extended_fpu(tsk, elf_xfpregs)132-#define ELF_CORE_XFPREG_TYPE NT_PRXFPREG133-134-#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))135-#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)136-#define VDSO_PRELINK 0137-138-#define VDSO_SYM(x) \139- (VDSO_CURRENT_BASE + (unsigned long)(x) - VDSO_PRELINK)140-141-#define VDSO_HIGH_EHDR ((const struct elfhdr *) VDSO_HIGH_BASE)142-#define VDSO_EHDR ((const struct elfhdr *) VDSO_CURRENT_BASE)143-144-extern void __kernel_vsyscall;145-146-#define VDSO_ENTRY VDSO_SYM(&__kernel_vsyscall)147-148-struct linux_binprm;149-150-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES151-extern int arch_setup_additional_pages(struct linux_binprm *bprm,152- int executable_stack);153-154-extern unsigned int vdso_enabled;155-156-/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */157-#define ARCH_DLINFO \158-do if (vdso_enabled) { \159- NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \160- NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \161-} while (0)162-163-#endif164-165-#endif
···1-#ifndef __ASM_X86_64_ELF_H2-#define __ASM_X86_64_ELF_H3-4-/*5- * ELF register definitions..6- */7-8-#include <asm/ptrace.h>9-#include <asm/user.h>10-11-/* x86-64 relocation types */12-#define R_X86_64_NONE 0 /* No reloc */13-#define R_X86_64_64 1 /* Direct 64 bit */14-#define R_X86_64_PC32 2 /* PC relative 32 bit signed */15-#define R_X86_64_GOT32 3 /* 32 bit GOT entry */16-#define R_X86_64_PLT32 4 /* 32 bit PLT address */17-#define R_X86_64_COPY 5 /* Copy symbol at runtime */18-#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */19-#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */20-#define R_X86_64_RELATIVE 8 /* Adjust by program base */21-#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative22- offset to GOT */23-#define R_X86_64_32 10 /* Direct 32 bit zero extended */24-#define R_X86_64_32S 11 /* Direct 32 bit sign extended */25-#define R_X86_64_16 12 /* Direct 16 bit zero extended */26-#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */27-#define R_X86_64_8 14 /* Direct 8 bit sign extended */28-#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */29-30-#define R_X86_64_NUM 1631-32-typedef unsigned long elf_greg_t;33-34-#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))35-typedef elf_greg_t elf_gregset_t[ELF_NGREG];36-37-typedef struct user_i387_struct elf_fpregset_t;38-39-/*40- * These are used to set parameters in the core dumps.41- */42-#define ELF_CLASS ELFCLASS6443-#define ELF_DATA ELFDATA2LSB44-#define ELF_ARCH EM_X86_6445-46-#ifdef __KERNEL__47-#include <asm/processor.h>48-49-/*50- * This is used to ensure we don't load something for the wrong architecture.51- */52-#define elf_check_arch(x) \53- ((x)->e_machine == EM_X86_64)54-55-56-/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx57- contains a pointer to a function which might be registered using `atexit'.58- This provides a mean for the dynamic linker to call DT_FINI functions for59- shared libraries that have been loaded before the code runs.60-61- A value of 0 tells we have no such handler. 62-63- We might as well make sure everything else is cleared too (except for %esp),64- just to make things more deterministic.65- */66-#define ELF_PLAT_INIT(_r, load_addr) do { \67- struct task_struct *cur = current; \68- (_r)->rbx = 0; (_r)->rcx = 0; (_r)->rdx = 0; \69- (_r)->rsi = 0; (_r)->rdi = 0; (_r)->rbp = 0; \70- (_r)->rax = 0; \71- (_r)->r8 = 0; \72- (_r)->r9 = 0; \73- (_r)->r10 = 0; \74- (_r)->r11 = 0; \75- (_r)->r12 = 0; \76- (_r)->r13 = 0; \77- (_r)->r14 = 0; \78- (_r)->r15 = 0; \79- cur->thread.fs = 0; cur->thread.gs = 0; \80- cur->thread.fsindex = 0; cur->thread.gsindex = 0; \81- cur->thread.ds = 0; cur->thread.es = 0; \82- clear_thread_flag(TIF_IA32); \83-} while (0)84-85-#define USE_ELF_CORE_DUMP86-#define ELF_EXEC_PAGESIZE 409687-88-/* This is the location that an ET_DYN program is loaded if exec'ed. Typical89- use of this is to invoke "./ld.so someprog" to test out a new version of90- the loader. We need to make sure that it is out of the way of the program91- that it will "exec", and that there is sufficient room for the brk. */92-93-#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)94-95-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is96- now struct_user_regs, they are different). Assumes current is the process97- getting dumped. */98-99-#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \100- unsigned v; \101- (pr_reg)[0] = (regs)->r15; \102- (pr_reg)[1] = (regs)->r14; \103- (pr_reg)[2] = (regs)->r13; \104- (pr_reg)[3] = (regs)->r12; \105- (pr_reg)[4] = (regs)->rbp; \106- (pr_reg)[5] = (regs)->rbx; \107- (pr_reg)[6] = (regs)->r11; \108- (pr_reg)[7] = (regs)->r10; \109- (pr_reg)[8] = (regs)->r9; \110- (pr_reg)[9] = (regs)->r8; \111- (pr_reg)[10] = (regs)->rax; \112- (pr_reg)[11] = (regs)->rcx; \113- (pr_reg)[12] = (regs)->rdx; \114- (pr_reg)[13] = (regs)->rsi; \115- (pr_reg)[14] = (regs)->rdi; \116- (pr_reg)[15] = (regs)->orig_rax; \117- (pr_reg)[16] = (regs)->rip; \118- (pr_reg)[17] = (regs)->cs; \119- (pr_reg)[18] = (regs)->eflags; \120- (pr_reg)[19] = (regs)->rsp; \121- (pr_reg)[20] = (regs)->ss; \122- (pr_reg)[21] = current->thread.fs; \123- (pr_reg)[22] = current->thread.gs; \124- asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \125- asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \126- asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \127- asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \128-} while(0);129-130-/* This yields a mask that user programs can use to figure out what131- instruction set this CPU supports. This could be done in user space,132- but it's not easy, and we've already done it here. */133-134-#define ELF_HWCAP (boot_cpu_data.x86_capability[0])135-136-/* This yields a string that ld.so will use to load implementation137- specific libraries for optimization. This is more specific in138- intent than poking at uname or /proc/cpuinfo.139-140- For the moment, we have only optimizations for the Intel generations,141- but that could change... */142-143-/* I'm not sure if we can use '-' here */144-#define ELF_PLATFORM ("x86_64")145-146-extern void set_personality_64bit(void);147-#define SET_PERSONALITY(ex, ibcs2) set_personality_64bit()148-/*149- * An executable for which elf_read_implies_exec() returns TRUE will150- * have the READ_IMPLIES_EXEC personality flag set automatically.151- */152-#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X)153-154-struct task_struct;155-156-extern int dump_task_regs (struct task_struct *, elf_gregset_t *);157-extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);158-159-#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)160-#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)161-162-/* 1GB for 64bit, 8MB for 32bit */163-#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)164-165-166-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1167-struct linux_binprm;168-extern int arch_setup_additional_pages(struct linux_binprm *bprm,169- int executable_stack);170-171-extern int vdso_enabled;172-173-#define ARCH_DLINFO \174-do if (vdso_enabled) { \175- NEW_AUX_ENT(AT_SYSINFO_EHDR,(unsigned long)current->mm->context.vdso);\176-} while (0)177-178-#endif179-180-#endif