diff --git a/unzip-6.0-crc-builtin.patch b/unzip-6.0-crc-builtin.patch new file mode 100644 index 0000000000000000000000000000000000000000..fb7fa8708b6f08975152acf25ea2e40837c5a84f --- /dev/null +++ b/unzip-6.0-crc-builtin.patch @@ -0,0 +1,141 @@ +From 1ae8eea237f05a590d8da38528dceab8a7b4290b Mon Sep 17 00:00:00 2001 +From: Euler Hanzh <18221254@bjtu.edu.cn> +Date: Mon, 17 May 2021 19:28:18 +0800 +Subject: [PATCH] This patch is created for performance optimization in crc calculation only suitable for openeuler of aarch64 architecture. + The speed of unzip software when running can be accelerate by nearly 100% than before. + +--- + unzip60/crc32.c | 28 ++++++++++++++++++++++++++++ + unzip60/crc32.h | 4 ++++ + unzip60/unix/Makefile | 19 ++++++++++++++----- + 3 files changed, 46 insertions(+), 5 deletions(-) + +diff --git a/unzip60/crc32.c b/unzip60/crc32.c +index 02f504d..fa73a3e 100644 +--- a/unzip60/crc32.c ++++ b/unzip60/crc32.c +@@ -675,7 +675,32 @@ void free_crc_table() + + #endif /* (IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */ + ++#ifdef ARCH_AARCH64 ++u_int32_t crc32(u_int32_t crc,const u_int8_t *p, unsigned int len) ++{ ++ int64_t length = len; ++ ++ while ((length -= sizeof(u_int64_t)) >=0) { ++ __builtin_aarch64_crc32cx(crc, *((u_int64_t *)p)); ++ p += sizeof(u_int64_t); ++ } + ++ if (length & sizeof(u_int32_t)) { ++ __builtin_aarch64_crc32cw(crc, *((u_int32_t *)p)); ++ p += sizeof(u_int32_t); ++ } ++ ++ if (length & sizeof(u_int16_t)) { ++ __builtin_aarch64_crc32ch(crc, *((u_int16_t *)p)); ++ p += sizeof(u_int16_t); ++ } ++ ++ if (length & sizeof(u_int8_t)) ++ __builtin_aarch64_crc32cb(crc, *p); ++ ++ return crc; ++} ++#else + /* ========================================================================= */ + ulg crc32(crc, buf, len) + ulg crc; /* crc shift register */ +@@ -726,6 +751,9 @@ ulg crc32(crc, buf, len) + + return REV_BE(c) ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */ + } ++ ++#endif /* !ARCH_AARCH64*/ ++ + #endif /* !ASM_CRC */ + #endif /* !CRC_TABLE_ONLY */ + #endif /* !USE_ZLIB */ +diff --git a/unzip60/crc32.h b/unzip60/crc32.h +index 83af240..b5e386a 100644 +--- a/unzip60/crc32.h ++++ b/unzip60/crc32.h +@@ -36,7 +36,11 @@ + # undef IZ_CRC_BE_OPTIMIZ + # endif + #else /* !(USE_ZLIB || CRC_TABLE_ONLY) */ ++# ifdef ARCH_AARCH64 ++ u_int32_t crc32(u_int32_t crc,const u_int8_t *p, unsigned int len); ++# else + ulg crc32 OF((ulg crc, ZCONST uch *buf, extent len)); ++# endif + #endif /* ?(USE_ZLIB || CRC_TABLE_ONLY) */ + + #ifndef CRC_32_TAB +diff --git a/unzip60/unix/Makefile b/unzip60/unix/Makefile +index ab32270..39b2263 100644 +--- a/unzip60/unix/Makefile ++++ b/unzip60/unix/Makefile +@@ -40,7 +40,8 @@ + + # Defaults most systems use (use LOCAL_UNZIP in environment to add flags, + # such as -DDOSWILD). +- ++TARGET_ARCH = $(shell uname -m) ++ARCH = $(shell getconf LONG_BIT) + # UnZip flags + CC = cc# try using "gcc" target rather than changing this (CC and LD + LD = $(CC)# must match, else "unresolved symbol: ___main" is possible) +@@ -54,6 +55,12 @@ LFLAGS1 = + LF = -o unzip$E $(LFLAGS1) + LF2 = -s + ++ifeq ($(TARGET_ARCH),aarch64) ++CFF = -DARCH=$(ARCH) -march=armv8.1-a -D ARCH_AARCH64 ++else ++CFF = ++endif ++ + # UnZipSFX flags + SL = -o unzipsfx$E $(LFLAGS1) + SL2 = $(LF2) +@@ -77,6 +84,8 @@ M = unix + SHELL = /bin/sh + MAKEF = -f unix/Makefile + ++ ++ + # Version info for unix/unix.c + HOST_VERSINFO=-DIZ_CC_NAME='\"\$$(CC) \"' -DIZ_OS_NAME='\"`uname -a`\"' + +@@ -231,13 +240,13 @@ generic_msg: + # yes, we should be able to use the $O macro to combine these two, but it + # fails on some brain-damaged makes (e.g., AIX's)...no big deal + .c.o: +- $(CC) -c $(CF) $*.c ++ $(CC) -c $(CF) $(CFF) $*.c + + .c.obj: +- $(CC) -c $(CF) $*.c ++ $(CC) -c $(CF) $(CFF) $*.c + + .c.pic.o: +- $(CC) -c $(CF) -o $@ $*.c ++ $(CC) -c $(CF) $(CFF) -o $@ $*.c + + # this doesn't work...directories are always a pain with implicit rules + #.1.txt: man/$< +@@ -329,7 +338,7 @@ unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h + $(CC) -c $(CF) -DSFX -o $@ unzip.c + + crc32_$O: crc32.c $(UNZIP_H) zip.h crc32.h +- $(CC) -c $(CF) -DSFX -o $@ crc32.c ++ $(CC) -c $(CF) -DSFX $(CFF) -o $@ crc32.c + + crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h + $(CC) -c $(CF) -DSFX -o $@ crypt.c +-- +2.23.0 + + diff --git a/unzip.spec b/unzip.spec index 86ebf2e1f5627cfe6f55b3689d66b5452376e986..5e193b48548d9572407652192fa14d0a4cbaad69 100644 --- a/unzip.spec +++ b/unzip.spec @@ -1,8 +1,8 @@ Name: unzip Version: 6.0 -Release: 45 +Release: 46 Summary: A utility for unpacking zip files -License: BSD +License: Info-ZIP,Public Domain URL: http://www.info-zip.org/UnZip.html Source: http://downloads.sourceforge.net/infozip/unzip60.tar.gz @@ -36,6 +36,7 @@ Patch6002: CVE-2019-13232.patch Patch6003: CVE-2019-13232-fur1.patch Patch9000: CVE-2019-13232-fur2.patch +Patch12000: unzip-6.0-crc-builtin.patch BuildRequires: bzip2-devel @@ -70,6 +71,9 @@ Package help includes man pages for unzip. %{_mandir}/man1/* %changelog +* Tues May 12 2021 openEuler hanzhelii <18221254@bjtu.edu.cn> - 6.0-46 +- add unzip-6.0-crc-builtin.patch + * Mon Mar 2 2020 openEuler Buildteam - 6.0-45 - delete garbled characters