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)16initcrc32(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)32crc32(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