Author: adconrad Date: 2014-01-10 17:43:01 +0000 (Fri, 10 Jan 2014) New Revision: 5907
Added: glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.diff Removed: glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch Modified: glibc-package/branches/eglibc-2.18/debian/changelog glibc-package/branches/eglibc-2.18/debian/patches/series Log: Rename last patch from .patch to .diff Modified: glibc-package/branches/eglibc-2.18/debian/changelog =================================================================== --- glibc-package/branches/eglibc-2.18/debian/changelog 2014-01-10 17:37:25 UTC (rev 5906) +++ glibc-package/branches/eglibc-2.18/debian/changelog 2014-01-10 17:43:01 UTC (rev 5907) @@ -10,7 +10,7 @@ drop buggy SSE4.2 srtstr implementations in favour of an SSE2 version. * debian/patches/any/cvs-ptrace_peeksiginfo_args.diff: Prepend __ prefix to ptrace_peeksiginfo_args struct to prevent namespace clash w/ linux. - * debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch: New upstream fix to + * debian/patches/powerpc/cvs-ppc64-vdso-ifunc.diff: Pull upstream fix to squash undefined behaviour in PowerPC64 vDSO IFUNC symbol resolutions. [ Aurelien Jarno ] Copied: glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.diff (from rev 5906, glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch) =================================================================== --- glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.diff (rev 0) +++ glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.diff 2014-01-10 17:43:01 UTC (rev 5907) @@ -0,0 +1,86 @@ +commit 76a9b9986141b1a7d9fd290c349d27fcee780c7a +Author: Adhemerval Zanella <azane...@linux.vnet.ibm.com> +Date: Thu Nov 7 05:34:22 2013 -0600 + + PowerPC: Fix vDSO missing ODP entries + + This patch fixes the vDSO symbol used directed in IFUNC resolver where + they do not have an associated ODP entry leading to undefined behavior + in some cases. It adds an artificial OPD static entry to such cases + and set its TOC to non 0 to avoid triggering lazy resolutions. + +2013-11-08 Adhemerval Zanella <azane...@linux.vnet.ibm.com> + + * sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h (VDSO_IFUNC_RET): + Add artificial ODP entry for vDSO symbol for PPC64. + * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c: Adjust includes. + * sysdeps/unix/sysv/linux/powerpc/time.c: Likewise. + +diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h b/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h +index ba54de4..d189169 100644 +--- a/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h ++++ b/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h +@@ -41,12 +41,32 @@ extern void *__vdso_sigtramp32; + + extern void *__vdso_time; + +-/* This macro is needed for PPC64 to return a skeleton OPD entry of a vDSO +- symbol. This works because _dl_vdso_vsym always return the function +- address, and no vDSO symbols use the TOC or chain pointers from the OPD +- so we can allow them to be garbage. */ + #if defined(__PPC64__) || defined(__powerpc64__) +-#define VDSO_IFUNC_RET(value) ((void *) &(value)) ++/* The correct solution is for _dl_vdso_vsym to return the address of the OPD ++ for the kernel VDSO function. That address would then be stored in the ++ __vdso_* variables and returned as the result of the IFUNC resolver function. ++ Yet, the kernel does not contain any OPD entries for the VDSO functions ++ (incomplete implementation). However, PLT relocations for IFUNCs still expect ++ the address of an OPD to be returned from the IFUNC resolver function (since ++ PLT entries on PPC64 are just copies of OPDs). The solution for now is to ++ create an artificial static OPD for each VDSO function returned by a resolver ++ function. The TOC value is set to a non-zero value to avoid triggering lazy ++ symbol resolution via .glink0/.plt0 for a zero TOC (requires thread-safe PLT ++ sequences) when the dynamic linker isn't prepared for it e.g. RTLD_NOW. None ++ of the kernel VDSO routines use the TOC or AUX values so any non-zero value ++ will work. Note that function pointer comparisons will not use this artificial ++ static OPD since those are resolved via ADDR64 relocations and will point at ++ the non-IFUNC default OPD for the symbol. Lastly, because the IFUNC relocations ++ are processed immediately at startup the resolver functions and this code need ++ not be thread-safe, but if the caller writes to a PLT slot it must do so in a ++ thread-safe manner with all the required barriers. */ ++#define VDSO_IFUNC_RET(value) \ ++ ({ \ ++ static Elf64_FuncDesc vdso_opd = { .fd_toc = ~0x0 }; \ ++ vdso_opd.fd_func = (Elf64_Addr)value; \ ++ &vdso_opd; \ ++ }) ++ + #else + #define VDSO_IFUNC_RET(value) ((void *) (value)) + #endif +diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +index 6506d75..48c3f84 100644 +--- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c ++++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +@@ -22,6 +22,7 @@ + + # include <dl-vdso.h> + # include <bits/libc-vdso.h> ++# include <dl-machine.h> + + void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); + +diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c +index 66b4eb3..2d77ece 100644 +--- a/sysdeps/unix/sysv/linux/powerpc/time.c ++++ b/sysdeps/unix/sysv/linux/powerpc/time.c +@@ -20,7 +20,9 @@ + + # include <time.h> + # include <sysdep.h> ++# include <dl-vdso.h> + # include <bits/libc-vdso.h> ++# include <dl-machine.h> + + void *time_ifunc (void) asm ("time"); + Deleted: glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch =================================================================== --- glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch 2014-01-10 17:37:25 UTC (rev 5906) +++ glibc-package/branches/eglibc-2.18/debian/patches/powerpc/cvs-ppc64-vdso-ifunc.patch 2014-01-10 17:43:01 UTC (rev 5907) @@ -1,86 +0,0 @@ -commit 76a9b9986141b1a7d9fd290c349d27fcee780c7a -Author: Adhemerval Zanella <azane...@linux.vnet.ibm.com> -Date: Thu Nov 7 05:34:22 2013 -0600 - - PowerPC: Fix vDSO missing ODP entries - - This patch fixes the vDSO symbol used directed in IFUNC resolver where - they do not have an associated ODP entry leading to undefined behavior - in some cases. It adds an artificial OPD static entry to such cases - and set its TOC to non 0 to avoid triggering lazy resolutions. - -2013-11-08 Adhemerval Zanella <azane...@linux.vnet.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h (VDSO_IFUNC_RET): - Add artificial ODP entry for vDSO symbol for PPC64. - * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c: Adjust includes. - * sysdeps/unix/sysv/linux/powerpc/time.c: Likewise. - -diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h b/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h -index ba54de4..d189169 100644 ---- a/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h -+++ b/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h -@@ -41,12 +41,32 @@ extern void *__vdso_sigtramp32; - - extern void *__vdso_time; - --/* This macro is needed for PPC64 to return a skeleton OPD entry of a vDSO -- symbol. This works because _dl_vdso_vsym always return the function -- address, and no vDSO symbols use the TOC or chain pointers from the OPD -- so we can allow them to be garbage. */ - #if defined(__PPC64__) || defined(__powerpc64__) --#define VDSO_IFUNC_RET(value) ((void *) &(value)) -+/* The correct solution is for _dl_vdso_vsym to return the address of the OPD -+ for the kernel VDSO function. That address would then be stored in the -+ __vdso_* variables and returned as the result of the IFUNC resolver function. -+ Yet, the kernel does not contain any OPD entries for the VDSO functions -+ (incomplete implementation). However, PLT relocations for IFUNCs still expect -+ the address of an OPD to be returned from the IFUNC resolver function (since -+ PLT entries on PPC64 are just copies of OPDs). The solution for now is to -+ create an artificial static OPD for each VDSO function returned by a resolver -+ function. The TOC value is set to a non-zero value to avoid triggering lazy -+ symbol resolution via .glink0/.plt0 for a zero TOC (requires thread-safe PLT -+ sequences) when the dynamic linker isn't prepared for it e.g. RTLD_NOW. None -+ of the kernel VDSO routines use the TOC or AUX values so any non-zero value -+ will work. Note that function pointer comparisons will not use this artificial -+ static OPD since those are resolved via ADDR64 relocations and will point at -+ the non-IFUNC default OPD for the symbol. Lastly, because the IFUNC relocations -+ are processed immediately at startup the resolver functions and this code need -+ not be thread-safe, but if the caller writes to a PLT slot it must do so in a -+ thread-safe manner with all the required barriers. */ -+#define VDSO_IFUNC_RET(value) \ -+ ({ \ -+ static Elf64_FuncDesc vdso_opd = { .fd_toc = ~0x0 }; \ -+ vdso_opd.fd_func = (Elf64_Addr)value; \ -+ &vdso_opd; \ -+ }) -+ - #else - #define VDSO_IFUNC_RET(value) ((void *) (value)) - #endif -diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c -index 6506d75..48c3f84 100644 ---- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c -+++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c -@@ -22,6 +22,7 @@ - - # include <dl-vdso.h> - # include <bits/libc-vdso.h> -+# include <dl-machine.h> - - void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); - -diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c -index 66b4eb3..2d77ece 100644 ---- a/sysdeps/unix/sysv/linux/powerpc/time.c -+++ b/sysdeps/unix/sysv/linux/powerpc/time.c -@@ -20,7 +20,9 @@ - - # include <time.h> - # include <sysdep.h> -+# include <dl-vdso.h> - # include <bits/libc-vdso.h> -+# include <dl-machine.h> - - void *time_ifunc (void) asm ("time"); - Modified: glibc-package/branches/eglibc-2.18/debian/patches/series =================================================================== --- glibc-package/branches/eglibc-2.18/debian/patches/series 2014-01-10 17:37:25 UTC (rev 5906) +++ glibc-package/branches/eglibc-2.18/debian/patches/series 2014-01-10 17:43:01 UTC (rev 5907) @@ -178,7 +178,7 @@ mips/cvs-prlimit64.diff powerpc/local-math-logb.diff -powerpc/cvs-ppc64-vdso-ifunc.patch +powerpc/cvs-ppc64-vdso-ifunc.diff s390/submitted-nexttowardf.diff s390/cvs-s390-tls-got-pointer.diff -- To UNSUBSCRIBE, email to debian-glibc-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1w1g6n-0002ag...@moszumanska.debian.org