13984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/* 23984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * gen_crc32table.c --- Generate CRC32 tables. 33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 43984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * Copyright (C) 2008 Theodore Ts'o. 53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 63984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * %Begin-Header% 73984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * This file may be redistributed under the terms of the GNU Public 83984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * License. 93984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * %End-Header% 103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include <stdio.h> 133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include "crc32defs.h" 143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include <inttypes.h> 153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define ENTRIES_PER_LINE 4 173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define LE_TABLE_SIZE (1 << CRC_LE_BITS) 193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define BE_TABLE_SIZE (1 << CRC_BE_BITS) 203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic uint32_t crc32table_le[LE_TABLE_SIZE]; 223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic uint32_t crc32table_be[BE_TABLE_SIZE]; 233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/** 253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * crc32init_le() - allocate and initialize LE table data 263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * crc is the crc of the byte i; other entries are filled in based on the 283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * fact that crctable[i^j] = crctable[i] ^ crctable[j]. 293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void crc32init_le(void) 323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt unsigned i, j; 343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt uint32_t crc = 1; 353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32table_le[0] = 0; 373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (i = 1 << (CRC_LE_BITS - 1); i; i >>= 1) { 393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); 403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (j = 0; j < LE_TABLE_SIZE; j += 2 * i) 413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32table_le[i + j] = crc ^ crc32table_le[j]; 423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/** 463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * crc32init_be() - allocate and initialize BE table data 473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void crc32init_be(void) 493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt unsigned i, j; 513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt uint32_t crc = 0x80000000; 523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32table_be[0] = 0; 543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (i = 1; i < BE_TABLE_SIZE; i <<= 1) { 563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc = (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0); 573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (j = 0; j < i; j++) 583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32table_be[i + j] = crc ^ crc32table_be[j]; 593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void output_table(uint32_t table[], int len, const char *trans) 633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int i; 653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (i = 0; i < len - 1; i++) { 673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (i % ENTRIES_PER_LINE == 0) 683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("\n"); 693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("%s(0x%8.8xL), ", trans, table[i]); 703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("%s(0x%8.8xL)\n", trans, table[len - 1]); 723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef __GNUC__ 753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define ATTR(x) __attribute__(x) 763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#else 773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define ATTR(x) 783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtint main(int argc ATTR((unused)), char** argv ATTR((unused))) 813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("/* this file is generated - do not edit */\n\n"); 833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("#ifdef UNITTEST\n"); 853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (CRC_LE_BITS > 1) { 863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32init_le(); 873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("static const __u32 crc32table_le[] = {"); 883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt output_table(crc32table_le, LE_TABLE_SIZE, "tole"); 893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("};\n"); 903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("#endif /* UNITTEST */\n"); 923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (CRC_BE_BITS > 1) { 943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt crc32init_be(); 953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("static const __u32 crc32table_be[] = {"); 963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt output_table(crc32table_be, BE_TABLE_SIZE, "tobe"); 973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("};\n"); 983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return 0; 1013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 102