diff options
Diffstat (limited to 'include/asm-sh/elf.h')
-rw-r--r-- | include/asm-sh/elf.h | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/include/asm-sh/elf.h b/include/asm-sh/elf.h index 12cc4b392bf0..05092da1aa59 100644 --- a/include/asm-sh/elf.h +++ b/include/asm-sh/elf.h | |||
@@ -5,7 +5,7 @@ | |||
5 | #include <asm/ptrace.h> | 5 | #include <asm/ptrace.h> |
6 | #include <asm/user.h> | 6 | #include <asm/user.h> |
7 | 7 | ||
8 | /* SH relocation types */ | 8 | /* SH (particularly SHcompact) relocation types */ |
9 | #define R_SH_NONE 0 | 9 | #define R_SH_NONE 0 |
10 | #define R_SH_DIR32 1 | 10 | #define R_SH_DIR32 1 |
11 | #define R_SH_REL32 2 | 11 | #define R_SH_REL32 2 |
@@ -43,6 +43,11 @@ | |||
43 | #define R_SH_RELATIVE 165 | 43 | #define R_SH_RELATIVE 165 |
44 | #define R_SH_GOTOFF 166 | 44 | #define R_SH_GOTOFF 166 |
45 | #define R_SH_GOTPC 167 | 45 | #define R_SH_GOTPC 167 |
46 | /* SHmedia relocs */ | ||
47 | #define R_SH_IMM_LOW16 246 | ||
48 | #define R_SH_IMM_LOW16_PCREL 247 | ||
49 | #define R_SH_IMM_MEDLOW16 248 | ||
50 | #define R_SH_IMM_MEDLOW16_PCREL 249 | ||
46 | /* Keep this the last entry. */ | 51 | /* Keep this the last entry. */ |
47 | #define R_SH_NUM 256 | 52 | #define R_SH_NUM 256 |
48 | 53 | ||
@@ -58,11 +63,6 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | |||
58 | typedef struct user_fpu_struct elf_fpregset_t; | 63 | typedef struct user_fpu_struct elf_fpregset_t; |
59 | 64 | ||
60 | /* | 65 | /* |
61 | * This is used to ensure we don't load something for the wrong architecture. | ||
62 | */ | ||
63 | #define elf_check_arch(x) ( (x)->e_machine == EM_SH ) | ||
64 | |||
65 | /* | ||
66 | * These are used to set parameters in the core dumps. | 66 | * These are used to set parameters in the core dumps. |
67 | */ | 67 | */ |
68 | #define ELF_CLASS ELFCLASS32 | 68 | #define ELF_CLASS ELFCLASS32 |
@@ -73,6 +73,12 @@ typedef struct user_fpu_struct elf_fpregset_t; | |||
73 | #endif | 73 | #endif |
74 | #define ELF_ARCH EM_SH | 74 | #define ELF_ARCH EM_SH |
75 | 75 | ||
76 | #ifdef __KERNEL__ | ||
77 | /* | ||
78 | * This is used to ensure we don't load something for the wrong architecture. | ||
79 | */ | ||
80 | #define elf_check_arch(x) ( (x)->e_machine == EM_SH ) | ||
81 | |||
76 | #define USE_ELF_CORE_DUMP | 82 | #define USE_ELF_CORE_DUMP |
77 | #define ELF_EXEC_PAGESIZE PAGE_SIZE | 83 | #define ELF_EXEC_PAGESIZE PAGE_SIZE |
78 | 84 | ||
@@ -83,7 +89,6 @@ typedef struct user_fpu_struct elf_fpregset_t; | |||
83 | 89 | ||
84 | #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | 90 | #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) |
85 | 91 | ||
86 | |||
87 | #define ELF_CORE_COPY_REGS(_dest,_regs) \ | 92 | #define ELF_CORE_COPY_REGS(_dest,_regs) \ |
88 | memcpy((char *) &_dest, (char *) _regs, \ | 93 | memcpy((char *) &_dest, (char *) _regs, \ |
89 | sizeof(struct pt_regs)); | 94 | sizeof(struct pt_regs)); |
@@ -101,16 +106,38 @@ typedef struct user_fpu_struct elf_fpregset_t; | |||
101 | For the moment, we have only optimizations for the Intel generations, | 106 | For the moment, we have only optimizations for the Intel generations, |
102 | but that could change... */ | 107 | but that could change... */ |
103 | 108 | ||
104 | #define ELF_PLATFORM (NULL) | 109 | #define ELF_PLATFORM (utsname()->machine) |
105 | 110 | ||
111 | #ifdef __SH5__ | ||
112 | #define ELF_PLAT_INIT(_r, load_addr) \ | ||
113 | do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \ | ||
114 | _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \ | ||
115 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ | ||
116 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; _r->regs[15]=0; \ | ||
117 | _r->regs[16]=0; _r->regs[17]=0; _r->regs[18]=0; _r->regs[19]=0; \ | ||
118 | _r->regs[20]=0; _r->regs[21]=0; _r->regs[22]=0; _r->regs[23]=0; \ | ||
119 | _r->regs[24]=0; _r->regs[25]=0; _r->regs[26]=0; _r->regs[27]=0; \ | ||
120 | _r->regs[28]=0; _r->regs[29]=0; _r->regs[30]=0; _r->regs[31]=0; \ | ||
121 | _r->regs[32]=0; _r->regs[33]=0; _r->regs[34]=0; _r->regs[35]=0; \ | ||
122 | _r->regs[36]=0; _r->regs[37]=0; _r->regs[38]=0; _r->regs[39]=0; \ | ||
123 | _r->regs[40]=0; _r->regs[41]=0; _r->regs[42]=0; _r->regs[43]=0; \ | ||
124 | _r->regs[44]=0; _r->regs[45]=0; _r->regs[46]=0; _r->regs[47]=0; \ | ||
125 | _r->regs[48]=0; _r->regs[49]=0; _r->regs[50]=0; _r->regs[51]=0; \ | ||
126 | _r->regs[52]=0; _r->regs[53]=0; _r->regs[54]=0; _r->regs[55]=0; \ | ||
127 | _r->regs[56]=0; _r->regs[57]=0; _r->regs[58]=0; _r->regs[59]=0; \ | ||
128 | _r->regs[60]=0; _r->regs[61]=0; _r->regs[62]=0; \ | ||
129 | _r->tregs[0]=0; _r->tregs[1]=0; _r->tregs[2]=0; _r->tregs[3]=0; \ | ||
130 | _r->tregs[4]=0; _r->tregs[5]=0; _r->tregs[6]=0; _r->tregs[7]=0; \ | ||
131 | _r->sr = SR_FD | SR_MMU; } while (0) | ||
132 | #else | ||
106 | #define ELF_PLAT_INIT(_r, load_addr) \ | 133 | #define ELF_PLAT_INIT(_r, load_addr) \ |
107 | do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \ | 134 | do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \ |
108 | _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \ | 135 | _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \ |
109 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ | 136 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ |
110 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ | 137 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ |
111 | _r->sr = SR_FD; } while (0) | 138 | _r->sr = SR_FD; } while (0) |
139 | #endif | ||
112 | 140 | ||
113 | #ifdef __KERNEL__ | ||
114 | #define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT) | 141 | #define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT) |
115 | struct task_struct; | 142 | struct task_struct; |
116 | extern int dump_task_regs (struct task_struct *, elf_gregset_t *); | 143 | extern int dump_task_regs (struct task_struct *, elf_gregset_t *); |
@@ -118,7 +145,6 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); | |||
118 | 145 | ||
119 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) | 146 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) |
120 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) | 147 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) |
121 | #endif | ||
122 | 148 | ||
123 | #ifdef CONFIG_VSYSCALL | 149 | #ifdef CONFIG_VSYSCALL |
124 | /* vDSO has arch_setup_additional_pages */ | 150 | /* vDSO has arch_setup_additional_pages */ |
@@ -133,12 +159,35 @@ extern void __kernel_vsyscall; | |||
133 | #define VDSO_BASE ((unsigned long)current->mm->context.vdso) | 159 | #define VDSO_BASE ((unsigned long)current->mm->context.vdso) |
134 | #define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x)) | 160 | #define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x)) |
135 | 161 | ||
162 | #define VSYSCALL_AUX_ENT \ | ||
163 | if (vdso_enabled) \ | ||
164 | NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); | ||
165 | #else | ||
166 | #define VSYSCALL_AUX_ENT | ||
167 | #endif /* CONFIG_VSYSCALL */ | ||
168 | |||
169 | #ifdef CONFIG_SH_FPU | ||
170 | #define FPU_AUX_ENT NEW_AUX_ENT(AT_FPUCW, FPSCR_INIT) | ||
171 | #else | ||
172 | #define FPU_AUX_ENT | ||
173 | #endif | ||
174 | |||
175 | extern int l1i_cache_shape, l1d_cache_shape, l2_cache_shape; | ||
176 | |||
136 | /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ | 177 | /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ |
137 | #define ARCH_DLINFO \ | 178 | #define ARCH_DLINFO \ |
138 | do { \ | 179 | do { \ |
139 | if (vdso_enabled) \ | 180 | /* Optional FPU initialization */ \ |
140 | NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); \ | 181 | FPU_AUX_ENT; \ |
182 | \ | ||
183 | /* Optional vsyscall entry */ \ | ||
184 | VSYSCALL_AUX_ENT; \ | ||
185 | \ | ||
186 | /* Cache desc */ \ | ||
187 | NEW_AUX_ENT(AT_L1I_CACHESHAPE, l1i_cache_shape); \ | ||
188 | NEW_AUX_ENT(AT_L1D_CACHESHAPE, l1d_cache_shape); \ | ||
189 | NEW_AUX_ENT(AT_L2_CACHESHAPE, l2_cache_shape); \ | ||
141 | } while (0) | 190 | } while (0) |
142 | #endif /* CONFIG_VSYSCALL */ | ||
143 | 191 | ||
192 | #endif /* __KERNEL__ */ | ||
144 | #endif /* __ASM_SH_ELF_H */ | 193 | #endif /* __ASM_SH_ELF_H */ |