1 /* -*- linux-c -*- ------------------------------------------------------- *
 
   3  *   Copyright 2002-2007 H. Peter Anvin - All Rights Reserved
 
   5  *   This file is part of the Linux kernel, and is made available under
 
   6  *   the terms of the GNU General Public License version 2 or (at your
 
   7  *   option) any later version; incorporated herein by reference.
 
   9  * ----------------------------------------------------------------------- */
 
  14  * Make RAID-6 tables.  This is a host user space program to be run at
 
  24 static uint8_t gfmul(uint8_t a, uint8_t b)
 
  31                 a = (a << 1) ^ (a & 0x80 ? 0x1d : 0);
 
  38 static uint8_t gfpow(uint8_t a, int b)
 
  56 int main(int argc, char *argv[])
 
  60         uint8_t exptbl[256], invtbl[256];
 
  62         printf("#include \"raid6.h\"\n");
 
  64         /* Compute multiplication table */
 
  65         printf("\nconst u8  __attribute__((aligned(256)))\n"
 
  66                 "raid6_gfmul[256][256] =\n"
 
  68         for (i = 0; i < 256; i++) {
 
  70                 for (j = 0; j < 256; j += 8) {
 
  72                         for (k = 0; k < 8; k++)
 
  73                                 printf("0x%02x,%c", gfmul(i, j + k),
 
  74                                        (k == 7) ? '\n' : ' ');
 
  80         /* Compute power-of-2 table (exponent) */
 
  82         printf("\nconst u8 __attribute__((aligned(256)))\n"
 
  83                "raid6_gfexp[256] =\n" "{\n");
 
  84         for (i = 0; i < 256; i += 8) {
 
  86                 for (j = 0; j < 8; j++) {
 
  88                         printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
 
  91                                 v = 0;  /* For entry 255, not a real entry */
 
  96         /* Compute inverse table x^-1 == x^254 */
 
  97         printf("\nconst u8 __attribute__((aligned(256)))\n"
 
  98                "raid6_gfinv[256] =\n" "{\n");
 
  99         for (i = 0; i < 256; i += 8) {
 
 101                 for (j = 0; j < 8; j++) {
 
 102                         invtbl[i + j] = v = gfpow(i + j, 254);
 
 103                         printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
 
 108         /* Compute inv(2^x + 1) (exponent-xor-inverse) table */
 
 109         printf("\nconst u8 __attribute__((aligned(256)))\n"
 
 110                "raid6_gfexi[256] =\n" "{\n");
 
 111         for (i = 0; i < 256; i += 8) {
 
 113                 for (j = 0; j < 8; j++)
 
 114                         printf("0x%02x,%c", invtbl[exptbl[i + j] ^ 1],
 
 115                                (j == 7) ? '\n' : ' ');