diff options
Diffstat (limited to 'lib/decompress.c')
| -rw-r--r-- | lib/decompress.c | 22 | 
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/decompress.c b/lib/decompress.c index a7606815541..86069d74c06 100644 --- a/lib/decompress.c +++ b/lib/decompress.c @@ -8,11 +8,15 @@  #include <linux/decompress/bunzip2.h>  #include <linux/decompress/unlzma.h> +#include <linux/decompress/unxz.h>  #include <linux/decompress/inflate.h>  #include <linux/decompress/unlzo.h> +#include <linux/decompress/unlz4.h>  #include <linux/types.h>  #include <linux/string.h> +#include <linux/init.h> +#include <linux/printk.h>  #ifndef CONFIG_DECOMPRESS_GZIP  # define gunzip NULL @@ -23,24 +27,34 @@  #ifndef CONFIG_DECOMPRESS_LZMA  # define unlzma NULL  #endif +#ifndef CONFIG_DECOMPRESS_XZ +# define unxz NULL +#endif  #ifndef CONFIG_DECOMPRESS_LZO  # define unlzo NULL  #endif +#ifndef CONFIG_DECOMPRESS_LZ4 +# define unlz4 NULL +#endif -static const struct compress_format { +struct compress_format {  	unsigned char magic[2];  	const char *name;  	decompress_fn decompressor; -} compressed_formats[] = { +}; + +static const struct compress_format compressed_formats[] __initconst = {  	{ {037, 0213}, "gzip", gunzip },  	{ {037, 0236}, "gzip", gunzip },  	{ {0x42, 0x5a}, "bzip2", bunzip2 },  	{ {0x5d, 0x00}, "lzma", unlzma }, +	{ {0xfd, 0x37}, "xz", unxz },  	{ {0x89, 0x4c}, "lzo", unlzo }, +	{ {0x02, 0x21}, "lz4", unlz4 },  	{ {0, 0}, NULL, NULL }  }; -decompress_fn decompress_method(const unsigned char *inbuf, int len, +decompress_fn __init decompress_method(const unsigned char *inbuf, int len,  				const char **name)  {  	const struct compress_format *cf; @@ -48,6 +62,8 @@ decompress_fn decompress_method(const unsigned char *inbuf, int len,  	if (len < 2)  		return NULL;	/* Need at least this much... */ +	pr_debug("Compressed data magic: %#.2x %#.2x\n", inbuf[0], inbuf[1]); +  	for (cf = compressed_formats; cf->name; cf++) {  		if (!memcmp(inbuf, cf->magic, 2))  			break;  | 
