| Index: include/elf/ppc64.h
|
| diff --git a/include/elf/ppc64.h b/include/elf/ppc64.h
|
| index f1c80f18868758baebe880d4f0d17fd45a3c2e65..78d947baea90fd1b40c9b708dbd2c39278557481 100644
|
| --- a/include/elf/ppc64.h
|
| +++ b/include/elf/ppc64.h
|
| @@ -141,6 +141,14 @@ START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
| RELOC_NUMBER (R_PPC64_TLSLD, 108)
|
| RELOC_NUMBER (R_PPC64_TOCSAVE, 109)
|
|
|
| +/* Added when HA and HI relocs were changed to report overflows. */
|
| + RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110)
|
| + RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111)
|
| + RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112)
|
| + RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113)
|
| + RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114)
|
| + RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115)
|
| +
|
| #ifndef RELOC_MACROS_GEN_FUNC
|
| /* Fake relocation only used internally by ld. */
|
| RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
|
| @@ -161,8 +169,63 @@ START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
|
|
| END_RELOC_NUMBERS (R_PPC64_max)
|
|
|
| -#define IS_PPC64_TLS_RELOC(R) \
|
| - ((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA)
|
| +#define IS_PPC64_TLS_RELOC(R) \
|
| + (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \
|
| + || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA))
|
| +
|
| +
|
| +/* e_flags bits specifying ABI.
|
| + 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. */
|
| +#define EF_PPC64_ABI 3
|
| +
|
| +/* 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. */
|
| +#define STO_PPC64_LOCAL_BIT 5
|
| +#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT)
|
| +
|
| +// 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)));
|
| +}
|
| +
|
| +/* st_other to number of bytes. */
|
| +#define PPC64_LOCAL_ENTRY_OFFSET(other) \
|
| + ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \
|
| + >> STO_PPC64_LOCAL_BIT)
|
| +/* number of bytes to st_other. */
|
| +#define PPC64_SET_LOCAL_ENTRY_OFFSET(val) \
|
| + ppc64_encode_local_entry (val) << STO_PPC64_LOCAL_BIT
|
|
|
| /* Specify the start of the .glink section. */
|
| #define DT_PPC64_GLINK DT_LOPROC
|
| @@ -171,7 +234,9 @@ END_RELOC_NUMBERS (R_PPC64_max)
|
| #define DT_PPC64_OPD (DT_LOPROC + 1)
|
| #define DT_PPC64_OPDSZ (DT_LOPROC + 2)
|
|
|
| -/* Specify that tls descriptors should be optimized. */
|
| -#define DT_PPC64_TLSOPT (DT_LOPROC + 3)
|
| +/* Specify whether various optimisations are possible. */
|
| +#define DT_PPC64_OPT (DT_LOPROC + 3)
|
| +#define PPC64_OPT_TLS 1
|
| +#define PPC64_OPT_MULTI_TOC 2
|
|
|
| #endif /* _ELF_PPC64_H */
|
|
|