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