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