xref: /inferno-os/os/boot/rpcg/crc32.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include "boot.h"
2*74a4d8c2SCharles.Forsyth 
3*74a4d8c2SCharles.Forsyth /*
4*74a4d8c2SCharles.Forsyth  * from Rob Warnock
5*74a4d8c2SCharles.Forsyth  */
6*74a4d8c2SCharles.Forsyth static	ulong	crc32tab[256];	/* initialised on first call to crc32 */
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth enum {
9*74a4d8c2SCharles.Forsyth 	CRC32POLY = 0x04c11db7     /* AUTODIN II, Ethernet, & FDDI */
10*74a4d8c2SCharles.Forsyth };
11*74a4d8c2SCharles.Forsyth 
12*74a4d8c2SCharles.Forsyth /*
13*74a4d8c2SCharles.Forsyth  * Build auxiliary table for parallel byte-at-a-time CRC-32.
14*74a4d8c2SCharles.Forsyth  */
15*74a4d8c2SCharles.Forsyth static void
initcrc32(void)16*74a4d8c2SCharles.Forsyth initcrc32(void)
17*74a4d8c2SCharles.Forsyth {
18*74a4d8c2SCharles.Forsyth 	int i, j;
19*74a4d8c2SCharles.Forsyth 	ulong c;
20*74a4d8c2SCharles.Forsyth 
21*74a4d8c2SCharles.Forsyth 	for(i = 0; i < 256; i++) {
22*74a4d8c2SCharles.Forsyth 		for(c = i << 24, j = 8; j > 0; j--)
23*74a4d8c2SCharles.Forsyth 			if(c & (1<<31))
24*74a4d8c2SCharles.Forsyth 				c = (c<<1) ^ CRC32POLY;
25*74a4d8c2SCharles.Forsyth 			else
26*74a4d8c2SCharles.Forsyth 				c <<= 1;
27*74a4d8c2SCharles.Forsyth 		crc32tab[i] = c;
28*74a4d8c2SCharles.Forsyth 	}
29*74a4d8c2SCharles.Forsyth }
30*74a4d8c2SCharles.Forsyth 
31*74a4d8c2SCharles.Forsyth ulong
crc32(void * buf,int n,ulong crc)32*74a4d8c2SCharles.Forsyth crc32(void *buf, int n, ulong crc)
33*74a4d8c2SCharles.Forsyth {
34*74a4d8c2SCharles.Forsyth 	uchar *p;
35*74a4d8c2SCharles.Forsyth 
36*74a4d8c2SCharles.Forsyth 	if(crc32tab[1] == 0)
37*74a4d8c2SCharles.Forsyth 		initcrc32();
38*74a4d8c2SCharles.Forsyth 	crc = ~crc;
39*74a4d8c2SCharles.Forsyth 	for(p = buf; --n >= 0;)
40*74a4d8c2SCharles.Forsyth 		crc = (crc << 8) ^ crc32tab[(crc >> 24) ^ *p++];
41*74a4d8c2SCharles.Forsyth 	return ~crc;
42*74a4d8c2SCharles.Forsyth }
43