]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4 LT |
2 | #ifndef __ASM_ALPHA_ELF_H |
3 | #define __ASM_ALPHA_ELF_H | |
4 | ||
36d57ac4 | 5 | #include <asm/auxvec.h> |
ec221208 | 6 | #include <asm/special_insns.h> |
36d57ac4 | 7 | |
1da177e4 LT |
8 | /* Special values for the st_other field in the symbol table. */ |
9 | ||
10 | #define STO_ALPHA_NOPV 0x80 | |
11 | #define STO_ALPHA_STD_GPLOAD 0x88 | |
12 | ||
13 | /* | |
14 | * Alpha ELF relocation types | |
15 | */ | |
16 | #define R_ALPHA_NONE 0 /* No reloc */ | |
17 | #define R_ALPHA_REFLONG 1 /* Direct 32 bit */ | |
18 | #define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ | |
19 | #define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ | |
20 | #define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ | |
21 | #define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ | |
22 | #define R_ALPHA_GPDISP 6 /* Add displacement to GP */ | |
23 | #define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ | |
24 | #define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ | |
25 | #define R_ALPHA_SREL16 9 /* PC relative 16 bit */ | |
26 | #define R_ALPHA_SREL32 10 /* PC relative 32 bit */ | |
27 | #define R_ALPHA_SREL64 11 /* PC relative 64 bit */ | |
28 | #define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */ | |
29 | #define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */ | |
30 | #define R_ALPHA_GPREL16 19 /* GP relative 16 bit */ | |
31 | #define R_ALPHA_COPY 24 /* Copy symbol at runtime */ | |
32 | #define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ | |
33 | #define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ | |
34 | #define R_ALPHA_RELATIVE 27 /* Adjust by program base */ | |
35 | #define R_ALPHA_BRSGP 28 | |
36 | #define R_ALPHA_TLSGD 29 | |
37 | #define R_ALPHA_TLS_LDM 30 | |
38 | #define R_ALPHA_DTPMOD64 31 | |
39 | #define R_ALPHA_GOTDTPREL 32 | |
40 | #define R_ALPHA_DTPREL64 33 | |
41 | #define R_ALPHA_DTPRELHI 34 | |
42 | #define R_ALPHA_DTPRELLO 35 | |
43 | #define R_ALPHA_DTPREL16 36 | |
44 | #define R_ALPHA_GOTTPREL 37 | |
45 | #define R_ALPHA_TPREL64 38 | |
46 | #define R_ALPHA_TPRELHI 39 | |
47 | #define R_ALPHA_TPRELLO 40 | |
48 | #define R_ALPHA_TPREL16 41 | |
49 | ||
50 | #define SHF_ALPHA_GPREL 0x10000000 | |
51 | ||
52 | /* Legal values for e_flags field of Elf64_Ehdr. */ | |
53 | ||
54 | #define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */ | |
55 | ||
56 | /* | |
57 | * ELF register definitions.. | |
58 | */ | |
59 | ||
60 | /* | |
61 | * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long. | |
62 | * I have no idea why that is so. For now, we just leave it at 33 | |
63 | * (32 general regs + processor status word). | |
64 | */ | |
65 | #define ELF_NGREG 33 | |
66 | #define ELF_NFPREG 32 | |
67 | ||
68 | typedef unsigned long elf_greg_t; | |
69 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | |
70 | ||
71 | typedef double elf_fpreg_t; | |
72 | typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | |
73 | ||
74 | /* | |
75 | * This is used to ensure we don't load something for the wrong architecture. | |
76 | */ | |
77 | #define elf_check_arch(x) ((x)->e_machine == EM_ALPHA) | |
78 | ||
79 | /* | |
80 | * These are used to set parameters in the core dumps. | |
81 | */ | |
82 | #define ELF_CLASS ELFCLASS64 | |
83 | #define ELF_DATA ELFDATA2LSB | |
84 | #define ELF_ARCH EM_ALPHA | |
85 | ||
1da177e4 LT |
86 | #define ELF_EXEC_PAGESIZE 8192 |
87 | ||
88 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical | |
89 | use of this is to invoke "./ld.so someprog" to test out a new version of | |
90 | the loader. We need to make sure that it is out of the way of the program | |
91 | that it will "exec", and that there is sufficient room for the brk. */ | |
92 | ||
93 | #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) | |
94 | ||
95 | /* $0 is set by ld.so to a pointer to a function which might be | |
96 | registered using atexit. This provides a mean for the dynamic | |
97 | linker to call DT_FINI functions for shared libraries that have | |
98 | been loaded before the code runs. | |
99 | ||
100 | So that we can use the same startup file with static executables, | |
101 | we start programs with a value of 0 to indicate that there is no | |
102 | such function. */ | |
103 | ||
104 | #define ELF_PLAT_INIT(_r, load_addr) _r->r0 = 0 | |
105 | ||
25985edc | 106 | /* The registers are laid out in pt_regs for PAL and syscall |
1da177e4 LT |
107 | convenience. Re-order them for the linear elf_gregset_t. */ |
108 | ||
109 | struct pt_regs; | |
110 | struct thread_info; | |
111 | struct task_struct; | |
112 | extern void dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, | |
113 | struct thread_info *ti); | |
114 | #define ELF_CORE_COPY_REGS(DEST, REGS) \ | |
115 | dump_elf_thread(DEST, REGS, current_thread_info()); | |
116 | ||
117 | /* Similar, but for a thread other than current. */ | |
118 | ||
119 | extern int dump_elf_task(elf_greg_t *dest, struct task_struct *task); | |
120 | #define ELF_CORE_COPY_TASK_REGS(TASK, DEST) \ | |
121 | dump_elf_task(*(DEST), TASK) | |
122 | ||
123 | /* Similar, but for the FP registers. */ | |
124 | ||
125 | extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task); | |
126 | #define ELF_CORE_COPY_FPREGS(TASK, DEST) \ | |
127 | dump_elf_task_fp(*(DEST), TASK) | |
128 | ||
129 | /* This yields a mask that user programs can use to figure out what | |
130 | instruction set this CPU supports. This is trivial on Alpha, | |
131 | but not so on other machines. */ | |
132 | ||
133 | #define ELF_HWCAP (~amask(-1)) | |
134 | ||
135 | /* This yields a string that ld.so will use to load implementation | |
136 | specific libraries for optimization. This is more specific in | |
137 | intent than poking at uname or /proc/cpuinfo. */ | |
138 | ||
139 | #define ELF_PLATFORM \ | |
140 | ({ \ | |
141 | enum implver_enum i_ = implver(); \ | |
142 | ( i_ == IMPLVER_EV4 ? "ev4" \ | |
143 | : i_ == IMPLVER_EV5 \ | |
144 | ? (amask(AMASK_BWX) ? "ev5" : "ev56") \ | |
145 | : amask (AMASK_CIX) ? "ev6" : "ev67"); \ | |
146 | }) | |
147 | ||
0b592682 | 148 | #define SET_PERSONALITY(EX) \ |
1da177e4 | 149 | set_personality(((EX).e_flags & EF_ALPHA_32BIT) \ |
0b592682 | 150 | ? PER_LINUX_32BIT : PER_LINUX) |
1da177e4 LT |
151 | |
152 | extern int alpha_l1i_cacheshape; | |
153 | extern int alpha_l1d_cacheshape; | |
154 | extern int alpha_l2_cacheshape; | |
155 | extern int alpha_l3_cacheshape; | |
156 | ||
4f9a58d7 | 157 | /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ |
1da177e4 LT |
158 | #define ARCH_DLINFO \ |
159 | do { \ | |
160 | NEW_AUX_ENT(AT_L1I_CACHESHAPE, alpha_l1i_cacheshape); \ | |
161 | NEW_AUX_ENT(AT_L1D_CACHESHAPE, alpha_l1d_cacheshape); \ | |
162 | NEW_AUX_ENT(AT_L2_CACHESHAPE, alpha_l2_cacheshape); \ | |
163 | NEW_AUX_ENT(AT_L3_CACHESHAPE, alpha_l3_cacheshape); \ | |
164 | } while (0) | |
165 | ||
1da177e4 | 166 | #endif /* __ASM_ALPHA_ELF_H */ |