checksums-crc32c.c

text/x-csrc

Filename: checksums-crc32c.c
Type: text/x-csrc
Part: 2
Message: Re: Enabling Checksums
#include "8x256_tables.c"

__attribute__ ((noinline)) static uint16
checksum_fast(char *page, uint32 blkno)
{
    const uint8_t*	p_buf = page;
	uint32_t li;
	uint32_t crc, term1, term2;
	
	crc = 0xFFFFFFFF;

	for(li=0; li < 4; li++) {
		crc = crc_tableil8_o32[(crc ^ (blkno & 0xFF)) & 0x000000FF] ^ (crc >> 8);
		blkno >>= 8;
	}
	
	for(li=0; li < PAGE_SIZE/8; li++) 
	{
		crc ^= *(uint32_t *)p_buf;
		if (li == 1)
		    crc ^= *(uint16_t *)p_buf;
		p_buf += 4;
		term1 = crc_tableil8_o88[crc & 0x000000FF] ^
				crc_tableil8_o80[(crc >> 8) & 0x000000FF];
		term2 = crc >> 16;
		crc = term1 ^
			  crc_tableil8_o72[term2 & 0x000000FF] ^ 
			  crc_tableil8_o64[(term2 >> 8) & 0x000000FF];
		term1 = crc_tableil8_o56[(*(uint32_t *)p_buf) & 0x000000FF] ^
				crc_tableil8_o48[((*(uint32_t *)p_buf) >> 8) & 0x000000FF];
		
		term2 = (*(uint32_t *)p_buf) >> 16;
		crc =	crc ^ 
				term1 ^		
				crc_tableil8_o40[term2  & 0x000000FF] ^	
				crc_tableil8_o32[(term2 >> 8) & 0x000000FF];	
		p_buf += 4;
	}
    return (~crc) & 0xFFFF;	
}

const uint32_t Polynomial = 0x82F63B78;

uint32_t crc32_bitwise(const void* data, size_t length, uint32_t previousCrc32)
{
  uint32_t crc = ~previousCrc32;
  unsigned char* current = (unsigned char*) data;
  unsigned int j;
  while (length--)
  {
    crc ^= *current++;
    for (j = 0; j < 8; j++)
      crc = (crc >> 1) ^ ((crc & 1) * Polynomial);
  }
  return ~crc; // same as crc ^ 0xFFFFFFFF
}


__attribute__((noinline))
static uint16
checksum_c(void *page, uint32_t blkno)
{
	uint32_t crc = 0;
	uint16_t pd_checksum = 0;
	crc = crc32_bitwise(&blkno, 4, crc);

	crc = crc32_bitwise(page, 8, crc);
	crc = crc32_bitwise(&pd_checksum, 2, crc);
        crc = crc32_bitwise(page+10, PAGE_SIZE-10, crc);

	return crc & 0xFFFF;
}