diff options
author | messense <messense@icloud.com> | 2021-05-13 03:35:09 (GMT) |
---|---|---|
committer | messense <messense@icloud.com> | 2021-05-13 07:12:54 (GMT) |
commit | 798904409cfb7e6b481a290b776b7f178c9036bf (patch) | |
tree | 81511cca575718eab971f105f41f695e38b73fe7 /packages/glibc/2.17/0064-glibc-ppc64le-42.patch | |
parent | f9716e8b9042eb14de85320987300aab99300df5 (diff) |
Add ppc64le patches for glibc 2.17 from CentOS git
Diffstat (limited to 'packages/glibc/2.17/0064-glibc-ppc64le-42.patch')
-rw-r--r-- | packages/glibc/2.17/0064-glibc-ppc64le-42.patch | 404 |
1 files changed, 404 insertions, 0 deletions
diff --git a/packages/glibc/2.17/0064-glibc-ppc64le-42.patch b/packages/glibc/2.17/0064-glibc-ppc64le-42.patch new file mode 100644 index 0000000..f5fa53e --- /dev/null +++ b/packages/glibc/2.17/0064-glibc-ppc64le-42.patch @@ -0,0 +1,404 @@ +# commit 61cd8fe4017c251617dd300818917e61a12ab48e +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:59:37 2013 -0600 +# +# PowerPC64 ELFv2 ABI 5/6: LD_AUDIT interface changes +# +# The ELFv2 ABI changes the calling convention by passing and returning +# structures in registers in more cases than the old ABI: +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01145.html +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01147.html +# +# For the most part, this does not affect glibc, since glibc assembler +# files do not use structure parameters / return values. However, one +# place is affected: the LD_AUDIT interface provides a structure to +# the audit routine that contains all registers holding function +# argument and return values for the intercepted PLT call. +# +# Since the new ABI now sometimes uses registers to return values +# that were never used for this purpose in the old ABI, this structure +# has to be extended. To force audit routines to be modified for the +# new ABI if necessary, the patch defines v2 variants of the la_ppc64 +# types and routines. +# +# In addition, the patch contains two unrelated changes to the +# PLT trampoline routines: it fixes a bug where FPR return values +# were stored in the wrong place, and it removes the unnecessary +# save/restore of CR. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h +--- glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h 2014-05-29 14:11:20.000000000 -0500 +@@ -63,7 +63,7 @@ + + __END_DECLS + +-#else ++#elif _CALL_ELF != 2 + + /* Registers for entry into PLT on PPC64. */ + typedef struct La_ppc64_regs +@@ -107,4 +107,48 @@ + + __END_DECLS + ++#else ++ ++/* Registers for entry into PLT on PPC64 in the ELFv2 ABI. */ ++typedef struct La_ppc64v2_regs ++{ ++ uint64_t lr_reg[8]; ++ double lr_fp[13]; ++ uint32_t __padding; ++ uint32_t lr_vrsave; ++ uint32_t lr_vreg[12][4] __attribute__ ((aligned (16))); ++ uint64_t lr_r1; ++ uint64_t lr_lr; ++} La_ppc64v2_regs; ++ ++/* Return values for calls from PLT on PPC64 in the ELFv2 ABI. */ ++typedef struct La_ppc64v2_retval ++{ ++ uint64_t lrv_r3; ++ uint64_t lrv_r4; ++ double lrv_fp[10]; ++ uint32_t lrv_vreg[8][4] __attribute__ ((aligned (16))); ++} La_ppc64v2_retval; ++ ++ ++__BEGIN_DECLS ++ ++extern Elf64_Addr la_ppc64v2_gnu_pltenter (Elf64_Sym *__sym, ++ unsigned int __ndx, ++ uintptr_t *__refcook, ++ uintptr_t *__defcook, ++ La_ppc64v2_regs *__regs, ++ unsigned int *__flags, ++ const char *__symname, ++ long int *__framesizep); ++extern unsigned int la_ppc64v2_gnu_pltexit (Elf64_Sym *__sym, ++ unsigned int __ndx, ++ uintptr_t *__refcook, ++ uintptr_t *__defcook, ++ const La_ppc64v2_regs *__inregs, ++ La_ppc64v2_retval *__outregs, ++ const char *__symname); ++ ++__END_DECLS ++ + #endif +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h +--- glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h 2014-05-29 14:11:20.000000000 -0500 +@@ -25,6 +25,8 @@ + struct La_ppc32_retval; + struct La_ppc64_regs; + struct La_ppc64_retval; ++struct La_ppc64v2_regs; ++struct La_ppc64v2_retval; + + #define ARCH_PLTENTER_MEMBERS \ + Elf32_Addr (*ppc32_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *, \ +@@ -34,7 +36,12 @@ + Elf64_Addr (*ppc64_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *, \ + uintptr_t *, struct La_ppc64_regs *, \ + unsigned int *, const char *name, \ +- long int *framesizep) ++ long int *framesizep); \ ++ Elf64_Addr (*ppc64v2_gnu_pltenter) (Elf64_Sym *, unsigned int, \ ++ uintptr_t *, uintptr_t *, \ ++ struct La_ppc64v2_regs *, \ ++ unsigned int *, const char *name, \ ++ long int *framesizep) + + #define ARCH_PLTEXIT_MEMBERS \ + unsigned int (*ppc32_gnu_pltexit) (Elf32_Sym *, unsigned int, \ +@@ -47,7 +54,14 @@ + uintptr_t *, \ + uintptr_t *, \ + const struct La_ppc64_regs *, \ +- struct La_ppc64_retval *, const char *) ++ struct La_ppc64_retval *, \ ++ const char *); \ ++ unsigned int (*ppc64v2_gnu_pltexit) (Elf64_Sym *, unsigned int, \ ++ uintptr_t *, \ ++ uintptr_t *, \ ++ const struct La_ppc64v2_regs *,\ ++ struct La_ppc64v2_retval *, \ ++ const char *) + + #include_next <ldsodefs.h> + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:11:20.000000000 -0500 +@@ -546,8 +546,13 @@ + + + /* Names of the architecture-specific auditing callback functions. */ ++#if _CALL_ELF != 2 + #define ARCH_LA_PLTENTER ppc64_gnu_pltenter + #define ARCH_LA_PLTEXIT ppc64_gnu_pltexit ++#else ++#define ARCH_LA_PLTENTER ppc64v2_gnu_pltenter ++#define ARCH_LA_PLTEXIT ppc64v2_gnu_pltexit ++#endif + + #endif /* dl_machine_h */ + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:11:20.000000000 -0500 +@@ -50,11 +50,8 @@ + /* Store the LR in the LR Save area. */ + std r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + cfi_offset (lr, FRAME_LR_SAVE) +- mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) +-/* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + bl JUMPTARGET(_dl_fixup) + #ifndef SHARED + nop +@@ -66,11 +63,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +@@ -85,18 +80,30 @@ + #undef FRAME_SIZE + #undef INT_PARMS + +- /* Stack layout: +- (Note: some of these are not required for the ELFv2 ABI.) +- +592 previous backchain +- +584 spill_r31 +- +576 spill_r30 +- +560 v1 +- +552 fp4 +- +544 fp3 +- +536 fp2 +- +528 fp1 +- +520 r4 +- +512 r3 ++ /* Stack layout: ELFv2 ABI. ++ +752 previous backchain ++ +744 spill_r31 ++ +736 spill_r30 ++ +720 v8 ++ +704 v7 ++ +688 v6 ++ +672 v5 ++ +656 v4 ++ +640 v3 ++ +624 v2 ++ +608 v1 ++ +600 fp10 ++ ELFv1 ABI +592 fp9 ++ +592 previous backchain +584 fp8 ++ +584 spill_r31 +576 fp7 ++ +576 spill_r30 +568 fp6 ++ +560 v1 +560 fp5 ++ +552 fp4 +552 fp4 ++ +544 fp3 +544 fp3 ++ +536 fp2 +536 fp2 ++ +528 fp1 +528 fp1 ++ +520 r4 +520 r4 ++ +512 r3 +512 r3 + return values + +504 free + +496 stackframe +@@ -157,10 +164,15 @@ + +8 CR save area + r1+0 stack back chain + */ +-#define FRAME_SIZE 592 ++#if _CALL_ELF == 2 ++# define FRAME_SIZE 752 ++# define VR_RTN 608 ++#else ++# define FRAME_SIZE 592 ++# define VR_RTN 560 ++#endif + #define INT_RTN 512 + #define FPR_RTN 528 +-#define VR_RTN 560 + #define STACK_FRAME 496 + #define CALLING_LR 488 + #define CALLING_SP 480 +@@ -205,18 +217,14 @@ + mflr r5 + std r7,INT_PARMS+32(r1) + std r8,INT_PARMS+40(r1) +-/* Store the LR in the LR Save area of the previous frame. */ +-/* XXX Do we have to do this? */ ++/* Store the LR in the LR Save area. */ + la r8,FRAME_SIZE(r1) + std r5,FRAME_SIZE+FRAME_LR_SAVE(r1) + cfi_offset (lr, FRAME_LR_SAVE) + std r5,CALLING_LR(r1) +- mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) + std r8,CALLING_SP(r1) +-/* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r12,.LC__dl_hwcap@toc(r2) + #ifdef SHARED + /* Load _rtld_local_ro._dl_hwcap. */ +@@ -319,11 +327,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +@@ -346,10 +352,11 @@ + lfd fp12,FPR_PARMS+88(r1) + lfd fp13,FPR_PARMS+96(r1) + /* Unwind the stack frame, and jump. */ +- ld r31,584(r1) +- ld r30,576(r1) ++ ld r31,FRAME_SIZE-8(r1) ++ ld r30,FRAME_SIZE-16(r1) + addi r1,r1,FRAME_SIZE + bctr ++ + L(do_pltexit): + la r10,(VR_PARMS+0)(r1) + la r9,(VR_PARMS+16)(r1) +@@ -383,11 +390,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + std r2,FRAME_TOC_SAVE(r1) + PPC64_LOAD_FUNCPTR r3 +@@ -413,16 +418,37 @@ + /* But return here and store the return values. */ + std r3,INT_RTN(r1) + std r4,INT_RTN+8(r1) +- stfd fp1,FPR_PARMS+0(r1) +- stfd fp2,FPR_PARMS+8(r1) ++ stfd fp1,FPR_RTN+0(r1) ++ stfd fp2,FPR_RTN+8(r1) + cmpdi cr0,r12,0 + la r10,VR_RTN(r1) +- stfd fp3,FPR_PARMS+16(r1) +- stfd fp4,FPR_PARMS+24(r1) ++ stfd fp3,FPR_RTN+16(r1) ++ stfd fp4,FPR_RTN+24(r1) ++#if _CALL_ELF == 2 ++ la r12,VR_RTN+16(r1) ++ stfd fp5,FPR_RTN+32(r1) ++ stfd fp6,FPR_RTN+40(r1) ++ li r5,32 ++ li r6,64 ++ stfd fp7,FPR_RTN+48(r1) ++ stfd fp8,FPR_RTN+56(r1) ++ stfd fp9,FPR_RTN+64(r1) ++ stfd fp10,FPR_RTN+72(r1) ++#endif + mr r3,r31 + mr r4,r30 + beq L(callpltexit) + stvx v2,0,r10 ++#if _CALL_ELF == 2 ++ stvx v3,0,r12 ++ stvx v4,r5,r10 ++ stvx v5,r5,r12 ++ addi r5,r5,64 ++ stvx v6,r6,r10 ++ stvx v7,r6,r12 ++ stvx v8,r5,r10 ++ stvx v9,r5,r12 ++#endif + L(callpltexit): + addi r5,r1,INT_PARMS + addi r6,r1,INT_RTN +@@ -434,18 +460,39 @@ + lwz r12,VR_VRSAVE(r1) + ld r3,INT_RTN(r1) + ld r4,INT_RTN+8(r1) +- lfd fp1,FPR_PARMS+0(r1) +- lfd fp2,FPR_PARMS+8(r1) ++ lfd fp1,FPR_RTN+0(r1) ++ lfd fp2,FPR_RTN+8(r1) + cmpdi cr0,r12,0 +- la r10,VR_RTN(r1) +- lfd fp3,FPR_PARMS+16(r1) +- lfd fp4,FPR_PARMS+24(r1) ++ la r11,VR_RTN(r1) ++ lfd fp3,FPR_RTN+16(r1) ++ lfd fp4,FPR_RTN+24(r1) ++#if _CALL_ELF == 2 ++ la r12,VR_RTN+16(r1) ++ lfd fp5,FPR_RTN+32(r1) ++ lfd fp6,FPR_RTN+40(r1) ++ li r30,32 ++ li r31,64 ++ lfd fp7,FPR_RTN+48(r1) ++ lfd fp8,FPR_RTN+56(r1) ++ lfd fp9,FPR_RTN+64(r1) ++ lfd fp10,FPR_RTN+72(r1) ++#endif + beq L(pltexitreturn) +- lvx v2,0,r10 ++ lvx v2,0,r11 ++#if _CALL_ELF == 2 ++ lvx v3,0,r12 ++ lvx v4,r30,r11 ++ lvx v5,r30,r12 ++ addi r30,r30,64 ++ lvx v6,r31,r11 ++ lvx v7,r31,r12 ++ lvx v8,r30,r11 ++ lvx v9,r30,r12 ++#endif + L(pltexitreturn): + ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) +- ld r31,584(r1) +- ld r30,576(r1) ++ ld r31,FRAME_SIZE-8(r1) ++ ld r30,FRAME_SIZE-16(r1) + mtlr r0 + ld r1,0(r1) + blr +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h 2014-05-29 14:11:20.000000000 -0500 +@@ -18,8 +18,16 @@ + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + ++#if _CALL_ELF != 2 + #define pltenter la_ppc64_gnu_pltenter + #define pltexit la_ppc64_gnu_pltexit + #define La_regs La_ppc64_regs + #define La_retval La_ppc64_retval + #define int_retval lrv_r3 ++#else ++#define pltenter la_ppc64v2_gnu_pltenter ++#define pltexit la_ppc64v2_gnu_pltexit ++#define La_regs La_ppc64v2_regs ++#define La_retval La_ppc64v2_retval ++#define int_retval lrv_r3 ++#endif |