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.Forsythinitcrc32(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.Forsythcrc32(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