1 // powerpc.h -- ELF definitions specific to EM_PPC and EM_PPC64 -*- C++ -*- 2 3 // Copyright (C) 2008-2024 Free Software Foundation, Inc. 4 // Written by David S. Miller <davem@davemloft.net>. 5 6 // This file is part of elfcpp. 7 8 // This program is free software; you can redistribute it and/or 9 // modify it under the terms of the GNU Library General Public License 10 // as published by the Free Software Foundation; either version 2, or 11 // (at your option) any later version. 12 13 // In addition to the permissions in the GNU Library General Public 14 // License, the Free Software Foundation gives you unlimited 15 // permission to link the compiled version of this file into 16 // combinations with other programs, and to distribute those 17 // combinations without any restriction coming from the use of this 18 // file. (The Library Public License restrictions do apply in other 19 // respects; for example, they cover modification of the file, and 20 /// distribution when not linked into a combined executable.) 21 22 // This program is distributed in the hope that it will be useful, but 23 // WITHOUT ANY WARRANTY; without even the implied warranty of 24 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 25 // Library General Public License for more details. 26 27 // You should have received a copy of the GNU Library General Public 28 // License along with this program; if not, write to the Free Software 29 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 30 // 02110-1301, USA. 31 32 #ifndef ELFCPP_POWERPC_H 33 #define ELFCPP_POWERPC_H 34 35 namespace elfcpp 36 { 37 38 // The relocation numbers for 32-bit and 64-bit powerpc are nearly 39 // identical. Therefore I've adopted the convention of using 40 // R_POWERPC_foo for values which are the same in R_PPC_* and R_PPC64_*. 41 // For relocations which are specific to the word size I will use 42 // R_PPC_foo or R_PPC64_foo. 43 enum 44 { 45 R_POWERPC_NONE = 0, 46 R_POWERPC_ADDR32 = 1, 47 R_POWERPC_ADDR24 = 2, 48 R_POWERPC_ADDR16 = 3, 49 R_POWERPC_ADDR16_LO = 4, 50 R_POWERPC_ADDR16_HI = 5, 51 R_POWERPC_ADDR16_HA = 6, 52 R_POWERPC_ADDR14 = 7, 53 R_POWERPC_ADDR14_BRTAKEN = 8, 54 R_POWERPC_ADDR14_BRNTAKEN = 9, 55 R_POWERPC_REL24 = 10, 56 R_POWERPC_REL14 = 11, 57 R_POWERPC_REL14_BRTAKEN = 12, 58 R_POWERPC_REL14_BRNTAKEN = 13, 59 R_POWERPC_GOT16 = 14, 60 R_POWERPC_GOT16_LO = 15, 61 R_POWERPC_GOT16_HI = 16, 62 R_POWERPC_GOT16_HA = 17, 63 R_PPC_PLTREL24 = 18, 64 R_POWERPC_COPY = 19, 65 R_POWERPC_GLOB_DAT = 20, 66 R_POWERPC_JMP_SLOT = 21, 67 R_POWERPC_RELATIVE = 22, 68 R_PPC_LOCAL24PC = 23, 69 R_POWERPC_UADDR32 = 24, 70 R_POWERPC_UADDR16 = 25, 71 R_POWERPC_REL32 = 26, 72 R_POWERPC_PLT32 = 27, 73 R_POWERPC_PLTREL32 = 28, 74 R_POWERPC_PLT16_LO = 29, 75 R_POWERPC_PLT16_HI = 30, 76 R_POWERPC_PLT16_HA = 31, 77 R_PPC_SDAREL16 = 32, 78 R_POWERPC_SECTOFF = 33, 79 R_POWERPC_SECTOFF_LO = 34, 80 R_POWERPC_SECTOFF_HI = 35, 81 R_POWERPC_SECTOFF_HA = 36, 82 R_POWERPC_ADDR30 = 37, 83 R_PPC64_ADDR64 = 38, 84 R_PPC64_ADDR16_HIGHER = 39, 85 R_PPC64_ADDR16_HIGHERA = 40, 86 R_PPC64_ADDR16_HIGHEST = 41, 87 R_PPC64_ADDR16_HIGHESTA = 42, 88 R_PPC64_UADDR64 = 43, 89 R_PPC64_REL64 = 44, 90 R_PPC64_PLT64 = 45, 91 R_PPC64_PLTREL64 = 46, 92 R_PPC64_TOC16 = 47, 93 R_PPC64_TOC16_LO = 48, 94 R_PPC64_TOC16_HI = 49, 95 R_PPC64_TOC16_HA = 50, 96 R_PPC64_TOC = 51, 97 R_PPC64_PLTGOT16 = 52, 98 R_PPC64_PLTGOT16_LO = 53, 99 R_PPC64_PLTGOT16_HI = 54, 100 R_PPC64_PLTGOT16_HA = 55, 101 R_PPC64_ADDR16_DS = 56, 102 R_PPC64_ADDR16_LO_DS = 57, 103 R_PPC64_GOT16_DS = 58, 104 R_PPC64_GOT16_LO_DS = 59, 105 R_PPC64_PLT16_LO_DS = 60, 106 R_PPC64_SECTOFF_DS = 61, 107 R_PPC64_SECTOFF_LO_DS = 62, 108 R_PPC64_TOC16_DS = 63, 109 R_PPC64_TOC16_LO_DS = 64, 110 R_PPC64_PLTGOT16_DS = 65, 111 R_PPC64_PLTGOT16_LO_DS = 66, 112 R_POWERPC_TLS = 67, 113 R_POWERPC_DTPMOD = 68, 114 R_POWERPC_TPREL16 = 69, 115 R_POWERPC_TPREL16_LO = 70, 116 R_POWERPC_TPREL16_HI = 71, 117 R_POWERPC_TPREL16_HA = 72, 118 R_POWERPC_TPREL = 73, 119 R_POWERPC_DTPREL16 = 74, 120 R_POWERPC_DTPREL16_LO = 75, 121 R_POWERPC_DTPREL16_HI = 76, 122 R_POWERPC_DTPREL16_HA = 77, 123 R_POWERPC_DTPREL = 78, 124 R_POWERPC_GOT_TLSGD16 = 79, 125 R_POWERPC_GOT_TLSGD16_LO = 80, 126 R_POWERPC_GOT_TLSGD16_HI = 81, 127 R_POWERPC_GOT_TLSGD16_HA = 82, 128 R_POWERPC_GOT_TLSLD16 = 83, 129 R_POWERPC_GOT_TLSLD16_LO = 84, 130 R_POWERPC_GOT_TLSLD16_HI = 85, 131 R_POWERPC_GOT_TLSLD16_HA = 86, 132 R_POWERPC_GOT_TPREL16 = 87, 133 R_POWERPC_GOT_TPREL16_LO = 88, 134 R_POWERPC_GOT_TPREL16_HI = 89, 135 R_POWERPC_GOT_TPREL16_HA = 90, 136 R_POWERPC_GOT_DTPREL16 = 91, 137 R_POWERPC_GOT_DTPREL16_LO = 92, 138 R_POWERPC_GOT_DTPREL16_HI = 93, 139 R_POWERPC_GOT_DTPREL16_HA = 94, 140 R_PPC_TLSGD = 95, 141 R_PPC64_TPREL16_DS = 95, 142 R_PPC_TLSLD = 96, 143 R_PPC64_TPREL16_LO_DS = 96, 144 R_PPC64_TPREL16_HIGHER = 97, 145 R_PPC64_TPREL16_HIGHERA = 98, 146 R_PPC64_TPREL16_HIGHEST = 99, 147 R_PPC64_TPREL16_HIGHESTA = 100, 148 R_PPC_EMB_NADDR32 = 101, 149 R_PPC64_DTPREL16_DS = 101, 150 R_PPC_EMB_NADDR16 = 102, 151 R_PPC64_DTPREL16_LO_DS = 102, 152 R_PPC_EMB_NADDR16_LO = 103, 153 R_PPC64_DTPREL16_HIGHER = 103, 154 R_PPC_EMB_NADDR16_HI = 104, 155 R_PPC64_DTPREL16_HIGHERA = 104, 156 R_PPC_EMB_NADDR16_HA = 105, 157 R_PPC64_DTPREL16_HIGHEST = 105, 158 R_PPC_EMB_SDAI16 = 106, 159 R_PPC64_DTPREL16_HIGHESTA = 106, 160 R_PPC_EMB_SDA2I16 = 107, 161 R_PPC64_TLSGD = 107, 162 R_PPC_EMB_SDA2REL = 108, 163 R_PPC64_TLSLD = 108, 164 R_PPC_EMB_SDA21 = 109, 165 R_PPC64_TOCSAVE = 109, 166 R_PPC_EMB_MRKREF = 110, 167 R_PPC64_ADDR16_HIGH = 110, 168 R_PPC_EMB_RELSEC16 = 111, 169 R_PPC64_ADDR16_HIGHA = 111, 170 R_PPC_EMB_RELST_LO = 112, 171 R_PPC64_TPREL16_HIGH = 112, 172 R_PPC_EMB_RELST_HI = 113, 173 R_PPC64_TPREL16_HIGHA = 113, 174 R_PPC_EMB_RELST_HA = 114, 175 R_PPC64_DTPREL16_HIGH = 114, 176 R_PPC_EMB_BIT_FLD = 115, 177 R_PPC64_DTPREL16_HIGHA = 115, 178 R_PPC_EMB_RELSDA = 116, 179 R_PPC64_REL24_NOTOC = 116, 180 R_PPC64_ADDR64_LOCAL = 117, 181 R_PPC64_ENTRY = 118, 182 R_POWERPC_PLTSEQ = 119, 183 R_POWERPC_PLTCALL = 120, 184 R_PPC64_PLTSEQ_NOTOC = 121, 185 R_PPC64_PLTCALL_NOTOC = 122, 186 R_PPC64_PCREL_OPT = 123, 187 R_PPC64_REL24_P9NOTOC = 124, 188 189 R_PPC64_D34 = 128, 190 R_PPC64_D34_LO = 129, 191 R_PPC64_D34_HI30 = 130, 192 R_PPC64_D34_HA30 = 131, 193 R_PPC64_PCREL34 = 132, 194 R_PPC64_GOT_PCREL34 = 133, 195 R_PPC64_PLT_PCREL34 = 134, 196 R_PPC64_PLT_PCREL34_NOTOC = 135, 197 R_PPC64_ADDR16_HIGHER34 = 136, 198 R_PPC64_ADDR16_HIGHERA34 = 137, 199 R_PPC64_ADDR16_HIGHEST34 = 138, 200 R_PPC64_ADDR16_HIGHESTA34 = 139, 201 R_PPC64_REL16_HIGHER34 = 140, 202 R_PPC64_REL16_HIGHERA34 = 141, 203 R_PPC64_REL16_HIGHEST34 = 142, 204 R_PPC64_REL16_HIGHESTA34 = 143, 205 R_PPC64_D28 = 144, 206 R_PPC64_PCREL28 = 145, 207 R_PPC64_TPREL34 = 146, 208 R_PPC64_DTPREL34 = 147, 209 R_PPC64_GOT_TLSGD_PCREL34 = 148, 210 R_PPC64_GOT_TLSLD_PCREL34 = 149, 211 R_PPC64_GOT_TPREL_PCREL34 = 150, 212 R_PPC64_GOT_DTPREL_PCREL34 = 151, 213 214 R_PPC_VLE_REL8 = 216, 215 R_PPC_VLE_REL15 = 217, 216 R_PPC_VLE_REL24 = 218, 217 R_PPC_VLE_LO16A = 219, 218 R_PPC_VLE_LO16D = 220, 219 R_PPC_VLE_HI16A = 221, 220 R_PPC_VLE_HI16D = 222, 221 R_PPC_VLE_HA16A = 223, 222 R_PPC_VLE_HA16D = 224, 223 R_PPC_VLE_SDA21 = 225, 224 R_PPC_VLE_SDA21_LO = 226, 225 R_PPC_VLE_SDAREL_LO16A = 227, 226 R_PPC_VLE_SDAREL_LO16D = 228, 227 R_PPC_VLE_SDAREL_HI16A = 229, 228 R_PPC_VLE_SDAREL_HI16D = 230, 229 R_PPC_VLE_SDAREL_HA16A = 231, 230 R_PPC_VLE_SDAREL_HA16D = 232, 231 232 R_PPC64_REL16_HIGH = 240, 233 R_PPC64_REL16_HIGHA = 241, 234 R_PPC64_REL16_HIGHER = 242, 235 R_PPC64_REL16_HIGHERA = 243, 236 R_PPC64_REL16_HIGHEST = 244, 237 R_PPC64_REL16_HIGHESTA = 245, 238 239 R_POWERPC_REL16DX_HA = 246, 240 R_PPC64_JMP_IREL = 247, 241 R_POWERPC_IRELATIVE = 248, 242 R_POWERPC_REL16 = 249, 243 R_POWERPC_REL16_LO = 250, 244 R_POWERPC_REL16_HI = 251, 245 R_POWERPC_REL16_HA = 252, 246 R_POWERPC_GNU_VTINHERIT = 253, 247 R_POWERPC_GNU_VTENTRY = 254, 248 R_PPC_TOC16 = 255, 249 }; 250 251 // e_flags values defined for powerpc 252 enum 253 { 254 EF_PPC_EMB = 0x80000000, // PowerPC embedded flag. 255 EF_PPC_RELOCATABLE = 0x00010000, // PowerPC -mrelocatable flag. */ 256 EF_PPC_RELOCATABLE_LIB = 0x00008000, // PowerPC -mrelocatable-lib flag. */ 257 }; 258 259 // e_flags values defined for powerpc64 260 enum 261 { 262 // ABI version 263 // 1 for original function descriptor using ABI, 264 // 2 for revised ABI without function descriptors, 265 // 0 for unspecified or not using any features affected by the differences. 266 EF_PPC64_ABI = 3 267 }; 268 269 // Object attribute tags. 0-3 are generic. 270 enum 271 { 272 // FP ABI, low 2 bits: 273 // 1 for double precision hard-float, 274 // 2 for soft-float, 275 // 3 for single precision hard-float. 276 // 0 for not tagged or not using any ABIs affected by the differences. 277 // Next 2 bits: 278 // 1 for ibm long double 279 // 2 for 64-bit long double 280 // 3 for IEEE long double. 281 // 0 for not tagged or not using any ABIs affected by the differences. 282 Tag_GNU_Power_ABI_FP = 4, 283 284 // Value 1 for general purpose registers only, 2 for AltiVec 285 // registers, 3 for SPE registers; 0 for not tagged or not using any 286 // ABIs affected by the differences. 287 Tag_GNU_Power_ABI_Vector = 8, 288 289 // Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes, 290 // 2 for ABIs using memory; 0 for not tagged or not using any ABIs 291 // affected by the differences. 292 Tag_GNU_Power_ABI_Struct_Return = 12 293 }; 294 295 // DT_PPC_OPT bits 296 enum 297 { 298 PPC_OPT_TLS = 1 299 }; 300 301 // DT_PPC64_OPT bits 302 enum 303 { 304 PPC64_OPT_TLS = 1, 305 PPC64_OPT_MULTI_TOC = 2, 306 PPC64_OPT_LOCALENTRY = 4 307 }; 308 309 enum 310 { 311 // The ELFv2 ABI uses three bits in the symbol st_other field of a 312 // function definition to specify the number of instructions between a 313 // function's global entry point and local entry point. 314 // The global entry point is used when it is necessary to set up the 315 // toc pointer (r2) for the function. Callers must enter the global 316 // entry point with r12 set to the global entry point address. On 317 // return from the function, r2 may have a different value to that 318 // which it had on entry. 319 // The local entry point is used when r2 is known to already be valid 320 // for the function. There is no requirement on r12 when using the 321 // local entry point, and on return r2 will contain the same value as 322 // at entry. 323 // A value of zero in these bits means that the function has a single 324 // entry point with no requirement on r12 or r2, and that on return r2 325 // will contain the same value as at entry. 326 // Values of one and seven are reserved. 327 328 STO_PPC64_LOCAL_BIT = 5, 329 STO_PPC64_LOCAL_MASK = 0xE0 330 }; 331 332 // 3 bit other field to bytes. 333 static inline unsigned int 334 ppc64_decode_local_entry(unsigned int other) 335 { 336 return ((1 << other) >> 2) << 2; 337 } 338 339 // bytes to field value. 340 static inline unsigned int 341 ppc64_encode_local_entry(unsigned int val) 342 { 343 return (val >= 4 * 4 344 ? (val >= 8 * 4 345 ? (val >= 16 * 4 ? 6 : 5) 346 : 4) 347 : (val >= 2 * 4 348 ? 3 349 : (val >= 1 * 4 ? 2 : 0))); 350 } 351 352 } // End namespace elfcpp. 353 354 #endif // !defined(ELFCPP_POWERPC_H) 355