Blame view

lib/gen_crc64table.c 1.43 KB
feba04fd2   Coly Li   lib: add crc64 ca...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  // SPDX-License-Identifier: GPL-2.0
  /*
   * Generate lookup table for the table-driven CRC64 calculation.
   *
   * gen_crc64table is executed in kernel build time and generates
   * lib/crc64table.h. This header is included by lib/crc64.c for
   * the table-driven CRC64 calculation.
   *
   * See lib/crc64.c for more information about which specification
   * and polynomial arithmetic that gen_crc64table.c follows to
   * generate the lookup table.
   *
   * Copyright 2018 SUSE Linux.
   *   Author: Coly Li <colyli@suse.de>
   */
  #include <inttypes.h>
  #include <stdio.h>
feba04fd2   Coly Li   lib: add crc64 ca...
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  #define CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
  
  static uint64_t crc64_table[256] = {0};
  
  static void generate_crc64_table(void)
  {
  	uint64_t i, j, c, crc;
  
  	for (i = 0; i < 256; i++) {
  		crc = 0;
  		c = i << 56;
  
  		for (j = 0; j < 8; j++) {
  			if ((crc ^ c) & 0x8000000000000000ULL)
  				crc = (crc << 1) ^ CRC64_ECMA182_POLY;
  			else
  				crc <<= 1;
  			c <<= 1;
  		}
  
  		crc64_table[i] = crc;
  	}
  }
  
  static void print_crc64_table(void)
  {
  	int i;
  
  	printf("/* this file is generated - do not edit */
  
  ");
  	printf("#include <linux/types.h>
  ");
  	printf("#include <linux/cache.h>
  
  ");
  	printf("static const u64 ____cacheline_aligned crc64table[256] = {
  ");
  	for (i = 0; i < 256; i++) {
  		printf("\t0x%016" PRIx64 "ULL", crc64_table[i]);
  		if (i & 0x1)
  			printf(",
  ");
  		else
  			printf(", ");
  	}
  	printf("};
  ");
  }
  
  int main(int argc, char *argv[])
  {
  	generate_crc64_table();
  	print_crc64_table();
  	return 0;
  }