···11-#ifdef __KERNEL__22-# ifdef CONFIG_X86_3233-# include "elf_32.h"44-# else55-# include "elf_64.h"66-# endif11+#ifndef _ASM_X86_ELF_H22+#define _ASM_X86_ELF_H33+44+/*55+ * ELF register definitions..66+ */77+88+#include <asm/ptrace.h>99+#include <asm/user.h>1010+#include <asm/auxvec.h>1111+1212+typedef unsigned long elf_greg_t;1313+1414+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))1515+typedef elf_greg_t elf_gregset_t[ELF_NGREG];1616+1717+typedef struct user_i387_struct elf_fpregset_t;1818+1919+#ifdef __i386__2020+2121+typedef struct user_fxsr_struct elf_fpxregset_t;2222+2323+#define R_386_NONE 02424+#define R_386_32 12525+#define R_386_PC32 22626+#define R_386_GOT32 32727+#define R_386_PLT32 42828+#define R_386_COPY 52929+#define R_386_GLOB_DAT 63030+#define R_386_JMP_SLOT 73131+#define R_386_RELATIVE 83232+#define R_386_GOTOFF 93333+#define R_386_GOTPC 103434+#define R_386_NUM 113535+3636+/*3737+ * These are used to set parameters in the core dumps.3838+ */3939+#define ELF_CLASS ELFCLASS324040+#define ELF_DATA ELFDATA2LSB4141+#define ELF_ARCH EM_3864242+743#else88-# ifdef __i386__99-# include "elf_32.h"1010-# else1111-# include "elf_64.h"1212-# endif4444+4545+/* x86-64 relocation types */4646+#define R_X86_64_NONE 0 /* No reloc */4747+#define R_X86_64_64 1 /* Direct 64 bit */4848+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */4949+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */5050+#define R_X86_64_PLT32 4 /* 32 bit PLT address */5151+#define R_X86_64_COPY 5 /* Copy symbol at runtime */5252+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */5353+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */5454+#define R_X86_64_RELATIVE 8 /* Adjust by program base */5555+#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative5656+ offset to GOT */5757+#define R_X86_64_32 10 /* Direct 32 bit zero extended */5858+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */5959+#define R_X86_64_16 12 /* Direct 16 bit zero extended */6060+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */6161+#define R_X86_64_8 14 /* Direct 8 bit sign extended */6262+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */6363+6464+#define R_X86_64_NUM 166565+6666+/*6767+ * These are used to set parameters in the core dumps.6868+ */6969+#define ELF_CLASS ELFCLASS647070+#define ELF_DATA ELFDATA2LSB7171+#define ELF_ARCH EM_X86_647272+7373+#endif7474+7575+#ifdef __KERNEL__7676+7777+#ifdef CONFIG_X86_327878+#include <asm/processor.h>7979+#include <asm/system.h> /* for savesegment */8080+#include <asm/desc.h>8181+8282+/*8383+ * This is used to ensure we don't load something for the wrong architecture.8484+ */8585+#define elf_check_arch(x) \8686+ (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))8787+8888+/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx8989+ contains a pointer to a function which might be registered using `atexit'.9090+ This provides a mean for the dynamic linker to call DT_FINI functions for9191+ shared libraries that have been loaded before the code runs.9292+9393+ A value of 0 tells we have no such handler.9494+9595+ We might as well make sure everything else is cleared too (except for %esp),9696+ just to make things more deterministic.9797+ */9898+#define ELF_PLAT_INIT(_r, load_addr) do { \9999+ _r->ebx = 0; _r->ecx = 0; _r->edx = 0; \100100+ _r->esi = 0; _r->edi = 0; _r->ebp = 0; \101101+ _r->eax = 0; \102102+} while (0)103103+104104+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is105105+ now struct_user_regs, they are different) */106106+107107+#define ELF_CORE_COPY_REGS(pr_reg, regs) \108108+ pr_reg[0] = regs->ebx; \109109+ pr_reg[1] = regs->ecx; \110110+ pr_reg[2] = regs->edx; \111111+ pr_reg[3] = regs->esi; \112112+ pr_reg[4] = regs->edi; \113113+ pr_reg[5] = regs->ebp; \114114+ pr_reg[6] = regs->eax; \115115+ pr_reg[7] = regs->xds & 0xffff; \116116+ pr_reg[8] = regs->xes & 0xffff; \117117+ pr_reg[9] = regs->xfs & 0xffff; \118118+ savesegment(gs,pr_reg[10]); \119119+ pr_reg[11] = regs->orig_eax; \120120+ pr_reg[12] = regs->eip; \121121+ pr_reg[13] = regs->xcs & 0xffff; \122122+ pr_reg[14] = regs->eflags; \123123+ pr_reg[15] = regs->esp; \124124+ pr_reg[16] = regs->xss & 0xffff;125125+126126+#define ELF_PLATFORM (utsname()->machine)127127+#define set_personality_64bit() do { } while (0)128128+extern unsigned int vdso_enabled;129129+130130+#else /* CONFIG_X86_32 */131131+132132+#include <asm/processor.h>133133+134134+/*135135+ * This is used to ensure we don't load something for the wrong architecture.136136+ */137137+#define elf_check_arch(x) \138138+ ((x)->e_machine == EM_X86_64)139139+140140+#define ELF_PLAT_INIT(_r, load_addr) do { \141141+ struct task_struct *cur = current; \142142+ (_r)->rbx = 0; (_r)->rcx = 0; (_r)->rdx = 0; \143143+ (_r)->rsi = 0; (_r)->rdi = 0; (_r)->rbp = 0; \144144+ (_r)->rax = 0; \145145+ (_r)->r8 = 0; \146146+ (_r)->r9 = 0; \147147+ (_r)->r10 = 0; \148148+ (_r)->r11 = 0; \149149+ (_r)->r12 = 0; \150150+ (_r)->r13 = 0; \151151+ (_r)->r14 = 0; \152152+ (_r)->r15 = 0; \153153+ cur->thread.fs = 0; cur->thread.gs = 0; \154154+ cur->thread.fsindex = 0; cur->thread.gsindex = 0; \155155+ cur->thread.ds = 0; cur->thread.es = 0; \156156+ clear_thread_flag(TIF_IA32); \157157+} while (0)158158+159159+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is160160+ now struct_user_regs, they are different). Assumes current is the process161161+ getting dumped. */162162+163163+#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \164164+ unsigned v; \165165+ (pr_reg)[0] = (regs)->r15; \166166+ (pr_reg)[1] = (regs)->r14; \167167+ (pr_reg)[2] = (regs)->r13; \168168+ (pr_reg)[3] = (regs)->r12; \169169+ (pr_reg)[4] = (regs)->rbp; \170170+ (pr_reg)[5] = (regs)->rbx; \171171+ (pr_reg)[6] = (regs)->r11; \172172+ (pr_reg)[7] = (regs)->r10; \173173+ (pr_reg)[8] = (regs)->r9; \174174+ (pr_reg)[9] = (regs)->r8; \175175+ (pr_reg)[10] = (regs)->rax; \176176+ (pr_reg)[11] = (regs)->rcx; \177177+ (pr_reg)[12] = (regs)->rdx; \178178+ (pr_reg)[13] = (regs)->rsi; \179179+ (pr_reg)[14] = (regs)->rdi; \180180+ (pr_reg)[15] = (regs)->orig_rax; \181181+ (pr_reg)[16] = (regs)->rip; \182182+ (pr_reg)[17] = (regs)->cs; \183183+ (pr_reg)[18] = (regs)->eflags; \184184+ (pr_reg)[19] = (regs)->rsp; \185185+ (pr_reg)[20] = (regs)->ss; \186186+ (pr_reg)[21] = current->thread.fs; \187187+ (pr_reg)[22] = current->thread.gs; \188188+ asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \189189+ asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \190190+ asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \191191+ asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \192192+} while(0);193193+194194+/* I'm not sure if we can use '-' here */195195+#define ELF_PLATFORM ("x86_64")196196+extern void set_personality_64bit(void);197197+extern int vdso_enabled;198198+199199+#endif /* !CONFIG_X86_32 */200200+201201+#define USE_ELF_CORE_DUMP202202+#define ELF_EXEC_PAGESIZE 4096203203+204204+/* This is the location that an ET_DYN program is loaded if exec'ed. Typical205205+ use of this is to invoke "./ld.so someprog" to test out a new version of206206+ the loader. We need to make sure that it is out of the way of the program207207+ that it will "exec", and that there is sufficient room for the brk. */208208+209209+#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)210210+211211+/* This yields a mask that user programs can use to figure out what212212+ instruction set this CPU supports. This could be done in user space,213213+ but it's not easy, and we've already done it here. */214214+215215+#define ELF_HWCAP (boot_cpu_data.x86_capability[0])216216+217217+/* This yields a string that ld.so will use to load implementation218218+ specific libraries for optimization. This is more specific in219219+ intent than poking at uname or /proc/cpuinfo.220220+221221+ For the moment, we have only optimizations for the Intel generations,222222+ but that could change... */223223+224224+#define SET_PERSONALITY(ex, ibcs2) set_personality_64bit()225225+226226+/*227227+ * An executable for which elf_read_implies_exec() returns TRUE will228228+ * have the READ_IMPLIES_EXEC personality flag set automatically.229229+ */230230+#define elf_read_implies_exec(ex, executable_stack) \231231+ (executable_stack != EXSTACK_DISABLE_X)232232+233233+struct task_struct;234234+235235+extern int dump_task_regs (struct task_struct *, elf_gregset_t *);236236+extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);237237+238238+#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)239239+#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)240240+241241+#ifdef CONFIG_X86_32242242+extern int dump_task_extended_fpu (struct task_struct *,243243+ struct user_fxsr_struct *);244244+#define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) \245245+ dump_task_extended_fpu(tsk, elf_xfpregs)246246+#define ELF_CORE_XFPREG_TYPE NT_PRXFPREG247247+248248+#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))249249+#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)250250+#define VDSO_PRELINK 0251251+252252+#define VDSO_SYM(x) \253253+ (VDSO_CURRENT_BASE + (unsigned long)(x) - VDSO_PRELINK)254254+255255+#define VDSO_HIGH_EHDR ((const struct elfhdr *) VDSO_HIGH_BASE)256256+#define VDSO_EHDR ((const struct elfhdr *) VDSO_CURRENT_BASE)257257+258258+extern void __kernel_vsyscall;259259+260260+#define VDSO_ENTRY VDSO_SYM(&__kernel_vsyscall)261261+262262+/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */263263+264264+#define ARCH_DLINFO \265265+do if (vdso_enabled) { \266266+ NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \267267+ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \268268+} while (0)269269+270270+#else /* CONFIG_X86_32 */271271+272272+/* 1GB for 64bit, 8MB for 32bit */273273+#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)274274+275275+#define ARCH_DLINFO \276276+do if (vdso_enabled) { \277277+ NEW_AUX_ENT(AT_SYSINFO_EHDR,(unsigned long)current->mm->context.vdso);\278278+} while (0)279279+280280+#endif /* !CONFIG_X86_32 */281281+282282+struct linux_binprm;283283+284284+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1285285+extern int arch_setup_additional_pages(struct linux_binprm *bprm,286286+ int executable_stack);287287+288288+#endif /* __KERNEL__ */289289+13290#endif
-165
include/asm-x86/elf_32.h
···11-#ifndef __ASMi386_ELF_H22-#define __ASMi386_ELF_H33-44-/*55- * ELF register definitions..66- */77-88-#include <asm/ptrace.h>99-#include <asm/user.h>1010-#include <asm/auxvec.h>1111-1212-#define R_386_NONE 01313-#define R_386_32 11414-#define R_386_PC32 21515-#define R_386_GOT32 31616-#define R_386_PLT32 41717-#define R_386_COPY 51818-#define R_386_GLOB_DAT 61919-#define R_386_JMP_SLOT 72020-#define R_386_RELATIVE 82121-#define R_386_GOTOFF 92222-#define R_386_GOTPC 102323-#define R_386_NUM 112424-2525-typedef unsigned long elf_greg_t;2626-2727-#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))2828-typedef elf_greg_t elf_gregset_t[ELF_NGREG];2929-3030-typedef struct user_i387_struct elf_fpregset_t;3131-typedef struct user_fxsr_struct elf_fpxregset_t;3232-3333-/*3434- * This is used to ensure we don't load something for the wrong architecture.3535- */3636-#define elf_check_arch(x) \3737- (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))3838-3939-/*4040- * These are used to set parameters in the core dumps.4141- */4242-#define ELF_CLASS ELFCLASS324343-#define ELF_DATA ELFDATA2LSB4444-#define ELF_ARCH EM_3864545-4646-#ifdef __KERNEL__4747-4848-#include <asm/processor.h>4949-#include <asm/system.h> /* for savesegment */5050-#include <asm/desc.h>5151-5252-/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx5353- contains a pointer to a function which might be registered using `atexit'.5454- This provides a mean for the dynamic linker to call DT_FINI functions for5555- shared libraries that have been loaded before the code runs.5656-5757- A value of 0 tells we have no such handler. 5858-5959- We might as well make sure everything else is cleared too (except for %esp),6060- just to make things more deterministic.6161- */6262-#define ELF_PLAT_INIT(_r, load_addr) do { \6363- _r->ebx = 0; _r->ecx = 0; _r->edx = 0; \6464- _r->esi = 0; _r->edi = 0; _r->ebp = 0; \6565- _r->eax = 0; \6666-} while (0)6767-6868-#define USE_ELF_CORE_DUMP6969-#define ELF_EXEC_PAGESIZE 40967070-7171-/* This is the location that an ET_DYN program is loaded if exec'ed. Typical7272- use of this is to invoke "./ld.so someprog" to test out a new version of7373- the loader. We need to make sure that it is out of the way of the program7474- that it will "exec", and that there is sufficient room for the brk. */7575-7676-#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)7777-7878-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is7979- now struct_user_regs, they are different) */8080-8181-#define ELF_CORE_COPY_REGS(pr_reg, regs) \8282- pr_reg[0] = regs->ebx; \8383- pr_reg[1] = regs->ecx; \8484- pr_reg[2] = regs->edx; \8585- pr_reg[3] = regs->esi; \8686- pr_reg[4] = regs->edi; \8787- pr_reg[5] = regs->ebp; \8888- pr_reg[6] = regs->eax; \8989- pr_reg[7] = regs->xds & 0xffff; \9090- pr_reg[8] = regs->xes & 0xffff; \9191- pr_reg[9] = regs->xfs & 0xffff; \9292- savesegment(gs,pr_reg[10]); \9393- pr_reg[11] = regs->orig_eax; \9494- pr_reg[12] = regs->eip; \9595- pr_reg[13] = regs->xcs & 0xffff; \9696- pr_reg[14] = regs->eflags; \9797- pr_reg[15] = regs->esp; \9898- pr_reg[16] = regs->xss & 0xffff;9999-100100-/* This yields a mask that user programs can use to figure out what101101- instruction set this CPU supports. This could be done in user space,102102- but it's not easy, and we've already done it here. */103103-104104-#define ELF_HWCAP (boot_cpu_data.x86_capability[0])105105-106106-/* This yields a string that ld.so will use to load implementation107107- specific libraries for optimization. This is more specific in108108- intent than poking at uname or /proc/cpuinfo.109109-110110- For the moment, we have only optimizations for the Intel generations,111111- but that could change... */112112-113113-#define ELF_PLATFORM (utsname()->machine)114114-115115-#define SET_PERSONALITY(ex, ibcs2) do { } while (0)116116-117117-/*118118- * An executable for which elf_read_implies_exec() returns TRUE will119119- * have the READ_IMPLIES_EXEC personality flag set automatically.120120- */121121-#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X)122122-123123-struct task_struct;124124-125125-extern int dump_task_regs (struct task_struct *, elf_gregset_t *);126126-extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);127127-extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct *);128128-129129-#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)130130-#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)131131-#define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) dump_task_extended_fpu(tsk, elf_xfpregs)132132-#define ELF_CORE_XFPREG_TYPE NT_PRXFPREG133133-134134-#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))135135-#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)136136-#define VDSO_PRELINK 0137137-138138-#define VDSO_SYM(x) \139139- (VDSO_CURRENT_BASE + (unsigned long)(x) - VDSO_PRELINK)140140-141141-#define VDSO_HIGH_EHDR ((const struct elfhdr *) VDSO_HIGH_BASE)142142-#define VDSO_EHDR ((const struct elfhdr *) VDSO_CURRENT_BASE)143143-144144-extern void __kernel_vsyscall;145145-146146-#define VDSO_ENTRY VDSO_SYM(&__kernel_vsyscall)147147-148148-struct linux_binprm;149149-150150-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES151151-extern int arch_setup_additional_pages(struct linux_binprm *bprm,152152- int executable_stack);153153-154154-extern unsigned int vdso_enabled;155155-156156-/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */157157-#define ARCH_DLINFO \158158-do if (vdso_enabled) { \159159- NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \160160- NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \161161-} while (0)162162-163163-#endif164164-165165-#endif
-180
include/asm-x86/elf_64.h
···11-#ifndef __ASM_X86_64_ELF_H22-#define __ASM_X86_64_ELF_H33-44-/*55- * ELF register definitions..66- */77-88-#include <asm/ptrace.h>99-#include <asm/user.h>1010-1111-/* x86-64 relocation types */1212-#define R_X86_64_NONE 0 /* No reloc */1313-#define R_X86_64_64 1 /* Direct 64 bit */1414-#define R_X86_64_PC32 2 /* PC relative 32 bit signed */1515-#define R_X86_64_GOT32 3 /* 32 bit GOT entry */1616-#define R_X86_64_PLT32 4 /* 32 bit PLT address */1717-#define R_X86_64_COPY 5 /* Copy symbol at runtime */1818-#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */1919-#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */2020-#define R_X86_64_RELATIVE 8 /* Adjust by program base */2121-#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative2222- offset to GOT */2323-#define R_X86_64_32 10 /* Direct 32 bit zero extended */2424-#define R_X86_64_32S 11 /* Direct 32 bit sign extended */2525-#define R_X86_64_16 12 /* Direct 16 bit zero extended */2626-#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */2727-#define R_X86_64_8 14 /* Direct 8 bit sign extended */2828-#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */2929-3030-#define R_X86_64_NUM 163131-3232-typedef unsigned long elf_greg_t;3333-3434-#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))3535-typedef elf_greg_t elf_gregset_t[ELF_NGREG];3636-3737-typedef struct user_i387_struct elf_fpregset_t;3838-3939-/*4040- * These are used to set parameters in the core dumps.4141- */4242-#define ELF_CLASS ELFCLASS644343-#define ELF_DATA ELFDATA2LSB4444-#define ELF_ARCH EM_X86_644545-4646-#ifdef __KERNEL__4747-#include <asm/processor.h>4848-4949-/*5050- * This is used to ensure we don't load something for the wrong architecture.5151- */5252-#define elf_check_arch(x) \5353- ((x)->e_machine == EM_X86_64)5454-5555-5656-/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx5757- contains a pointer to a function which might be registered using `atexit'.5858- This provides a mean for the dynamic linker to call DT_FINI functions for5959- shared libraries that have been loaded before the code runs.6060-6161- A value of 0 tells we have no such handler. 6262-6363- We might as well make sure everything else is cleared too (except for %esp),6464- just to make things more deterministic.6565- */6666-#define ELF_PLAT_INIT(_r, load_addr) do { \6767- struct task_struct *cur = current; \6868- (_r)->rbx = 0; (_r)->rcx = 0; (_r)->rdx = 0; \6969- (_r)->rsi = 0; (_r)->rdi = 0; (_r)->rbp = 0; \7070- (_r)->rax = 0; \7171- (_r)->r8 = 0; \7272- (_r)->r9 = 0; \7373- (_r)->r10 = 0; \7474- (_r)->r11 = 0; \7575- (_r)->r12 = 0; \7676- (_r)->r13 = 0; \7777- (_r)->r14 = 0; \7878- (_r)->r15 = 0; \7979- cur->thread.fs = 0; cur->thread.gs = 0; \8080- cur->thread.fsindex = 0; cur->thread.gsindex = 0; \8181- cur->thread.ds = 0; cur->thread.es = 0; \8282- clear_thread_flag(TIF_IA32); \8383-} while (0)8484-8585-#define USE_ELF_CORE_DUMP8686-#define ELF_EXEC_PAGESIZE 40968787-8888-/* This is the location that an ET_DYN program is loaded if exec'ed. Typical8989- use of this is to invoke "./ld.so someprog" to test out a new version of9090- the loader. We need to make sure that it is out of the way of the program9191- that it will "exec", and that there is sufficient room for the brk. */9292-9393-#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)9494-9595-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is9696- now struct_user_regs, they are different). Assumes current is the process9797- getting dumped. */9898-9999-#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \100100- unsigned v; \101101- (pr_reg)[0] = (regs)->r15; \102102- (pr_reg)[1] = (regs)->r14; \103103- (pr_reg)[2] = (regs)->r13; \104104- (pr_reg)[3] = (regs)->r12; \105105- (pr_reg)[4] = (regs)->rbp; \106106- (pr_reg)[5] = (regs)->rbx; \107107- (pr_reg)[6] = (regs)->r11; \108108- (pr_reg)[7] = (regs)->r10; \109109- (pr_reg)[8] = (regs)->r9; \110110- (pr_reg)[9] = (regs)->r8; \111111- (pr_reg)[10] = (regs)->rax; \112112- (pr_reg)[11] = (regs)->rcx; \113113- (pr_reg)[12] = (regs)->rdx; \114114- (pr_reg)[13] = (regs)->rsi; \115115- (pr_reg)[14] = (regs)->rdi; \116116- (pr_reg)[15] = (regs)->orig_rax; \117117- (pr_reg)[16] = (regs)->rip; \118118- (pr_reg)[17] = (regs)->cs; \119119- (pr_reg)[18] = (regs)->eflags; \120120- (pr_reg)[19] = (regs)->rsp; \121121- (pr_reg)[20] = (regs)->ss; \122122- (pr_reg)[21] = current->thread.fs; \123123- (pr_reg)[22] = current->thread.gs; \124124- asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \125125- asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \126126- asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \127127- asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \128128-} while(0);129129-130130-/* This yields a mask that user programs can use to figure out what131131- instruction set this CPU supports. This could be done in user space,132132- but it's not easy, and we've already done it here. */133133-134134-#define ELF_HWCAP (boot_cpu_data.x86_capability[0])135135-136136-/* This yields a string that ld.so will use to load implementation137137- specific libraries for optimization. This is more specific in138138- intent than poking at uname or /proc/cpuinfo.139139-140140- For the moment, we have only optimizations for the Intel generations,141141- but that could change... */142142-143143-/* I'm not sure if we can use '-' here */144144-#define ELF_PLATFORM ("x86_64")145145-146146-extern void set_personality_64bit(void);147147-#define SET_PERSONALITY(ex, ibcs2) set_personality_64bit()148148-/*149149- * An executable for which elf_read_implies_exec() returns TRUE will150150- * have the READ_IMPLIES_EXEC personality flag set automatically.151151- */152152-#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X)153153-154154-struct task_struct;155155-156156-extern int dump_task_regs (struct task_struct *, elf_gregset_t *);157157-extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);158158-159159-#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)160160-#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)161161-162162-/* 1GB for 64bit, 8MB for 32bit */163163-#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)164164-165165-166166-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1167167-struct linux_binprm;168168-extern int arch_setup_additional_pages(struct linux_binprm *bprm,169169- int executable_stack);170170-171171-extern int vdso_enabled;172172-173173-#define ARCH_DLINFO \174174-do if (vdso_enabled) { \175175- NEW_AUX_ENT(AT_SYSINFO_EHDR,(unsigned long)current->mm->context.vdso);\176176-} while (0)177177-178178-#endif179179-180180-#endif