forked from mirrors/linux
		
	This fixes a regression introduced byfaa16bc404("lib: Use existing define with polynomial"). The cleanup added a dependency on include/linux, which broke the PowerPC boot wrapper/decompresser when KERNEL_XZ is enabled: BOOTCC arch/powerpc/boot/decompress.o In file included from arch/powerpc/boot/../../../lib/decompress_unxz.c:233, from arch/powerpc/boot/decompress.c:42: arch/powerpc/boot/../../../lib/xz/xz_crc32.c:18:10: fatal error: linux/crc32poly.h: No such file or directory #include <linux/crc32poly.h> ^~~~~~~~~~~~~~~~~~~ The powerpc decompresser is a hairy corner of the kernel. Even while building a 64-bit kernel it needs to build a 32-bit binary and therefore avoid including files from include/linux. This allows users of the xz library to avoid including headers from 'include/linux/' while still achieving the cleanup of the magic number. Fixes:faa16bc404("lib: Use existing define with polynomial") Reported-by: Meelis Roos <mroos@linux.ee> Reported-by: kbuild test robot <lkp@intel.com> Suggested-by: Christophe LEROY <christophe.leroy@c-s.fr> Signed-off-by: Joel Stanley <joel@jms.id.au> Tested-by: Meelis Roos <mroos@linux.ee> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * CRC32 using the polynomial from IEEE-802.3
 | 
						|
 *
 | 
						|
 * Authors: Lasse Collin <lasse.collin@tukaani.org>
 | 
						|
 *          Igor Pavlov <http://7-zip.org/>
 | 
						|
 *
 | 
						|
 * This file has been put into the public domain.
 | 
						|
 * You can do whatever you want with this file.
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * This is not the fastest implementation, but it is pretty compact.
 | 
						|
 * The fastest versions of xz_crc32() on modern CPUs without hardware
 | 
						|
 * accelerated CRC instruction are 3-5 times as fast as this version,
 | 
						|
 * but they are bigger and use more memory for the lookup table.
 | 
						|
 */
 | 
						|
 | 
						|
#include "xz_private.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * STATIC_RW_DATA is used in the pre-boot environment on some architectures.
 | 
						|
 * See <linux/decompress/mm.h> for details.
 | 
						|
 */
 | 
						|
#ifndef STATIC_RW_DATA
 | 
						|
#	define STATIC_RW_DATA static
 | 
						|
#endif
 | 
						|
 | 
						|
STATIC_RW_DATA uint32_t xz_crc32_table[256];
 | 
						|
 | 
						|
XZ_EXTERN void xz_crc32_init(void)
 | 
						|
{
 | 
						|
	const uint32_t poly = CRC32_POLY_LE;
 | 
						|
 | 
						|
	uint32_t i;
 | 
						|
	uint32_t j;
 | 
						|
	uint32_t r;
 | 
						|
 | 
						|
	for (i = 0; i < 256; ++i) {
 | 
						|
		r = i;
 | 
						|
		for (j = 0; j < 8; ++j)
 | 
						|
			r = (r >> 1) ^ (poly & ~((r & 1) - 1));
 | 
						|
 | 
						|
		xz_crc32_table[i] = r;
 | 
						|
	}
 | 
						|
 | 
						|
	return;
 | 
						|
}
 | 
						|
 | 
						|
XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc)
 | 
						|
{
 | 
						|
	crc = ~crc;
 | 
						|
 | 
						|
	while (size != 0) {
 | 
						|
		crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
 | 
						|
		--size;
 | 
						|
	}
 | 
						|
 | 
						|
	return ~crc;
 | 
						|
}
 |