mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			129 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/fs/jffs2/compr_lzma.c	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ linux-4.9.y/fs/jffs2/compr_lzma.c	2021-06-07 13:01:34.000000000 +0300
 | |
| @@ -0,0 +1,125 @@
 | |
| +/*
 | |
| + * JFFS2 -- Journalling Flash File System, Version 2.
 | |
| + *
 | |
| + * For licensing information, see the file 'LICENCE' in this directory.
 | |
| + *
 | |
| + * JFFS2 wrapper to the LZMA C SDK
 | |
| + *
 | |
| + */
 | |
| +
 | |
| +#include <linux/lzma.h>
 | |
| +#include "compr.h"
 | |
| +
 | |
| +#ifdef __KERNEL__
 | |
| +	static DEFINE_MUTEX(deflate_mutex);
 | |
| +#endif
 | |
| +
 | |
| +CLzmaEncHandle *p;
 | |
| +Byte propsEncoded[LZMA_PROPS_SIZE];
 | |
| +SizeT propsSize = sizeof(propsEncoded);
 | |
| +
 | |
| +STATIC void lzma_free_workspace(void)
 | |
| +{
 | |
| +	LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc);
 | |
| +}
 | |
| +
 | |
| +STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props)
 | |
| +{
 | |
| +	if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL) {
 | |
| +		PRINT_ERROR("Failed to allocate lzma deflate workspace\n");
 | |
| +		return -ENOMEM;
 | |
| +	}
 | |
| +
 | |
| +	if (LzmaEnc_SetProps(p, props) != SZ_OK) {
 | |
| +		lzma_free_workspace();
 | |
| +		return -1;
 | |
| +	}
 | |
| +	
 | |
| +	if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK) {
 | |
| +		lzma_free_workspace();
 | |
| +		return -1;
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out,
 | |
| +			      uint32_t *sourcelen, uint32_t *dstlen)
 | |
| +{
 | |
| +	SizeT compress_size = (SizeT)(*dstlen);
 | |
| +	int ret;
 | |
| +
 | |
| +#ifdef __KERNEL__
 | |
| +	mutex_lock(&deflate_mutex);
 | |
| +#endif
 | |
| +
 | |
| +	ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen,
 | |
| +		0, NULL, &lzma_alloc, &lzma_alloc);
 | |
| +
 | |
| +#ifdef __KERNEL__
 | |
| +	mutex_unlock(&deflate_mutex);
 | |
| +#endif
 | |
| +
 | |
| +	if (ret != SZ_OK)
 | |
| +		return -1;
 | |
| +
 | |
| +	*dstlen = (uint32_t)compress_size;
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out,
 | |
| +				 uint32_t srclen, uint32_t destlen)
 | |
| +{
 | |
| +	int ret;
 | |
| +	SizeT dl = (SizeT)destlen;
 | |
| +	SizeT sl = (SizeT)srclen;
 | |
| +	ELzmaStatus status;
 | |
| +	
 | |
| +	ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded,
 | |
| +		propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc);
 | |
| +
 | |
| +	if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen)
 | |
| +		return -1;
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +static struct jffs2_compressor jffs2_lzma_comp = {
 | |
| +	.priority = JFFS2_LZMA_PRIORITY,
 | |
| +	.name = "lzma",
 | |
| +	.compr = JFFS2_COMPR_LZMA,
 | |
| +	.compress = &jffs2_lzma_compress,
 | |
| +	.decompress = &jffs2_lzma_decompress,
 | |
| +	.disabled = 0,
 | |
| +};
 | |
| +
 | |
| +int INIT jffs2_lzma_init(void)
 | |
| +{
 | |
| +	int ret;
 | |
| +	CLzmaEncProps props;
 | |
| +	LzmaEncProps_Init(&props);
 | |
| +
 | |
| +	props.dictSize = LZMA_BEST_DICT(0x2000);
 | |
| +	props.level = LZMA_BEST_LEVEL;
 | |
| +	props.lc = LZMA_BEST_LC;
 | |
| +	props.lp = LZMA_BEST_LP;
 | |
| +	props.pb = LZMA_BEST_PB;
 | |
| +	props.fb = LZMA_BEST_FB;
 | |
| +
 | |
| +	ret = lzma_alloc_workspace(&props);
 | |
| +	if (ret < 0)
 | |
| +		return ret;
 | |
| +
 | |
| +	ret = jffs2_register_compressor(&jffs2_lzma_comp);
 | |
| +	if (ret)
 | |
| +		lzma_free_workspace();
 | |
| +	
 | |
| +	return ret;
 | |
| +}
 | |
| +
 | |
| +void jffs2_lzma_exit(void)
 | |
| +{
 | |
| +	jffs2_unregister_compressor(&jffs2_lzma_comp);
 | |
| +	lzma_free_workspace();
 | |
| +}
 |