1 // powerpc.h -- ELF definitions specific to EM_PPC and EM_PPC64 -*- C++ -*- 2 3 // Copyright (C) 2008-2014 Free Software Foundation, Inc. 4 // Written by David S. Miller <davem (at) 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 182 R_PPC_VLE_REL8 = 216, 183 R_PPC_VLE_REL15 = 217, 184 R_PPC_VLE_REL24 = 218, 185 R_PPC_VLE_LO16A = 219, 186 R_PPC_VLE_LO16D = 220, 187 R_PPC_VLE_HI16A = 221, 188 R_PPC_VLE_HI16D = 222, 189 R_PPC_VLE_HA16A = 223, 190 R_PPC_VLE_HA16D = 224, 191 R_PPC_VLE_SDA21 = 225, 192 R_PPC_VLE_SDA21_LO = 226, 193 R_PPC_VLE_SDAREL_LO16A = 227, 194 R_PPC_VLE_SDAREL_LO16D = 228, 195 R_PPC_VLE_SDAREL_HI16A = 229, 196 R_PPC_VLE_SDAREL_HI16D = 230, 197 R_PPC_VLE_SDAREL_HA16A = 231, 198 R_PPC_VLE_SDAREL_HA16D = 232, 199 200 R_PPC64_JMP_IREL = 247, 201 R_POWERPC_IRELATIVE = 248, 202 R_POWERPC_REL16 = 249, 203 R_POWERPC_REL16_LO = 250, 204 R_POWERPC_REL16_HI = 251, 205 R_POWERPC_REL16_HA = 252, 206 R_POWERPC_GNU_VTINHERIT = 253, 207 R_POWERPC_GNU_VTENTRY = 254, 208 R_PPC_TOC16 = 255, 209 }; 210 211 // e_flags values defined for powerpc 212 enum 213 { 214 EF_PPC_EMB = 0x80000000, // PowerPC embedded flag. 215 EF_PPC_RELOCATABLE = 0x00010000, // PowerPC -mrelocatable flag. */ 216 EF_PPC_RELOCATABLE_LIB = 0x00008000, // PowerPC -mrelocatable-lib flag. */ 217 }; 218 219 // e_flags values defined for powerpc64 220 enum 221 { 222 // ABI version 223 // 1 for original function descriptor using ABI, 224 // 2 for revised ABI without function descriptors, 225 // 0 for unspecified or not using any features affected by the differences. 226 EF_PPC64_ABI = 3 227 }; 228 229 enum 230 { 231 // The ELFv2 ABI uses three bits in the symbol st_other field of a 232 // function definition to specify the number of instructions between a 233 // function's global entry point and local entry point. 234 // The global entry point is used when it is necessary to set up the 235 // toc pointer (r2) for the function. Callers must enter the global 236 // entry point with r12 set to the global entry point address. On 237 // return from the function, r2 may have a different value to that 238 // which it had on entry. 239 // The local entry point is used when r2 is known to already be valid 240 // for the function. There is no requirement on r12 when using the 241 // local entry point, and on return r2 will contain the same value as 242 // at entry. 243 // A value of zero in these bits means that the function has a single 244 // entry point with no requirement on r12 or r2, and that on return r2 245 // will contain the same value as at entry. 246 // Values of one and seven are reserved. 247 248 STO_PPC64_LOCAL_BIT = 5, 249 STO_PPC64_LOCAL_MASK = 0xE0 250 }; 251 252 // 3 bit other field to bytes. 253 static inline unsigned int 254 ppc64_decode_local_entry(unsigned int other) 255 { 256 return ((1 << other) >> 2) << 2; 257 } 258 259 // bytes to field value. 260 static inline unsigned int 261 ppc64_encode_local_entry(unsigned int val) 262 { 263 return (val >= 4 * 4 264 ? (val >= 8 * 4 265 ? (val >= 16 * 4 ? 6 : 5) 266 : 4) 267 : (val >= 2 * 4 268 ? 3 269 : (val >= 1 * 4 ? 2 : 0))); 270 } 271 272 } // End namespace elfcpp. 273 274 #endif // !defined(ELFCPP_POWERPC_H) 275