X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=elfcpp%2Fpowerpc.h;h=2a22121822ff03e8280c637b31e163689e037ce1;hb=7361da2c952eb96d1869e49e35e8bc95ab42074a;hp=2c803af94e3b3ccdc55ae7d1d9c15c02171eec9f;hpb=6ce7895693dea7d683fb832d059ed020cffbf65b;p=external%2Fbinutils.git diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h index 2c803af..2a22121 100644 --- a/elfcpp/powerpc.h +++ b/elfcpp/powerpc.h @@ -1,6 +1,6 @@ // powerpc.h -- ELF definitions specific to EM_PPC and EM_PPC64 -*- C++ -*- -// Copyright 2008, 2010, 2012 Free Software Foundation, Inc. +// Copyright (C) 2008-2014 Free Software Foundation, Inc. // Written by David S. Miller . // This file is part of elfcpp. @@ -164,12 +164,20 @@ enum R_PPC_EMB_SDA21 = 109, R_PPC64_TOCSAVE = 109, R_PPC_EMB_MRKREF = 110, + R_PPC64_ADDR16_HIGH = 110, R_PPC_EMB_RELSEC16 = 111, + R_PPC64_ADDR16_HIGHA = 111, R_PPC_EMB_RELST_LO = 112, + R_PPC64_TPREL16_HIGH = 112, R_PPC_EMB_RELST_HI = 113, + R_PPC64_TPREL16_HIGHA = 113, R_PPC_EMB_RELST_HA = 114, + R_PPC64_DTPREL16_HIGH = 114, R_PPC_EMB_BIT_FLD = 115, + R_PPC64_DTPREL16_HIGHA = 115, R_PPC_EMB_RELSDA = 116, + R_PPC64_REL24_NOTOC = 116, + R_PPC64_ADDR64_LOCAL = 117, R_PPC_VLE_REL8 = 216, R_PPC_VLE_REL15 = 217, @@ -208,6 +216,59 @@ enum EF_PPC_RELOCATABLE_LIB = 0x00008000, // PowerPC -mrelocatable-lib flag. */ }; +// e_flags values defined for powerpc64 +enum +{ + // ABI version + // 1 for original function descriptor using ABI, + // 2 for revised ABI without function descriptors, + // 0 for unspecified or not using any features affected by the differences. + EF_PPC64_ABI = 3 +}; + +enum +{ + // The ELFv2 ABI uses three bits in the symbol st_other field of a + // function definition to specify the number of instructions between a + // function's global entry point and local entry point. + // The global entry point is used when it is necessary to set up the + // toc pointer (r2) for the function. Callers must enter the global + // entry point with r12 set to the global entry point address. On + // return from the function, r2 may have a different value to that + // which it had on entry. + // The local entry point is used when r2 is known to already be valid + // for the function. There is no requirement on r12 when using the + // local entry point, and on return r2 will contain the same value as + // at entry. + // A value of zero in these bits means that the function has a single + // entry point with no requirement on r12 or r2, and that on return r2 + // will contain the same value as at entry. + // Values of one and seven are reserved. + + STO_PPC64_LOCAL_BIT = 5, + STO_PPC64_LOCAL_MASK = 0xE0 +}; + +// 3 bit other field to bytes. +static inline unsigned int +ppc64_decode_local_entry(unsigned int other) +{ + return ((1 << other) >> 2) << 2; +} + +// bytes to field value. +static inline unsigned int +ppc64_encode_local_entry(unsigned int val) +{ + return (val >= 4 * 4 + ? (val >= 8 * 4 + ? (val >= 16 * 4 ? 6 : 5) + : 4) + : (val >= 2 * 4 + ? 3 + : (val >= 1 * 4 ? 2 : 0))); +} + } // End namespace elfcpp. #endif // !defined(ELFCPP_POWERPC_H)