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