From 37728e12c3f24934f0c1071fc52caa64b8fa21ae Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:38:58 +0000 Subject: [PATCH] [5/6] Rebase patches on new 1.2.12 release --- zlib-1.2.11-covscan-issues-rhel9.patch | 35 ---- zlib-1.2.11-covscan-issues.patch | 41 +---- zlib-1.2.11-optimized-s390.patch | 8 +- ...=> zlib-1.2.12-s390x-vectorize-crc32.patch | 171 +++++++++++------- 4 files changed, 116 insertions(+), 139 deletions(-) rename zlib-1.2.11-s390x-vectorize-crc32.patch => zlib-1.2.12-s390x-vectorize-crc32.patch (76%) diff --git a/zlib-1.2.11-covscan-issues-rhel9.patch b/zlib-1.2.11-covscan-issues-rhel9.patch index d692589..2763cbc 100644 --- a/zlib-1.2.11-covscan-issues-rhel9.patch +++ b/zlib-1.2.11-covscan-issues-rhel9.patch @@ -28,38 +28,3 @@ index 96891c2..1197928 100644 } return err; } -diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c -index 44e88a9..a753c17 100644 ---- a/contrib/minizip/zip.c -+++ b/contrib/minizip/zip.c -@@ -526,8 +526,8 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f - break; - } - -- if (uPosFound!=0) -- break; -+ if (uPosFound!=0) -+ break; - } - TRYFREE(buf); - return uPosFound; -diff --git a/deflate.c b/deflate.c -index 085abbe..3963e79 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -203,9 +203,10 @@ local const config configuration_table[10] = { - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ --#define CLEAR_HASH(s) \ -+#define CLEAR_HASH(s) do { \ - s->head[s->hash_size-1] = NIL; \ -- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); -+ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ -+} while (0) - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 --- -2.26.0 - diff --git a/zlib-1.2.11-covscan-issues.patch b/zlib-1.2.11-covscan-issues.patch index 28e8604..b816a5a 100644 --- a/zlib-1.2.11-covscan-issues.patch +++ b/zlib-1.2.11-covscan-issues.patch @@ -4,24 +4,10 @@ Date: Tue, 15 Oct 2019 11:27:15 +0200 Subject: [PATCH] fixed covscan issues --- - crc32.c | 2 +- deflate.c | 2 +- test/crc32_test.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) -diff --git a/crc32.c b/crc32.c -index 406d350..34132ea 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -302,7 +302,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - - if (!crc32_func) - crc32_func = crc32_z_ifunc(); -- return (*crc32_func)(crc, buf, len); -+ return (*crc32_func)(crc, buf, len); - } - - #endif /* defined(Z_IFUNC_ASM) || defined(Z_IFUNC_NATIVE) */ diff --git a/deflate.c b/deflate.c index 089285a..9b09718 100644 --- a/deflate.c @@ -35,27 +21,20 @@ index 089285a..9b09718 100644 bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : s->level == 0 ? deflate_stored(s, flush) : -diff --git a/test/crc32_test.c b/test/crc32_test.c -index 5d73128..2d2a6c7 100644 ---- a/test/crc32_test.c -+++ b/test/crc32_test.c -@@ -11,25 +11,25 @@ +diff -rup zlib-1.2.12/test/crc32_test.c.old zlib-1.2.12/test/crc32_test.c +--- zlib-1.2.12/test/crc32_test.c.old 2022-06-23 11:20:52.393574517 +0000 ++++ zlib-1.2.12/test/crc32_test.c 2022-06-23 11:21:50.195574517 +0000 +@@ -11,7 +11,7 @@ # include #endif - + -void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); +void test_crc32 OF((uLong crc, char* buf, z_size_t len, uLong chk, int line)); int main OF((void)); - + typedef struct { - int line; - uLong crc; -- Byte* buf; -+ char* buf; - int len; - uLong expect; - } crc32_test; - +@@ -24,12 +24,12 @@ typedef struct { + void test_crc32(crc, buf, len, chk, line) uLong crc; - Byte *buf; @@ -66,9 +45,7 @@ index 5d73128..2d2a6c7 100644 { - uLong res = crc32(crc, buf, len); + uLong res = crc32(crc, (Bytef *) buf, len); - if (res != chk) { + if (res != chk) { fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", line, (unsigned int)res, (unsigned int)chk); --- -2.19.1 diff --git a/zlib-1.2.11-optimized-s390.patch b/zlib-1.2.11-optimized-s390.patch index 50a5151..3999592 100644 --- a/zlib-1.2.11-optimized-s390.patch +++ b/zlib-1.2.11-optimized-s390.patch @@ -2,10 +2,10 @@ diff --git a/deflate.c b/deflate.c index 1ec7614..b724c8d 100644 --- a/deflate.c +++ b/deflate.c -@@ -1233,15 +1233,16 @@ local void lm_init (s) - /* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ +@@ -1322,15 +1322,16 @@ local void lm_init (s) + #define longest_match longest_match_default + #endif /* Z_POWER_OPT */ + -local uInt longest_match(s, cur_match) +local uInt longest_match(s, pcur_match) deflate_state *s; diff --git a/zlib-1.2.11-s390x-vectorize-crc32.patch b/zlib-1.2.12-s390x-vectorize-crc32.patch similarity index 76% rename from zlib-1.2.11-s390x-vectorize-crc32.patch rename to zlib-1.2.12-s390x-vectorize-crc32.patch index 71af7ad..d354940 100644 --- a/zlib-1.2.11-s390x-vectorize-crc32.patch +++ b/zlib-1.2.12-s390x-vectorize-crc32.patch @@ -1,4 +1,4 @@ -From 2dfdc5b7d6943c0ac60eef63e361e2a50f9da610 Mon Sep 17 00:00:00 2001 +From 957bc67cfb4e01403c01fe6243850383183a7c19 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Thu, 19 Mar 2020 11:52:03 +0100 Subject: [PATCH] s390x: vectorize crc32 @@ -8,15 +8,18 @@ about them. At runtime, check whether kernel supports vector extensions (it has to be not just the CPU, but also the kernel) and choose between the regular and the vectorized implementations. --- - Makefile.in | 9 ++ - configure | 28 ++++++ - contrib/s390/crc32-vx.c | 195 ++++++++++++++++++++++++++++++++++++++++ - crc32.c | 55 +++++++++++- - 4 files changed, 285 insertions(+), 2 deletions(-) + Makefile.in | 9 ++ + configure | 28 +++++ + contrib/gcc/zifunc.h | 21 +++- + contrib/s390/crc32-vx.c | 195 ++++++++++++++++++++++++++++++++ + contrib/s390/crc32_z_resolver.c | 41 +++++++ + crc32.c | 11 +- + 6 files changed, 301 insertions(+), 4 deletions(-) create mode 100644 contrib/s390/crc32-vx.c + create mode 100644 contrib/s390/crc32_z_resolver.c diff --git a/Makefile.in b/Makefile.in -index 6070dcc..9e9743b 100644 +index 2e78f38..04c2f5d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -29,6 +29,7 @@ LDFLAGS= @@ -27,9 +30,9 @@ index 6070dcc..9e9743b 100644 STATICLIB=libz.a SHAREDLIB=libz.so -@@ -179,6 +180,9 @@ crc32_power8.o: $(SRCDIR)contrib/power8-crc/vec_crc32.c - crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c +@@ -179,6 +180,9 @@ crc32.o: $(SRCDIR)crc32.c + crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c + $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c +crc32-vx.o: $(SRCDIR)contrib/s390/crc32-vx.c + $(CC) $(CFLAGS) $(VGFMAFLAG) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/crc32-vx.c @@ -37,7 +40,7 @@ index 6070dcc..9e9743b 100644 deflate.o: $(SRCDIR)deflate.c $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c -@@ -234,6 +238,11 @@ crc32.lo: $(SRCDIR)crc32.c +@@ -229,6 +233,11 @@ crc32.lo: $(SRCDIR)crc32.c $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -@mv objs/crc32.o $@ @@ -46,15 +49,15 @@ index 6070dcc..9e9743b 100644 + $(CC) $(SFLAGS) $(VGFMAFLAG) $(ZINC) -DPIC -c -o objs/crc32-vx.o $(SRCDIR)contrib/s390/crc32-vx.c + -@mv objs/crc32-vx.o $@ + - deflate.lo: $(SRCDIR)deflate.c + crc32_z_power8.lo: $(SRCDIR)contrib/power/crc32_z_power8.c -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c diff --git a/configure b/configure -index 70ed86b..7941f75 100755 +index dd01b5c..acf94a5 100755 --- a/configure +++ b/configure -@@ -923,6 +923,32 @@ EOF - fi +@@ -927,6 +927,32 @@ else + echo "Checking for sys/sdt.h ... No." | tee -a configure.log fi +# check if we are compiling for s390 and binutils support vector extensions @@ -86,7 +89,7 @@ index 70ed86b..7941f75 100755 # show the results in the log echo >> configure.log echo ALL = $ALL >> configure.log -@@ -955,6 +981,7 @@ echo mandir = $mandir >> configure.log +@@ -960,6 +986,7 @@ echo mandir = $mandir >> configure.log echo prefix = $prefix >> configure.log echo sharedlibdir = $sharedlibdir >> configure.log echo uname = $uname >> configure.log @@ -94,7 +97,7 @@ index 70ed86b..7941f75 100755 # udpate Makefile with the configure results sed < ${SRCDIR}Makefile.in " -@@ -964,6 +991,7 @@ sed < ${SRCDIR}Makefile.in " +@@ -969,6 +996,7 @@ sed < ${SRCDIR}Makefile.in " /^LDFLAGS *=/s#=.*#=$LDFLAGS# /^LDSHARED *=/s#=.*#=$LDSHARED# /^CPP *=/s#=.*#=$CPP# @@ -102,6 +105,40 @@ index 70ed86b..7941f75 100755 /^STATICLIB *=/s#=.*#=$STATICLIB# /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +diff --git a/contrib/gcc/zifunc.h b/contrib/gcc/zifunc.h +index daf4fe4..b62379e 100644 +--- a/contrib/gcc/zifunc.h ++++ b/contrib/gcc/zifunc.h +@@ -8,9 +8,28 @@ + + /* Helpers for arch optimizations */ + ++#if defined(__clang__) ++#if __has_feature(coverage_sanitizer) ++#define Z_IFUNC_NO_SANCOV __attribute__((no_sanitize("coverage"))) ++#else /* __has_feature(coverage_sanitizer) */ ++#define Z_IFUNC_NO_SANCOV ++#endif /* __has_feature(coverage_sanitizer) */ ++#else /* __clang__ */ ++#define Z_IFUNC_NO_SANCOV ++#endif /* __clang__ */ ++ ++#ifdef __s390__ ++#define Z_IFUNC_PARAMS unsigned long hwcap ++#define Z_IFUNC_ATTRS Z_IFUNC_NO_SANCOV ++#else /* __s390__ */ ++#define Z_IFUNC_PARAMS void ++#define Z_IFUNC_ATTRS ++#endif /* __s390__ */ ++ + #define Z_IFUNC(fname) \ + typeof(fname) fname __attribute__ ((ifunc (#fname "_resolver"))); \ +- local typeof(fname) *fname##_resolver(void) ++ Z_IFUNC_ATTRS \ ++ local typeof(fname) *fname##_resolver(Z_IFUNC_PARAMS) + /* This is a helper macro to declare a resolver for an indirect function + * (ifunc). Let's say you have function + * diff --git a/contrib/s390/crc32-vx.c b/contrib/s390/crc32-vx.c new file mode 100644 index 0000000..fa5387c @@ -303,16 +340,14 @@ index 0000000..fa5387c + + return ((uv4si)v2)[2]; +} -diff --git a/crc32.c b/crc32.c -index 34132ea..dfa33ef 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -252,12 +252,54 @@ unsigned long crc32_vpmsum(unsigned long, const unsigned char FAR *, z_size_t); - #endif - #endif - -+#ifdef HAVE_S390X_VX +diff --git a/contrib/s390/crc32_z_resolver.c b/contrib/s390/crc32_z_resolver.c +new file mode 100644 +index 0000000..9749cab +--- /dev/null ++++ b/contrib/s390/crc32_z_resolver.c +@@ -0,0 +1,41 @@ +#include ++#include "../gcc/zifunc.h" + +#define VX_MIN_LEN 64 +#define VX_ALIGNMENT 16L @@ -322,17 +357,17 @@ index 34132ea..dfa33ef 100644 + +local unsigned long s390_crc32_vx(unsigned long crc, const unsigned char FAR *buf, z_size_t len) +{ -+ uint64_t prealign, aligned, remaining; ++ uintptr_t prealign, aligned, remaining; + + if (buf == Z_NULL) return 0UL; + + if (len < VX_MIN_LEN + VX_ALIGN_MASK) -+ return crc32_big(crc, buf, len); ++ return crc32_z_default(crc, buf, len); + + if ((uintptr_t)buf & VX_ALIGN_MASK) { + prealign = VX_ALIGNMENT - ((uintptr_t)buf & VX_ALIGN_MASK); + len -= prealign; -+ crc = crc32_big(crc, buf, prealign); ++ crc = crc32_z_default(crc, buf, prealign); + buf += prealign; + } + aligned = len & ~VX_ALIGN_MASK; @@ -341,53 +376,53 @@ index 34132ea..dfa33ef 100644 + crc = crc32_le_vgfm_16(crc ^ 0xffffffff, buf, (size_t)aligned) ^ 0xffffffff; + + if (remaining) -+ crc = crc32_big(crc, buf + aligned, remaining); ++ crc = crc32_z_default(crc, buf + aligned, remaining); + + return crc; +} -+#endif + - /* due to a quirk of gnu_indirect_function - "local" (aka static) is applied to - * crc32_z which is not desired. crc32_z_ifunc is implictly "local" */ - #ifndef Z_IFUNC_ASM - local - #endif --unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, z_size_t) -+unsigned long (*(crc32_z_ifunc( -+#ifdef __s390__ -+unsigned long hwcap -+#else -+void -+#endif -+)))(unsigned long, const unsigned char FAR *, z_size_t) - { - #if _ARCH_PWR8==1 - #if defined(__BUILTIN_CPU_SUPPORTS__) -@@ -269,6 +311,11 @@ unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, - #endif - #endif /* _ARCH_PWR8 */ - -+#ifdef HAVE_S390X_VX ++Z_IFUNC(crc32_z) ++{ + if (hwcap & HWCAP_S390_VX) + return s390_crc32_vx; -+#endif -+ - /* return a function pointer for optimized arches here */ ++ return crc32_z_default; ++} +diff --git a/crc32.c b/crc32.c +index ae7b7e7..c212261 100644 +--- a/crc32.c ++++ b/crc32.c +@@ -736,12 +736,12 @@ local z_word_t crc_word_big(data) + #endif - #ifdef DYNAMIC_CRC_TABLE -@@ -301,7 +348,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - static unsigned long ZEXPORT (*crc32_func)(unsigned long, const unsigned char FAR *, z_size_t) = NULL; + /* ========================================================================= */ +-#ifdef Z_POWER_OPT ++#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) + /* Rename function so resolver can use its symbol. The default version will be + * returned by the resolver if the host has no support for an optimized version. + */ + #define crc32_z crc32_z_default +-#endif /* Z_POWER_OPT */ ++#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ - if (!crc32_func) -- crc32_func = crc32_z_ifunc(); -+ crc32_func = crc32_z_ifunc( -+#ifdef __s390__ -+ getauxval(AT_HWCAP) -+#endif -+ ); - return (*crc32_func)(crc, buf, len); + unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; +@@ -1064,10 +1064,15 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + return crc ^ 0xffffffff; } +-#ifdef Z_POWER_OPT ++#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) + #undef crc32_z ++#ifdef Z_POWER_OPT + #include "contrib/power/crc32_z_resolver.c" + #endif /* Z_POWER_OPT */ ++#ifdef HAVE_S390X_VX ++#include "contrib/s390/crc32_z_resolver.c" ++#endif /* HAVE_S390X_VX */ ++#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ + + #endif + -- -2.25.1 +2.35.1