Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b172fd88 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

bzip2/lzma: use a table to search for initramfs compression formats



Impact: Code simplification

Instead of open-coding testing for initramfs compression formats, use
a table.

Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 30d65dbf
Loading
Loading
Loading
Loading
+35 −47
Original line number Diff line number Diff line
@@ -49,6 +49,24 @@ static int __init crd_load(int in_fd, int out_fd, decompress_fn deco);
 *	cramfs
 *	gzip
 */
static const struct compress_format {
	unsigned char magic[2];
	const char *name;
	decompress_fn decompressor;
} compressed_formats[] = {
#ifdef CONFIG_RD_GZIP
	{ {037, 0213}, "gzip", gunzip },
	{ {037, 0236}, "gzip", gunzip },
#endif
#ifdef CONFIG_RD_BZIP2
	{ {0x42, 0x5a}, "bzip2", bunzip2 },
#endif
#ifdef CONFIG_RD_LZMA
	{ {0x5d, 0x00}, "lzma", unlzma },
#endif
	{ {0, 0}, NULL, NULL }
};

static int __init
identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
{
@@ -59,6 +77,7 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
	struct cramfs_super *cramfsb;
	int nblocks = -1;
	unsigned char *buf;
	const struct compress_format *cf;

	buf = kmalloc(size, GFP_KERNEL);
	if (!buf)
@@ -71,52 +90,21 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
	memset(buf, 0xe5, size);

	/*
	 * Read block 0 to test for gzipped kernel
	 * Read block 0 to test for compressed kernel
	 */
	sys_lseek(fd, start_block * BLOCK_SIZE, 0);
	sys_read(fd, buf, size);

#ifdef CONFIG_RD_GZIP
	/*
	 * If it matches the gzip magic numbers, return 0
	 */
	if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) {
	for (cf = compressed_formats; cf->decompressor; cf++) {
		if (buf[0] == cf->magic[0] && buf[1] == cf->magic[1]) {
			printk(KERN_NOTICE
		       "RAMDISK: Compressed image found at block %d\n",
		       start_block);
		*decompressor = gunzip;
			       "RAMDISK: %s image found at block %d\n",
			       cf->name, start_block);
			*decompressor = cf->decompressor;
			nblocks = 0;
			goto done;
		}
#endif

#ifdef CONFIG_RD_BZIP2
	/*
	 * If it matches the bzip2 magic numbers, return -1
	 */
	if (buf[0] == 0x42 && (buf[1] == 0x5a)) {
		printk(KERN_NOTICE
		       "RAMDISK: Bzipped image found at block %d\n",
		       start_block);
		*decompressor = bunzip2;
		nblocks = 0;
		goto done;
	}
#endif

#ifdef CONFIG_RD_LZMA
	/*
	 * If it matches the lzma magic numbers, return -1
	 */
	if (buf[0] == 0x5d && (buf[1] == 0x00)) {
		printk(KERN_NOTICE
		       "RAMDISK: Lzma image found at block %d\n",
		       start_block);
		*decompressor = unlzma;
		nblocks = 0;
		goto done;
	}
#endif

	/* romfs is at block zero too */
	if (romfsb->word0 == ROMSB_WORD0 &&