Index: sys/conf/NOTES =================================================================== --- sys/conf/NOTES +++ sys/conf/NOTES @@ -2981,4 +2981,6 @@ # Enable legacy /dev/spigenN name aliases for /dev/spigenX.Y devices. options SPIGEN_LEGACY_CDEVNAME # legacy device names for spigen +# Compression supports. +device zlib # gzip/zlib compression/decompression library device xz # xz_embedded LZMA de-compression library Index: sys/conf/files =================================================================== --- sys/conf/files +++ sys/conf/files @@ -4005,6 +4005,42 @@ libkern/timingsafe_bcmp.c standard libkern/zlib.c optional crypto | geom_uzip | ipsec | \ ipsec_support | mxge | netgraph_deflate | ddb_ctf | gzio +contrib/zlib/adler32.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +contrib/zlib/compress.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C} -Wno-cast-qual" +contrib/zlib/crc32.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C} -Wno-cast-qual" +contrib/zlib/deflate.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C} -Wno-cast-qual" +contrib/zlib/inffast.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +contrib/zlib/inflate.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +contrib/zlib/inftrees.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +contrib/zlib/trees.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +contrib/zlib/uncompr.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C} -Wno-cast-qual" +contrib/zlib/zutil.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C} -DHAVE_MEMCPY -DMY_ZCALLOC" +dev/zlib/zlib_mod.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" +dev/zlib/zcalloc.c optional crypto | geom_uzip | ipsec | \ + ipsec_support | mxge | ddb_ctf | gzio | zlib \ + compile-with "${ZLIB_C}" net/altq/altq_cbq.c optional altq net/altq/altq_codel.c optional altq net/altq/altq_hfsc.c optional altq Index: sys/conf/kern.pre.mk =================================================================== --- sys/conf/kern.pre.mk +++ sys/conf/kern.pre.mk @@ -173,6 +173,12 @@ NORMAL_FWO= ${LD} -b binary --no-warn-mismatch -d -warn-common -r \ -m ${LD_EMULATION} -o ${.TARGET} ${.ALLSRC:M*.fw} +# for zlib in the kernel +ZLIB_CFLAGS+= -I$S/dev/zlib +ZLIB_CFLAGS+= -DMY_ZCALLOC +ZLIB_CFLAGS+= -DHAVE_MEMCPY +ZLIB_C= ${CC} -c ${ZLIB_CFLAGS} ${CFLAGS} ${.IMPSRC} + # for ZSTD in the kernel (include zstd/lib/freebsd before other CFLAGS) ZSTD_C= ${CC} -c -DZSTD_HEAPMODE=1 -I$S/contrib/zstd/lib/freebsd ${CFLAGS} -I$S/contrib/zstd/lib -I$S/contrib/zstd/lib/common ${WERROR} -Wno-inline -Wno-missing-prototypes ${PROF} -U__BMI__ ${.IMPSRC} Index: sys/conf/kmod.mk =================================================================== --- sys/conf/kmod.mk +++ sys/conf/kmod.mk @@ -104,6 +104,8 @@ __KLD_SHARED=no .endif +ZLIB_CFLAGS+= -I${SRCTOP}/sys/dev/zlib + .if !empty(CFLAGS:M-O[23s]) && empty(CFLAGS:M-fno-strict-aliasing) CFLAGS+= -fno-strict-aliasing .endif Index: sys/contrib/zlib/deflate.c =================================================================== --- sys/contrib/zlib/deflate.c +++ sys/contrib/zlib/deflate.c @@ -1622,8 +1622,10 @@ /* Maximum stored block length in deflate format (not including header). */ #define MAX_STORED 65535 +#if !defined(MIN) /* Minimum of a and b. */ #define MIN(a, b) ((a) > (b) ? (b) : (a)) +#endif /* =========================================================================== * Copy without compression as much as possible from the input stream, return Index: sys/dev/zlib/errno.h =================================================================== --- /dev/null +++ sys/dev/zlib/errno.h @@ -0,0 +1,3 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include Index: sys/dev/zlib/fcntl.h =================================================================== --- /dev/null +++ sys/dev/zlib/fcntl.h @@ -0,0 +1,3 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include Index: sys/dev/zlib/limits.h =================================================================== --- /dev/null +++ sys/dev/zlib/limits.h @@ -0,0 +1,3 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include Index: sys/dev/zlib/stdarg.h =================================================================== --- /dev/null +++ sys/dev/zlib/stdarg.h @@ -0,0 +1,3 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include Index: sys/dev/zlib/stddef.h =================================================================== --- /dev/null +++ sys/dev/zlib/stddef.h @@ -0,0 +1,4 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include /* size_t */ +#include Index: sys/dev/zlib/stdio.h =================================================================== --- /dev/null +++ sys/dev/zlib/stdio.h @@ -0,0 +1,2 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ Index: sys/dev/zlib/stdlib.h =================================================================== --- /dev/null +++ sys/dev/zlib/stdlib.h @@ -0,0 +1,16 @@ +#ifndef _DEV_ZLIB_STDLIB_ +#define _DEV_ZLIB_STDLIB_ + +/* This file is in the public domain */ +/* $FreeBSD$ */ + +#define malloc kernz_malloc +#define free kernz_free + +void +*kernz_malloc(size_t size); + +void +kernz_free(void *ptr); + +#endif Index: sys/dev/zlib/string.h =================================================================== --- /dev/null +++ sys/dev/zlib/string.h @@ -0,0 +1,3 @@ +/* This file is in the public domain */ +/* $FreeBSD$ */ +#include /* memcpy, memset */ Index: sys/dev/zlib/zcalloc.h =================================================================== --- /dev/null +++ sys/dev/zlib/zcalloc.h @@ -0,0 +1,7 @@ +#ifndef _DEV_ZLIB_ZCALLOC_ +#define _DEV_ZLIB_ZCALLOC_ + +void * zcalloc_waitok(void *nil, u_int items, u_int size); +void * zcalloc_nowait(void *nil, u_int items, u_int size); + +#endif Index: sys/dev/zlib/zcalloc.c =================================================================== --- /dev/null +++ sys/dev/zlib/zcalloc.c @@ -0,0 +1,53 @@ +#include +#include +/* zlib expects std malloc/free and replaced to call kernz_malloc/free */ +#undef malloc +#undef free +#include +#include + +MALLOC_DEFINE(M_ZLIB, "zlib", "ZLIB Compressor"); + +void * +zcalloc_waitok(void *nil, u_int items, u_int size) +{ + + return mallocarray(items, size, M_ZLIB, M_WAITOK); +} + +void * +zcalloc_nowait(void *nil, u_int items, u_int size) +{ + + return mallocarray(items, size, M_ZLIB, M_NOWAIT); +} + +void * +zcalloc(void *nil, u_int items, u_int size) +{ + + return zcalloc_waitok(nil, items, size); +} + +void +zcfree(void *nil, void *ptr) +{ + + free(ptr, M_ZLIB); +} + +void * +kernz_malloc(size_t size) +{ + void *ptr; + + ptr = malloc(size, M_ZLIB, M_WAITOK); + return ptr; +} + +void +kernz_free(void *ptr) +{ + + free(ptr, M_ZLIB); +} Index: sys/dev/zlib/zlib_mod.c =================================================================== --- /dev/null +++ sys/dev/zlib/zlib_mod.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +static int +zlib_modevent(module_t mod, int type, void *unused) +{ + switch (type) { + case MOD_LOAD: + return 0; + case MOD_UNLOAD: + return 0; + } + return EINVAL; +} + +static moduledata_t zlib_mod = { + "zlib", + zlib_modevent, + 0 +}; +DECLARE_MODULE(zlib, zlib_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +MODULE_VERSION(zlib, 1); Index: sys/libkern/zlib.c =================================================================== --- sys/libkern/zlib.c +++ sys/libkern/zlib.c @@ -25,14 +25,14 @@ #define MY_ZCALLOC #if defined(__FreeBSD__) && defined(_KERNEL) -#define _tr_init _zlib104_tr_init -#define _tr_align _zlib104_tr_align -#define _tr_tally _zlib104_tr_tally -#define _tr_flush_block _zlib104_tr_flush_block -#define _tr_stored_block _zlib104_tr_stored_block -#define inflate_fast _zlib104_inflate_fast -#define inflate _zlib104_inflate -#define zlibVersion _zlib104_Version +#define _tr_init zlib104_tr_init +#define _tr_align zlib104_tr_align +#define _tr_tally zlib104_tr_tally +#define _tr_flush_block zlib104_tr_flush_block +#define _tr_stored_block zlib104_tr_stored_block +#define inflate_fast zlib104_inflate_fast +#define inflate zlib104_inflate +#define zlibVersion zlib104_Version #endif @@ -65,8 +65,6 @@ #include #include #include -#include -#include # define HAVE_MEMCPY #else @@ -5390,25 +5388,3 @@ return (s2 << 16) | s1; } /* --- adler32.c */ - -#ifdef _KERNEL -static int -zlib_modevent(module_t mod, int type, void *unused) -{ - switch (type) { - case MOD_LOAD: - return 0; - case MOD_UNLOAD: - return 0; - } - return EINVAL; -} - -static moduledata_t zlib_mod = { - "zlib", - zlib_modevent, - 0 -}; -DECLARE_MODULE(zlib, zlib_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); -MODULE_VERSION(zlib, 1); -#endif /* _KERNEL */ Index: sys/modules/zlib/Makefile =================================================================== --- sys/modules/zlib/Makefile +++ sys/modules/zlib/Makefile @@ -1,8 +1,31 @@ # $FreeBSD$ .PATH: ${SRCTOP}/sys/libkern +.PATH: ${SRCTOP}/sys/dev/zlib +.PATH: ${SRCTOP}/sys/contrib/zlib KMOD= zlib +# legacy zlib - 1.0.4 SRCS= zlib.c +# newer zlib - 1.2.11 +SRCS+= zlib_mod.c +SRCS+= zcalloc.c +SRCS+= adler32.c +SRCS+= compress.c +SRCS+= deflate.c +SRCS+= inffast.c +SRCS+= inflate.c +SRCS+= inftrees.c +SRCS+= trees.c +SRCS+= uncompr.c +SRCS+= zutil.c + +CFLAGS+=${ZLIB_CFLAGS} +CFLAGS.zutil.c+=-DMY_ZCALLOC +CFLAGS.zutil.c+=-DHAVE_MEMCPY + +CWARNFLAGS.compress.c+=-Wno-cast-qual # compress:49 +CWARNFLAGS.deflate.c+=-Wno-cast-qual # deflate.c:415 +CWARNFLAGS.uncompr.c+=-Wno-cast-qual # uncompr:49 .include Index: sys/opencrypto/cryptodeflate.c =================================================================== --- sys/opencrypto/cryptodeflate.c +++ sys/opencrypto/cryptodeflate.c @@ -105,7 +105,7 @@ bufh = bufp = malloc(sizeof(*bufp) + (size_t)(size * i), M_CRYPTO_DATA, M_NOWAIT); if (bufp == NULL) { - SDT_PROBE6(opencrypto, deflate, deflate_global, bad, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, bad, decomp, 0, __LINE__, 0, 0, 0); goto bad2; } @@ -125,7 +125,7 @@ deflateInit2(&zbuf, Z_DEFAULT_COMPRESSION, Z_METHOD, window_deflate, Z_MEMLEVEL, Z_DEFAULT_STRATEGY); if (error != Z_OK) { - SDT_PROBE6(opencrypto, deflate, deflate_global, bad, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, bad, decomp, error, __LINE__, 0, 0, 0); goto bad; } @@ -134,12 +134,12 @@ error = decomp ? inflate(&zbuf, Z_SYNC_FLUSH) : deflate(&zbuf, Z_FINISH); if (error != Z_OK && error != Z_STREAM_END) { - SDT_PROBE6(opencrypto, deflate, deflate_global, bad, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, bad, decomp, error, __LINE__, zbuf.avail_in, zbuf.avail_out, zbuf.total_out); goto bad; } - SDT_PROBE6(opencrypto, deflate, deflate_global, iter, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, iter, decomp, error, __LINE__, zbuf.avail_in, zbuf.avail_out, zbuf.total_out); if (decomp && zbuf.avail_in == 0 && error == Z_STREAM_END) { @@ -155,7 +155,7 @@ p = malloc(sizeof(*p) + (size_t)(size * i), M_CRYPTO_DATA, M_NOWAIT); if (p == NULL) { - SDT_PROBE6(opencrypto, deflate, deflate_global, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, bad, decomp, 0, __LINE__, 0, 0, 0); goto bad; } @@ -167,8 +167,8 @@ zbuf.avail_out = bufp->size; } else { /* Unexpect result. */ - SDT_PROBE6(opencrypto, deflate, deflate_global, bad, - decomp, error, __LINE__, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, + bad, decomp, error, __LINE__, zbuf.avail_in, zbuf.avail_out, zbuf.total_out); goto bad; } @@ -178,7 +178,7 @@ *out = malloc(result, M_CRYPTO_DATA, M_NOWAIT); if (*out == NULL) { - SDT_PROBE6(opencrypto, deflate, deflate_global, bad, + SDT_PROBE6(opencrypto, zlib104_deflate, deflate_global, bad, decomp, 0, __LINE__, 0, 0, 0); goto bad; } Index: sys/sys/zlib.h =================================================================== --- sys/sys/zlib.h +++ sys/sys/zlib.h @@ -72,40 +72,42 @@ * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateReset z_inflateReset -# define compress z_compress -# define uncompress z_uncompress -# define adler32 z_adler32 +#ifdef _KERNEL +# define deflateInit_ zlib104_deflateInit_ +# define deflate zlib104_deflate +# define deflateEnd zlib104_deflateEnd +# define inflateInit_ zlib104_inflateInit_ +# define inflate zlib104_inflate +# define inflateEnd zlib104_inflateEnd +# define deflateInit2_ zlib104_deflateInit2_ +# define deflateSetDictionary zlib104_deflateSetDictionary +# define deflateCopy zlib104_deflateCopy +# define deflateReset zlib104_deflateReset +# define deflateParams zlib104_deflateParams +# define inflateInit2_ zlib104_inflateInit2_ +# define inflateSetDictionary zlib104_inflateSetDictionary +# define inflateSync zlib104_inflateSync +# define inflateReset zlib104_inflateReset +# define compress zlib104_compress +# define uncompress zlib104_uncompress +# define adler32 zlib104_adler32 #if 0 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table +# define crc32 zlib104_crc32 +# define get_crc_table zlib104_get_crc_table #endif +# define deflate_copyright zlib104_deflate_copyright +# define inflate_copyright zlib104_inflate_copyright -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp +# define Byte zlib104_Byte +# define uInt zlib104_uInt +# define uLong zlib104_uLong +# define Bytef zlib104_Bytef +# define charf zlib104_charf +# define intf zlib104_intf +# define uIntf zlib104_uIntf +# define uLongf zlib104_uLongf +# define voidpf zlib104_voidpf +# define voidp zlib104_voidp #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) @@ -513,7 +515,7 @@ */ #if defined(__FreeBSD__) && defined(_KERNEL) -#define inflate _zlib104_inflate /* FreeBSD already has an inflate :-( */ +#define inflate zlib104_inflate /* FreeBSD already has an inflate :-( */ #endif extern int EXPORT inflate OF((z_streamp strm, int flush));