1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright 2002-2007 H. Peter Anvin - All Rights Reserved 4 * 5 * Make RAID-6 tables. This is a host user space program to be run at compile 6 * time. 7 */ 8 9 #include <stdio.h> 10 #include <string.h> 11 #include <inttypes.h> 12 #include <stdlib.h> 13 #include <time.h> 14 15 static uint8_t gfmul(uint8_t a, uint8_t b) 16 { 17 uint8_t v = 0; 18 19 while (b) { 20 if (b & 1) 21 v ^= a; 22 a = (a << 1) ^ (a & 0x80 ? 0x1d : 0); 23 b >>= 1; 24 } 25 26 return v; 27 } 28 29 static uint8_t gfpow(uint8_t a, int b) 30 { 31 uint8_t v = 1; 32 33 b %= 255; 34 if (b < 0) 35 b += 255; 36 37 while (b) { 38 if (b & 1) 39 v = gfmul(v, a); 40 a = gfmul(a, a); 41 b >>= 1; 42 } 43 44 return v; 45 } 46 47 int main(int argc, char *argv[]) 48 { 49 int i, j, k; 50 uint8_t v; 51 uint8_t exptbl[256], invtbl[256]; 52 53 printf("#include <linux/export.h>\n"); 54 printf("#include \"algos.h\"\n"); 55 56 /* Compute multiplication table */ 57 printf("\nconst u8 __attribute__((aligned(256)))\n" 58 "raid6_gfmul[256][256] =\n" 59 "{\n"); 60 for (i = 0; i < 256; i++) { 61 printf("\t{\n"); 62 for (j = 0; j < 256; j += 8) { 63 printf("\t\t"); 64 for (k = 0; k < 8; k++) 65 printf("0x%02x,%c", gfmul(i, j + k), 66 (k == 7) ? '\n' : ' '); 67 } 68 printf("\t},\n"); 69 } 70 printf("};\n"); 71 printf("EXPORT_SYMBOL(raid6_gfmul);\n"); 72 73 /* Compute vector multiplication table */ 74 printf("\nconst u8 __attribute__((aligned(256)))\n" 75 "raid6_vgfmul[256][32] =\n" 76 "{\n"); 77 for (i = 0; i < 256; i++) { 78 printf("\t{\n"); 79 for (j = 0; j < 16; j += 8) { 80 printf("\t\t"); 81 for (k = 0; k < 8; k++) 82 printf("0x%02x,%c", gfmul(i, j + k), 83 (k == 7) ? '\n' : ' '); 84 } 85 for (j = 0; j < 16; j += 8) { 86 printf("\t\t"); 87 for (k = 0; k < 8; k++) 88 printf("0x%02x,%c", gfmul(i, (j + k) << 4), 89 (k == 7) ? '\n' : ' '); 90 } 91 printf("\t},\n"); 92 } 93 printf("};\n"); 94 printf("EXPORT_SYMBOL(raid6_vgfmul);\n"); 95 96 /* Compute power-of-2 table (exponent) */ 97 v = 1; 98 printf("\nconst u8 __attribute__((aligned(256)))\n" 99 "raid6_gfexp[256] =\n" "{\n"); 100 for (i = 0; i < 256; i += 8) { 101 printf("\t"); 102 for (j = 0; j < 8; j++) { 103 exptbl[i + j] = v; 104 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' '); 105 v = gfmul(v, 2); 106 if (v == 1) 107 v = 0; /* For entry 255, not a real entry */ 108 } 109 } 110 printf("};\n"); 111 printf("EXPORT_SYMBOL(raid6_gfexp);\n"); 112 113 /* Compute log-of-2 table */ 114 printf("\nconst u8 __attribute__((aligned(256)))\n" 115 "raid6_gflog[256] =\n" "{\n"); 116 for (i = 0; i < 256; i += 8) { 117 printf("\t"); 118 for (j = 0; j < 8; j++) { 119 v = 255; 120 for (k = 0; k < 256; k++) 121 if (exptbl[k] == (i + j)) { 122 v = k; 123 break; 124 } 125 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' '); 126 } 127 } 128 printf("};\n"); 129 printf("EXPORT_SYMBOL(raid6_gflog);\n"); 130 131 /* Compute inverse table x^-1 == x^254 */ 132 printf("\nconst u8 __attribute__((aligned(256)))\n" 133 "raid6_gfinv[256] =\n" "{\n"); 134 for (i = 0; i < 256; i += 8) { 135 printf("\t"); 136 for (j = 0; j < 8; j++) { 137 invtbl[i + j] = v = gfpow(i + j, 254); 138 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' '); 139 } 140 } 141 printf("};\n"); 142 printf("EXPORT_SYMBOL(raid6_gfinv);\n"); 143 144 /* Compute inv(2^x + 1) (exponent-xor-inverse) table */ 145 printf("\nconst u8 __attribute__((aligned(256)))\n" 146 "raid6_gfexi[256] =\n" "{\n"); 147 for (i = 0; i < 256; i += 8) { 148 printf("\t"); 149 for (j = 0; j < 8; j++) 150 printf("0x%02x,%c", invtbl[exptbl[i + j] ^ 1], 151 (j == 7) ? '\n' : ' '); 152 } 153 printf("};\n"); 154 printf("EXPORT_SYMBOL(raid6_gfexi);\n"); 155 156 return 0; 157 } 158