1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2889c92d2SH. Peter Anvin /* 3889c92d2SH. Peter Anvin * decompress.c 4889c92d2SH. Peter Anvin * 5889c92d2SH. Peter Anvin * Detect the decompression method based on magic number 6889c92d2SH. Peter Anvin */ 7889c92d2SH. Peter Anvin 8889c92d2SH. Peter Anvin #include <linux/decompress/generic.h> 9889c92d2SH. Peter Anvin 10889c92d2SH. Peter Anvin #include <linux/decompress/bunzip2.h> 11889c92d2SH. Peter Anvin #include <linux/decompress/unlzma.h> 123ebe1243SLasse Collin #include <linux/decompress/unxz.h> 13889c92d2SH. Peter Anvin #include <linux/decompress/inflate.h> 14cacb246fSAlbin Tonnerre #include <linux/decompress/unlzo.h> 15e76e1fdfSKyungsik Lee #include <linux/decompress/unlz4.h> 16889c92d2SH. Peter Anvin 17889c92d2SH. Peter Anvin #include <linux/types.h> 18889c92d2SH. Peter Anvin #include <linux/string.h> 1933e2a422SHein Tibosch #include <linux/init.h> 206aa7a29aSDaniel M. Weeks #include <linux/printk.h> 21889c92d2SH. Peter Anvin 2223a22d57SH. Peter Anvin #ifndef CONFIG_DECOMPRESS_GZIP 2323a22d57SH. Peter Anvin # define gunzip NULL 2423a22d57SH. Peter Anvin #endif 2523a22d57SH. Peter Anvin #ifndef CONFIG_DECOMPRESS_BZIP2 2623a22d57SH. Peter Anvin # define bunzip2 NULL 2723a22d57SH. Peter Anvin #endif 2823a22d57SH. Peter Anvin #ifndef CONFIG_DECOMPRESS_LZMA 2923a22d57SH. Peter Anvin # define unlzma NULL 3023a22d57SH. Peter Anvin #endif 313ebe1243SLasse Collin #ifndef CONFIG_DECOMPRESS_XZ 323ebe1243SLasse Collin # define unxz NULL 333ebe1243SLasse Collin #endif 34cacb246fSAlbin Tonnerre #ifndef CONFIG_DECOMPRESS_LZO 35cacb246fSAlbin Tonnerre # define unlzo NULL 36cacb246fSAlbin Tonnerre #endif 37e76e1fdfSKyungsik Lee #ifndef CONFIG_DECOMPRESS_LZ4 38e76e1fdfSKyungsik Lee # define unlz4 NULL 39e76e1fdfSKyungsik Lee #endif 4023a22d57SH. Peter Anvin 4133e2a422SHein Tibosch struct compress_format { 42889c92d2SH. Peter Anvin unsigned char magic[2]; 43889c92d2SH. Peter Anvin const char *name; 44889c92d2SH. Peter Anvin decompress_fn decompressor; 4533e2a422SHein Tibosch }; 4633e2a422SHein Tibosch 476f9982bdSAndi Kleen static const struct compress_format compressed_formats[] __initconst = { 48a060bfe0SHaesung Kim { {0x1f, 0x8b}, "gzip", gunzip }, 49a060bfe0SHaesung Kim { {0x1f, 0x9e}, "gzip", gunzip }, 50889c92d2SH. Peter Anvin { {0x42, 0x5a}, "bzip2", bunzip2 }, 51889c92d2SH. Peter Anvin { {0x5d, 0x00}, "lzma", unlzma }, 523ebe1243SLasse Collin { {0xfd, 0x37}, "xz", unxz }, 53cacb246fSAlbin Tonnerre { {0x89, 0x4c}, "lzo", unlzo }, 54e76e1fdfSKyungsik Lee { {0x02, 0x21}, "lz4", unlz4 }, 55889c92d2SH. Peter Anvin { {0, 0}, NULL, NULL } 56889c92d2SH. Peter Anvin }; 57889c92d2SH. Peter Anvin 58d97b07c5SYinghai Lu decompress_fn __init decompress_method(const unsigned char *inbuf, long len, 59889c92d2SH. Peter Anvin const char **name) 60889c92d2SH. Peter Anvin { 61889c92d2SH. Peter Anvin const struct compress_format *cf; 62889c92d2SH. Peter Anvin 635a09e6ceSAneesh Kumar K.V if (len < 2) { 645a09e6ceSAneesh Kumar K.V if (name) 655a09e6ceSAneesh Kumar K.V *name = NULL; 66889c92d2SH. Peter Anvin return NULL; /* Need at least this much... */ 675a09e6ceSAneesh Kumar K.V } 68889c92d2SH. Peter Anvin 696aa7a29aSDaniel M. Weeks pr_debug("Compressed data magic: %#.2x %#.2x\n", inbuf[0], inbuf[1]); 706aa7a29aSDaniel M. Weeks 71e4aa7ca5SAlain Knaff for (cf = compressed_formats; cf->name; cf++) { 72889c92d2SH. Peter Anvin if (!memcmp(inbuf, cf->magic, 2)) 73889c92d2SH. Peter Anvin break; 74889c92d2SH. Peter Anvin 75889c92d2SH. Peter Anvin } 76889c92d2SH. Peter Anvin if (name) 77889c92d2SH. Peter Anvin *name = cf->name; 78889c92d2SH. Peter Anvin return cf->decompressor; 79889c92d2SH. Peter Anvin } 80