/src/binutils-gdb/include/elf/sparc.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* SPARC ELF support for BFD. |
2 | | Copyright (C) 1996-2025 Free Software Foundation, Inc. |
3 | | By Doug Evans, Cygnus Support, <dje@cygnus.com>. |
4 | | |
5 | | This file is part of BFD, the Binary File Descriptor library. |
6 | | |
7 | | This program is free software; you can redistribute it and/or modify |
8 | | it under the terms of the GNU General Public License as published by |
9 | | the Free Software Foundation; either version 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program is distributed in the hope that it will be useful, |
13 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | GNU General Public License for more details. |
16 | | |
17 | | You should have received a copy of the GNU General Public License |
18 | | along with this program; if not, write to the Free Software |
19 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 | | MA 02110-1301, USA. */ |
21 | | |
22 | | #ifndef _ELF_SPARC_H |
23 | | #define _ELF_SPARC_H |
24 | | |
25 | | /* Processor specific flags for the ELF header e_flags field. */ |
26 | | |
27 | | /* These are defined by Sun. */ |
28 | | |
29 | 0 | #define EF_SPARC_32PLUS_MASK 0xffff00 /* bits indicating V8+ type */ |
30 | 8.52k | #define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ |
31 | 19.9k | #define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ |
32 | 3.12k | #define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ |
33 | 29.6k | #define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ |
34 | | |
35 | 10.7k | #define EF_SPARC_LEDATA 0x800000 /* little endian data */ |
36 | | |
37 | | /* This name is used in the V9 ABI. */ |
38 | | #define EF_SPARC_EXT_MASK 0xffff00 /* reserved for vendor extensions */ |
39 | | |
40 | | /* V9 memory models */ |
41 | 9.36k | #define EF_SPARCV9_MM 0x3 /* memory model mask */ |
42 | 3.12k | #define EF_SPARCV9_TSO 0x0 /* total store ordering */ |
43 | 3.12k | #define EF_SPARCV9_PSO 0x1 /* partial store ordering */ |
44 | 3.12k | #define EF_SPARCV9_RMO 0x2 /* relaxed store ordering */ |
45 | | |
46 | | /* Section indices. */ |
47 | | |
48 | 140k | #define SHN_BEFORE SHN_LORESERVE /* Used with SHF_ORDERED and... */ |
49 | 140k | #define SHN_AFTER (SHN_LORESERVE + 1) /* SHF_LINK_ORDER section flags. */ |
50 | | |
51 | | /* Section flags. */ |
52 | | |
53 | 0 | #define SHF_ORDERED 0x40000000 /* treat sh_link,sh_info specially */ |
54 | | |
55 | | /* Symbol types. */ |
56 | | |
57 | 864 | #define STT_REGISTER 13 /* global reg reserved to app. */ |
58 | | |
59 | | #include "elf/reloc-macros.h" |
60 | | |
61 | | /* Relocation types. */ |
62 | 110k | START_RELOC_NUMBERS (elf_sparc_reloc_type) |
63 | 110k | RELOC_NUMBER (R_SPARC_NONE, 0) |
64 | 1.49k | RELOC_NUMBER (R_SPARC_8, 1) |
65 | 1.51k | RELOC_NUMBER (R_SPARC_16, 2) |
66 | 1.24k | RELOC_NUMBER (R_SPARC_32, 3) |
67 | 1.08k | RELOC_NUMBER (R_SPARC_DISP8, 4) |
68 | 984 | RELOC_NUMBER (R_SPARC_DISP16, 5) |
69 | 602 | RELOC_NUMBER (R_SPARC_DISP32, 6) |
70 | 658 | RELOC_NUMBER (R_SPARC_WDISP30, 7) |
71 | 1.75k | RELOC_NUMBER (R_SPARC_WDISP22, 8) |
72 | 2.56k | RELOC_NUMBER (R_SPARC_HI22, 9) |
73 | 1.17k | RELOC_NUMBER (R_SPARC_22, 10) |
74 | 382 | RELOC_NUMBER (R_SPARC_13, 11) |
75 | 562 | RELOC_NUMBER (R_SPARC_LO10, 12) |
76 | 427 | RELOC_NUMBER (R_SPARC_GOT10, 13) |
77 | 458 | RELOC_NUMBER (R_SPARC_GOT13, 14) |
78 | 397 | RELOC_NUMBER (R_SPARC_GOT22, 15) |
79 | 793 | RELOC_NUMBER (R_SPARC_PC10, 16) |
80 | 2.06k | RELOC_NUMBER (R_SPARC_PC22, 17) |
81 | 444 | RELOC_NUMBER (R_SPARC_WPLT30, 18) |
82 | 546 | RELOC_NUMBER (R_SPARC_COPY, 19) |
83 | 370 | RELOC_NUMBER (R_SPARC_GLOB_DAT, 20) |
84 | 694 | RELOC_NUMBER (R_SPARC_JMP_SLOT, 21) |
85 | 873 | RELOC_NUMBER (R_SPARC_RELATIVE, 22) |
86 | 467 | RELOC_NUMBER (R_SPARC_UA32, 23) |
87 | | |
88 | | /* ??? These 6 relocs are new but not currently used. For binary |
89 | | compatibility in the sparc64-elf toolchain, we leave them out. |
90 | | A non-binary upward compatible change is expected for sparc64-elf. */ |
91 | 0 | #ifndef SPARC64_OLD_RELOCS |
92 | | /* ??? New relocs on the UltraSPARC. Not sure what they're for yet. */ |
93 | 625 | RELOC_NUMBER (R_SPARC_PLT32, 24) |
94 | 455 | RELOC_NUMBER (R_SPARC_HIPLT22, 25) |
95 | 618 | RELOC_NUMBER (R_SPARC_LOPLT10, 26) |
96 | 709 | RELOC_NUMBER (R_SPARC_PCPLT32, 27) |
97 | 234 | RELOC_NUMBER (R_SPARC_PCPLT22, 28) |
98 | 398 | RELOC_NUMBER (R_SPARC_PCPLT10, 29) |
99 | 0 | #endif |
100 | | |
101 | | /* v9 relocs */ |
102 | 379 | RELOC_NUMBER (R_SPARC_10, 30) |
103 | 433 | RELOC_NUMBER (R_SPARC_11, 31) |
104 | 693 | RELOC_NUMBER (R_SPARC_64, 32) |
105 | 812 | RELOC_NUMBER (R_SPARC_OLO10, 33) |
106 | 518 | RELOC_NUMBER (R_SPARC_HH22, 34) |
107 | 990 | RELOC_NUMBER (R_SPARC_HM10, 35) |
108 | 342 | RELOC_NUMBER (R_SPARC_LM22, 36) |
109 | 290 | RELOC_NUMBER (R_SPARC_PC_HH22, 37) |
110 | 348 | RELOC_NUMBER (R_SPARC_PC_HM10, 38) |
111 | 441 | RELOC_NUMBER (R_SPARC_PC_LM22, 39) |
112 | 725 | RELOC_NUMBER (R_SPARC_WDISP16, 40) |
113 | 324 | RELOC_NUMBER (R_SPARC_WDISP19, 41) |
114 | 385 | RELOC_NUMBER (R_SPARC_UNUSED_42, 42) |
115 | 387 | RELOC_NUMBER (R_SPARC_7, 43) |
116 | 330 | RELOC_NUMBER (R_SPARC_5, 44) |
117 | 503 | RELOC_NUMBER (R_SPARC_6, 45) |
118 | 516 | RELOC_NUMBER (R_SPARC_DISP64, 46) |
119 | 336 | RELOC_NUMBER (R_SPARC_PLT64, 47) |
120 | 885 | RELOC_NUMBER (R_SPARC_HIX22, 48) |
121 | 332 | RELOC_NUMBER (R_SPARC_LOX10, 49) |
122 | 324 | RELOC_NUMBER (R_SPARC_H44, 50) |
123 | 384 | RELOC_NUMBER (R_SPARC_M44, 51) |
124 | 325 | RELOC_NUMBER (R_SPARC_L44, 52) |
125 | 403 | RELOC_NUMBER (R_SPARC_REGISTER, 53) |
126 | 385 | RELOC_NUMBER (R_SPARC_UA64, 54) |
127 | 282 | RELOC_NUMBER (R_SPARC_UA16, 55) |
128 | | |
129 | 306 | RELOC_NUMBER (R_SPARC_TLS_GD_HI22, 56) |
130 | 332 | RELOC_NUMBER (R_SPARC_TLS_GD_LO10, 57) |
131 | 442 | RELOC_NUMBER (R_SPARC_TLS_GD_ADD, 58) |
132 | 281 | RELOC_NUMBER (R_SPARC_TLS_GD_CALL, 59) |
133 | 653 | RELOC_NUMBER (R_SPARC_TLS_LDM_HI22, 60) |
134 | 343 | RELOC_NUMBER (R_SPARC_TLS_LDM_LO10, 61) |
135 | 517 | RELOC_NUMBER (R_SPARC_TLS_LDM_ADD, 62) |
136 | 286 | RELOC_NUMBER (R_SPARC_TLS_LDM_CALL, 63) |
137 | 703 | RELOC_NUMBER (R_SPARC_TLS_LDO_HIX22, 64) |
138 | 788 | RELOC_NUMBER (R_SPARC_TLS_LDO_LOX10, 65) |
139 | 324 | RELOC_NUMBER (R_SPARC_TLS_LDO_ADD, 66) |
140 | 681 | RELOC_NUMBER (R_SPARC_TLS_IE_HI22, 67) |
141 | 255 | RELOC_NUMBER (R_SPARC_TLS_IE_LO10, 68) |
142 | 697 | RELOC_NUMBER (R_SPARC_TLS_IE_LD, 69) |
143 | 1.31k | RELOC_NUMBER (R_SPARC_TLS_IE_LDX, 70) |
144 | 283 | RELOC_NUMBER (R_SPARC_TLS_IE_ADD, 71) |
145 | 321 | RELOC_NUMBER (R_SPARC_TLS_LE_HIX22, 72) |
146 | 344 | RELOC_NUMBER (R_SPARC_TLS_LE_LOX10, 73) |
147 | 377 | RELOC_NUMBER (R_SPARC_TLS_DTPMOD32, 74) |
148 | 989 | RELOC_NUMBER (R_SPARC_TLS_DTPMOD64, 75) |
149 | 708 | RELOC_NUMBER (R_SPARC_TLS_DTPOFF32, 76) |
150 | 242 | RELOC_NUMBER (R_SPARC_TLS_DTPOFF64, 77) |
151 | 596 | RELOC_NUMBER (R_SPARC_TLS_TPOFF32, 78) |
152 | 327 | RELOC_NUMBER (R_SPARC_TLS_TPOFF64, 79) |
153 | | |
154 | 364 | RELOC_NUMBER (R_SPARC_GOTDATA_HIX22, 80) |
155 | 287 | RELOC_NUMBER (R_SPARC_GOTDATA_LOX10, 81) |
156 | 358 | RELOC_NUMBER (R_SPARC_GOTDATA_OP_HIX22, 82) |
157 | 590 | RELOC_NUMBER (R_SPARC_GOTDATA_OP_LOX10, 83) |
158 | 282 | RELOC_NUMBER (R_SPARC_GOTDATA_OP, 84) |
159 | | |
160 | 509 | RELOC_NUMBER (R_SPARC_H34, 85) |
161 | 281 | RELOC_NUMBER (R_SPARC_SIZE32, 86) |
162 | 260 | RELOC_NUMBER (R_SPARC_SIZE64, 87) |
163 | 517 | RELOC_NUMBER (R_SPARC_WDISP10, 88) |
164 | | |
165 | 0 | EMPTY_RELOC (R_SPARC_max_std) |
166 | | |
167 | 394 | RELOC_NUMBER (R_SPARC_JMP_IREL, 248) |
168 | 301 | RELOC_NUMBER (R_SPARC_IRELATIVE, 249) |
169 | 314 | RELOC_NUMBER (R_SPARC_GNU_VTINHERIT, 250) |
170 | 709 | RELOC_NUMBER (R_SPARC_GNU_VTENTRY, 251) |
171 | 645 | RELOC_NUMBER (R_SPARC_REV32, 252) |
172 | | |
173 | 25.1k | END_RELOC_NUMBERS (R_SPARC_max) |
174 | | |
175 | | /* Relocation macros. */ |
176 | | |
177 | | #define ELF64_R_TYPE_DATA(info) \ |
178 | 446 | (((bfd_signed_vma)(ELF64_R_TYPE(info) >> 8) ^ 0x800000) - 0x800000) |
179 | | #define ELF64_R_TYPE_ID(info) \ |
180 | 1.47k | ((info) & 0xff) |
181 | | #define ELF64_R_TYPE_INFO(data, type) \ |
182 | | (((bfd_vma) ((data) & 0xffffff) << 8) | (bfd_vma) (type)) |
183 | | |
184 | | /* Values for Elf64_Dyn.d_tag. */ |
185 | | |
186 | 68 | #define DT_SPARC_REGISTER 0x70000001 |
187 | | |
188 | | /* Object attribute tags. */ |
189 | | enum |
190 | | { |
191 | | /* 0-3 are generic. */ |
192 | | Tag_GNU_Sparc_HWCAPS = 4, |
193 | | Tag_GNU_Sparc_HWCAPS2 = 8 |
194 | | }; |
195 | | |
196 | | /* Generally speaking the ELF_SPARC_HWCAP_* and ELF_SPARC_HWCAP2_* |
197 | | values match the AV_SPARC_* and AV2_SPARC_* bits respectively. |
198 | | |
199 | | However Solaris 11 introduced a backwards-incompatible change |
200 | | deprecating the RANDOM, TRANS and ASI_CACHE_SPARING bits in the |
201 | | AT_SUNW_CAP_HW1 flags, reusing the bits for the unrelated hwcaps |
202 | | FJATHHPC, FJDES and FJAES respectively. In GNU/Linux we opted to |
203 | | keep the old hwcaps in Tag_GNU_Sparc_HWCAPS and allocate bits for |
204 | | FJATHHPC, FJDES and JFAES in Tag_GNU_Sparc_HWCAPS2. */ |
205 | | |
206 | 3.12k | #define ELF_SPARC_HWCAP_MUL32 0x00000001 /* umul/umulcc/smul/smulcc insns */ |
207 | 3.12k | #define ELF_SPARC_HWCAP_DIV32 0x00000002 /* udiv/udivcc/sdiv/sdivcc insns */ |
208 | 3.12k | #define ELF_SPARC_HWCAP_FSMULD 0x00000004 /* 'fsmuld' insn */ |
209 | 3.12k | #define ELF_SPARC_HWCAP_V8PLUS 0x00000008 /* v9 insns available to 32bit */ |
210 | 3.12k | #define ELF_SPARC_HWCAP_POPC 0x00000010 /* 'popc' insn */ |
211 | 3.12k | #define ELF_SPARC_HWCAP_VIS 0x00000020 /* VIS insns */ |
212 | 3.12k | #define ELF_SPARC_HWCAP_VIS2 0x00000040 /* VIS2 insns */ |
213 | | #define ELF_SPARC_HWCAP_ASI_BLK_INIT \ |
214 | 37.2k | 0x00000080 /* block init ASIs */ |
215 | 37.2k | #define ELF_SPARC_HWCAP_FMAF 0x00000100 /* fused multiply-add */ |
216 | 37.2k | #define ELF_SPARC_HWCAP_VIS3 0x00000400 /* VIS3 insns */ |
217 | 37.2k | #define ELF_SPARC_HWCAP_HPC 0x00000800 /* HPC insns */ |
218 | 3.12k | #define ELF_SPARC_HWCAP_RANDOM 0x00001000 /* 'random' insn */ |
219 | 3.12k | #define ELF_SPARC_HWCAP_TRANS 0x00002000 /* transaction insns */ |
220 | 37.2k | #define ELF_SPARC_HWCAP_FJFMAU 0x00004000 /* unfused multiply-add */ |
221 | 37.2k | #define ELF_SPARC_HWCAP_IMA 0x00008000 /* integer multiply-add */ |
222 | | #define ELF_SPARC_HWCAP_ASI_CACHE_SPARING \ |
223 | 3.12k | 0x00010000 /* cache sparing ASIs */ |
224 | 34.1k | #define ELF_SPARC_HWCAP_AES 0x00020000 /* AES crypto insns */ |
225 | 34.1k | #define ELF_SPARC_HWCAP_DES 0x00040000 /* DES crypto insns */ |
226 | 34.1k | #define ELF_SPARC_HWCAP_KASUMI 0x00080000 /* KASUMI crypto insns */ |
227 | | #define ELF_SPARC_HWCAP_CAMELLIA \ |
228 | 34.1k | 0x00100000 /* CAMELLIA crypto insns */ |
229 | 34.1k | #define ELF_SPARC_HWCAP_MD5 0x00200000 /* MD5 hashing insns */ |
230 | 34.1k | #define ELF_SPARC_HWCAP_SHA1 0x00400000 /* SHA1 hashing insns */ |
231 | 34.1k | #define ELF_SPARC_HWCAP_SHA256 0x00800000 /* SHA256 hashing insns */ |
232 | 34.1k | #define ELF_SPARC_HWCAP_SHA512 0x01000000 /* SHA512 hashing insns */ |
233 | 34.1k | #define ELF_SPARC_HWCAP_MPMUL 0x02000000 /* Multiple Precision Multiply */ |
234 | 34.1k | #define ELF_SPARC_HWCAP_MONT 0x04000000 /* Montgomery Mult/Sqrt */ |
235 | 34.1k | #define ELF_SPARC_HWCAP_PAUSE 0x08000000 /* Pause insn */ |
236 | 34.1k | #define ELF_SPARC_HWCAP_CBCOND 0x10000000 /* Compare and Branch insns */ |
237 | 34.1k | #define ELF_SPARC_HWCAP_CRC32C 0x20000000 /* CRC32C insn */ |
238 | | |
239 | 2.07k | #define ELF_SPARC_HWCAP2_FJATHPLUS 0x00000001 /* Fujitsu Athena+ */ |
240 | 2.07k | #define ELF_SPARC_HWCAP2_VIS3B 0x00000002 /* Subset of VIS3 present on sparc64 X+ */ |
241 | 2.07k | #define ELF_SPARC_HWCAP2_ADP 0x00000004 /* Application Data Protection */ |
242 | 36.2k | #define ELF_SPARC_HWCAP2_SPARC5 0x00000008 /* The 29 new fp and sub instructions */ |
243 | 36.2k | #define ELF_SPARC_HWCAP2_MWAIT 0x00000010 /* mwait instruction and load/monitor ASIs */ |
244 | 36.2k | #define ELF_SPARC_HWCAP2_XMPMUL 0x00000020 /* XOR multiple precision multiply */ |
245 | 36.2k | #define ELF_SPARC_HWCAP2_XMONT 0x00000040 /* XOR Montgomery mult/sqr instructions */ |
246 | | #define ELF_SPARC_HWCAP2_NSEC \ |
247 | 2.07k | 0x00000080 /* pause insn with support for nsec timings */ |
248 | 2.07k | #define ELF_SPARC_HWCAP2_FJATHHPC 0x00001000 /* Fujitsu HPC instrs */ |
249 | 2.07k | #define ELF_SPARC_HWCAP2_FJDES 0x00002000 /* Fujitsu DES instrs */ |
250 | 2.07k | #define ELF_SPARC_HWCAP2_FJAES 0x00010000 /* Fujitsu AES instrs */ |
251 | | |
252 | 34.1k | #define ELF_SPARC_HWCAP2_SPARC6 0x00020000 /* OSA2017 new instructions */ |
253 | 34.1k | #define ELF_SPARC_HWCAP2_ONADDSUB 0x00040000 /* Oracle Number add/subtract */ |
254 | 34.1k | #define ELF_SPARC_HWCAP2_ONMUL 0x00080000 /* Oracle Number multiply */ |
255 | 34.1k | #define ELF_SPARC_HWCAP2_ONDIV 0x00100000 /* Oracle Number divide */ |
256 | 34.1k | #define ELF_SPARC_HWCAP2_DICTUNP 0x00200000 /* Dictionary unpack instruction */ |
257 | 34.1k | #define ELF_SPARC_HWCAP2_FPCMPSHL 0x00400000 /* Partition compare with shifted result */ |
258 | 34.1k | #define ELF_SPARC_HWCAP2_RLE 0x00800000 /* Run-length encoded burst and length */ |
259 | 34.1k | #define ELF_SPARC_HWCAP2_SHA3 0x01000000 /* SHA3 instruction */ |
260 | | |
261 | | #endif /* _ELF_SPARC_H */ |