Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
0003  * Licensed under the GPL
0004  */
0005 #ifndef __UM_ELF_X86_H
0006 #define __UM_ELF_X86_H
0007 
0008 #include <asm/user.h>
0009 #include <skas.h>
0010 
0011 #ifdef CONFIG_X86_32
0012 
0013 #define R_386_NONE  0
0014 #define R_386_32    1
0015 #define R_386_PC32  2
0016 #define R_386_GOT32 3
0017 #define R_386_PLT32 4
0018 #define R_386_COPY  5
0019 #define R_386_GLOB_DAT  6
0020 #define R_386_JMP_SLOT  7
0021 #define R_386_RELATIVE  8
0022 #define R_386_GOTOFF    9
0023 #define R_386_GOTPC 10
0024 #define R_386_NUM   11
0025 
0026 /*
0027  * This is used to ensure we don't load something for the wrong architecture.
0028  */
0029 #define elf_check_arch(x) \
0030     (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
0031 
0032 #define ELF_CLASS   ELFCLASS32
0033 #define ELF_DATA        ELFDATA2LSB
0034 #define ELF_ARCH        EM_386
0035 
0036 #define ELF_PLAT_INIT(regs, load_addr) do { \
0037     PT_REGS_BX(regs) = 0; \
0038     PT_REGS_CX(regs) = 0; \
0039     PT_REGS_DX(regs) = 0; \
0040     PT_REGS_SI(regs) = 0; \
0041     PT_REGS_DI(regs) = 0; \
0042     PT_REGS_BP(regs) = 0; \
0043     PT_REGS_AX(regs) = 0; \
0044 } while (0)
0045 
0046 /* Shamelessly stolen from include/asm-i386/elf.h */
0047 
0048 #define ELF_CORE_COPY_REGS(pr_reg, regs) do {   \
0049     pr_reg[0] = PT_REGS_BX(regs);       \
0050     pr_reg[1] = PT_REGS_CX(regs);       \
0051     pr_reg[2] = PT_REGS_DX(regs);       \
0052     pr_reg[3] = PT_REGS_SI(regs);       \
0053     pr_reg[4] = PT_REGS_DI(regs);       \
0054     pr_reg[5] = PT_REGS_BP(regs);       \
0055     pr_reg[6] = PT_REGS_AX(regs);       \
0056     pr_reg[7] = PT_REGS_DS(regs);       \
0057     pr_reg[8] = PT_REGS_ES(regs);       \
0058     /* fake once used fs and gs selectors? */   \
0059     pr_reg[9] = PT_REGS_DS(regs);       \
0060     pr_reg[10] = PT_REGS_DS(regs);      \
0061     pr_reg[11] = PT_REGS_SYSCALL_NR(regs);  \
0062     pr_reg[12] = PT_REGS_IP(regs);      \
0063     pr_reg[13] = PT_REGS_CS(regs);      \
0064     pr_reg[14] = PT_REGS_EFLAGS(regs);  \
0065     pr_reg[15] = PT_REGS_SP(regs);      \
0066     pr_reg[16] = PT_REGS_SS(regs);      \
0067 } while (0);
0068 
0069 extern char * elf_aux_platform;
0070 #define ELF_PLATFORM (elf_aux_platform)
0071 
0072 extern unsigned long vsyscall_ehdr;
0073 extern unsigned long vsyscall_end;
0074 extern unsigned long __kernel_vsyscall;
0075 
0076 /*
0077  * This is the range that is readable by user mode, and things
0078  * acting like user mode such as get_user_pages.
0079  */
0080 #define FIXADDR_USER_START      vsyscall_ehdr
0081 #define FIXADDR_USER_END        vsyscall_end
0082 
0083 
0084 /*
0085  * Architecture-neutral AT_ values in 0-17, leave some room
0086  * for more of them, start the x86-specific ones at 32.
0087  */
0088 #define AT_SYSINFO      32
0089 #define AT_SYSINFO_EHDR     33
0090 
0091 #define ARCH_DLINFO                     \
0092 do {                                \
0093     if ( vsyscall_ehdr ) {                  \
0094         NEW_AUX_ENT(AT_SYSINFO, __kernel_vsyscall); \
0095         NEW_AUX_ENT(AT_SYSINFO_EHDR, vsyscall_ehdr);    \
0096     }                           \
0097 } while (0)
0098 
0099 #else
0100 
0101 /* x86-64 relocation types, taken from asm-x86_64/elf.h */
0102 #define R_X86_64_NONE       0   /* No reloc */
0103 #define R_X86_64_64     1   /* Direct 64 bit  */
0104 #define R_X86_64_PC32       2   /* PC relative 32 bit signed */
0105 #define R_X86_64_GOT32      3   /* 32 bit GOT entry */
0106 #define R_X86_64_PLT32      4   /* 32 bit PLT address */
0107 #define R_X86_64_COPY       5   /* Copy symbol at runtime */
0108 #define R_X86_64_GLOB_DAT   6   /* Create GOT entry */
0109 #define R_X86_64_JUMP_SLOT  7   /* Create PLT entry */
0110 #define R_X86_64_RELATIVE   8   /* Adjust by program base */
0111 #define R_X86_64_GOTPCREL   9   /* 32 bit signed pc relative
0112                        offset to GOT */
0113 #define R_X86_64_32     10  /* Direct 32 bit zero extended */
0114 #define R_X86_64_32S        11  /* Direct 32 bit sign extended */
0115 #define R_X86_64_16     12  /* Direct 16 bit zero extended */
0116 #define R_X86_64_PC16       13  /* 16 bit sign extended pc relative */
0117 #define R_X86_64_8      14  /* Direct 8 bit sign extended  */
0118 #define R_X86_64_PC8        15  /* 8 bit sign extended pc relative */
0119 #define R_X86_64_PC64       24  /* Place relative 64-bit signed */
0120 
0121 /*
0122  * This is used to ensure we don't load something for the wrong architecture.
0123  */
0124 #define elf_check_arch(x) \
0125     ((x)->e_machine == EM_X86_64)
0126 
0127 #define ELF_CLASS   ELFCLASS64
0128 #define ELF_DATA        ELFDATA2LSB
0129 #define ELF_ARCH        EM_X86_64
0130 
0131 #define ELF_PLAT_INIT(regs, load_addr)    do { \
0132     PT_REGS_BX(regs) = 0; \
0133     PT_REGS_CX(regs) = 0; \
0134     PT_REGS_DX(regs) = 0; \
0135     PT_REGS_SI(regs) = 0; \
0136     PT_REGS_DI(regs) = 0; \
0137     PT_REGS_BP(regs) = 0; \
0138     PT_REGS_AX(regs) = 0; \
0139     PT_REGS_R8(regs) = 0; \
0140     PT_REGS_R9(regs) = 0; \
0141     PT_REGS_R10(regs) = 0; \
0142     PT_REGS_R11(regs) = 0; \
0143     PT_REGS_R12(regs) = 0; \
0144     PT_REGS_R13(regs) = 0; \
0145     PT_REGS_R14(regs) = 0; \
0146     PT_REGS_R15(regs) = 0; \
0147 } while (0)
0148 
0149 #define ELF_CORE_COPY_REGS(pr_reg, _regs)       \
0150     (pr_reg)[0] = (_regs)->regs.gp[0];          \
0151     (pr_reg)[1] = (_regs)->regs.gp[1];          \
0152     (pr_reg)[2] = (_regs)->regs.gp[2];          \
0153     (pr_reg)[3] = (_regs)->regs.gp[3];          \
0154     (pr_reg)[4] = (_regs)->regs.gp[4];          \
0155     (pr_reg)[5] = (_regs)->regs.gp[5];          \
0156     (pr_reg)[6] = (_regs)->regs.gp[6];          \
0157     (pr_reg)[7] = (_regs)->regs.gp[7];          \
0158     (pr_reg)[8] = (_regs)->regs.gp[8];          \
0159     (pr_reg)[9] = (_regs)->regs.gp[9];          \
0160     (pr_reg)[10] = (_regs)->regs.gp[10];            \
0161     (pr_reg)[11] = (_regs)->regs.gp[11];            \
0162     (pr_reg)[12] = (_regs)->regs.gp[12];            \
0163     (pr_reg)[13] = (_regs)->regs.gp[13];            \
0164     (pr_reg)[14] = (_regs)->regs.gp[14];            \
0165     (pr_reg)[15] = (_regs)->regs.gp[15];            \
0166     (pr_reg)[16] = (_regs)->regs.gp[16];            \
0167     (pr_reg)[17] = (_regs)->regs.gp[17];            \
0168     (pr_reg)[18] = (_regs)->regs.gp[18];            \
0169     (pr_reg)[19] = (_regs)->regs.gp[19];            \
0170     (pr_reg)[20] = (_regs)->regs.gp[20];            \
0171     (pr_reg)[21] = current->thread.arch.fs;         \
0172     (pr_reg)[22] = 0;                   \
0173     (pr_reg)[23] = 0;                   \
0174     (pr_reg)[24] = 0;                   \
0175     (pr_reg)[25] = 0;                   \
0176     (pr_reg)[26] = 0;
0177 
0178 #define ELF_PLATFORM "x86_64"
0179 
0180 /* No user-accessible fixmap addresses, i.e. vsyscall */
0181 #define FIXADDR_USER_START      0
0182 #define FIXADDR_USER_END        0
0183 
0184 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
0185 struct linux_binprm;
0186 extern int arch_setup_additional_pages(struct linux_binprm *bprm,
0187     int uses_interp);
0188 
0189 extern unsigned long um_vdso_addr;
0190 #define AT_SYSINFO_EHDR 33
0191 #define ARCH_DLINFO NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr)
0192 
0193 #endif
0194 
0195 typedef unsigned long elf_greg_t;
0196 
0197 #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
0198 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
0199 
0200 typedef struct user_i387_struct elf_fpregset_t;
0201 
0202 struct task_struct;
0203 
0204 extern int elf_core_copy_fpregs(struct task_struct *t, elf_fpregset_t *fpu);
0205 
0206 #define ELF_CORE_COPY_FPREGS(t, fpu) elf_core_copy_fpregs(t, fpu)
0207 
0208 #define ELF_EXEC_PAGESIZE 4096
0209 
0210 #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
0211 
0212 extern long elf_aux_hwcap;
0213 #define ELF_HWCAP (elf_aux_hwcap)
0214 
0215 #define SET_PERSONALITY(ex) do {} while(0)
0216 
0217 #endif