diff --git a/srcpkgs/musl/patches/ppc64-vrregset-t-fix-layout.patch b/srcpkgs/musl/patches/ppc64-vrregset-t-fix-layout.patch new file mode 100644 index 00000000000..5ca68a35aaf --- /dev/null +++ b/srcpkgs/musl/patches/ppc64-vrregset-t-fix-layout.patch @@ -0,0 +1,45 @@ +commit 3c59a868956636bc8adafb1b168d090897692532 +Author: Rich Felker +Date: Wed May 22 15:17:12 2019 -0400 + + fix vrregset_t layout and member naming on powerpc64 + + the mistaken layout seems to have been adapted from 32-bit powerpc, + where vscr and vrsave are packed into the same 128-bit slot in a way + that looks like it relies on non-overlapping-ness of the value bits in + big endian. + + the powerpc64 port accounted for the fact that the 64-bit ABI puts + each in its own 128-bit slot, but ordered them incorrectly (matching + the bit order used on the 32-bit ABI), and failed to account for vscr + being padded according to endianness so that it can be accessed via + vector moves. + + in addition to ABI layout, our definition used different logical + member layout/naming from glibc, where vscr is a structure to + facilitate access as a 32-bit word or a 128-bit vector. the + inconsistency here was unintentional, so fix it. + +diff --git a/arch/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h +index 34693a68..94c7a327 100644 +--- arch/powerpc64/bits/signal.h ++++ arch/powerpc64/bits/signal.h +@@ -17,10 +17,14 @@ typedef struct { + + typedef struct { + unsigned __int128 vrregs[32]; +- unsigned _pad[3]; +- unsigned vrsave; +- unsigned vscr; +- unsigned _pad2[3]; ++ struct { ++#if __BIG_ENDIAN__ ++ unsigned _pad[3], vscr_word; ++#else ++ unsigned vscr_word, _pad[3]; ++#endif ++ } vscr; ++ unsigned vrsave, _pad[3]; + } vrregset_t; + + typedef struct sigcontext { diff --git a/srcpkgs/musl/patches/ppc64-vrregset-t-vrregs-fix.patch b/srcpkgs/musl/patches/ppc64-vrregset-t-vrregs-fix.patch new file mode 100644 index 00000000000..0d2664e6c97 --- /dev/null +++ b/srcpkgs/musl/patches/ppc64-vrregset-t-vrregs-fix.patch @@ -0,0 +1,29 @@ +commit ac304227bb3ea1787d581f17d76a5f5f3abff51f +Author: Rich Felker +Date: Wed May 22 18:28:32 2019 -0400 + + make powerpc64 vrregset_t logical layout match expected API + + between v2 and v3 of the powerpc64 port patch, the change was made + from a 32x4 array of 32-bit unsigned ints for vrregs[] to a 32-element + array of __int128. this mismatches the API applications working with + mcontext_t expect from glibc, and seems to have been motivated by a + misinterpretation of a comment on how aarch64 did things as a + suggestion to do the same on powerpc64. + +diff --git a/arch/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h +index 94c7a327..2cc0604c 100644 +--- arch/powerpc64/bits/signal.h ++++ arch/powerpc64/bits/signal.h +@@ -16,7 +16,10 @@ typedef struct { + } fpregset_t; + + typedef struct { +- unsigned __int128 vrregs[32]; ++#ifdef __GNUC__ ++ __attribute__((__aligned__(16))) ++#endif ++ unsigned vrregs[32][4]; + struct { + #if __BIG_ENDIAN__ + unsigned _pad[3], vscr_word; diff --git a/srcpkgs/musl/template b/srcpkgs/musl/template index 4ebe3f86431..8f7ea0c9dc7 100644 --- a/srcpkgs/musl/template +++ b/srcpkgs/musl/template @@ -1,7 +1,7 @@ # Template file for 'musl'. pkgname=musl version=1.1.22 -revision=2 +revision=3 archs="*-musl" build_style=gnu-configure configure_args="--prefix=/usr --disable-gcc-wrapper"