0001
0002
0003
0004
0005
0006 #include <linux/zlib.h>
0007
0008 #include "cxgb4.h"
0009 #include "cudbg_if.h"
0010 #include "cudbg_lib_common.h"
0011 #include "cudbg_zlib.h"
0012
0013 static int cudbg_get_compress_hdr(struct cudbg_buffer *pdbg_buff,
0014 struct cudbg_buffer *pin_buff)
0015 {
0016 if (pdbg_buff->offset + sizeof(struct cudbg_compress_hdr) >
0017 pdbg_buff->size)
0018 return CUDBG_STATUS_NO_MEM;
0019
0020 pin_buff->data = (char *)pdbg_buff->data + pdbg_buff->offset;
0021 pin_buff->offset = 0;
0022 pin_buff->size = sizeof(struct cudbg_compress_hdr);
0023 pdbg_buff->offset += sizeof(struct cudbg_compress_hdr);
0024 return 0;
0025 }
0026
0027 int cudbg_compress_buff(struct cudbg_init *pdbg_init,
0028 struct cudbg_buffer *pin_buff,
0029 struct cudbg_buffer *pout_buff)
0030 {
0031 struct cudbg_buffer temp_buff = { 0 };
0032 struct z_stream_s compress_stream;
0033 struct cudbg_compress_hdr *c_hdr;
0034 int rc;
0035
0036
0037 rc = cudbg_get_compress_hdr(pout_buff, &temp_buff);
0038 if (rc)
0039 return rc;
0040
0041 c_hdr = (struct cudbg_compress_hdr *)temp_buff.data;
0042 c_hdr->compress_id = CUDBG_ZLIB_COMPRESS_ID;
0043
0044 memset(&compress_stream, 0, sizeof(struct z_stream_s));
0045 compress_stream.workspace = pdbg_init->workspace;
0046 rc = zlib_deflateInit2(&compress_stream, Z_DEFAULT_COMPRESSION,
0047 Z_DEFLATED, CUDBG_ZLIB_WIN_BITS,
0048 CUDBG_ZLIB_MEM_LVL, Z_DEFAULT_STRATEGY);
0049 if (rc != Z_OK)
0050 return CUDBG_SYSTEM_ERROR;
0051
0052 compress_stream.next_in = pin_buff->data;
0053 compress_stream.avail_in = pin_buff->size;
0054 compress_stream.next_out = pout_buff->data + pout_buff->offset;
0055 compress_stream.avail_out = pout_buff->size - pout_buff->offset;
0056
0057 rc = zlib_deflate(&compress_stream, Z_FINISH);
0058 if (rc != Z_STREAM_END)
0059 return CUDBG_SYSTEM_ERROR;
0060
0061 rc = zlib_deflateEnd(&compress_stream);
0062 if (rc != Z_OK)
0063 return CUDBG_SYSTEM_ERROR;
0064
0065 c_hdr->compress_size = compress_stream.total_out;
0066 c_hdr->decompress_size = pin_buff->size;
0067 pout_buff->offset += compress_stream.total_out;
0068
0069 return 0;
0070 }