0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <stdio.h>
0016 #include <string.h>
0017 #include <inttypes.h>
0018 #include <stdlib.h>
0019 #include <time.h>
0020
0021 static uint8_t gfmul(uint8_t a, uint8_t b)
0022 {
0023 uint8_t v = 0;
0024
0025 while (b) {
0026 if (b & 1)
0027 v ^= a;
0028 a = (a << 1) ^ (a & 0x80 ? 0x1d : 0);
0029 b >>= 1;
0030 }
0031
0032 return v;
0033 }
0034
0035 static uint8_t gfpow(uint8_t a, int b)
0036 {
0037 uint8_t v = 1;
0038
0039 b %= 255;
0040 if (b < 0)
0041 b += 255;
0042
0043 while (b) {
0044 if (b & 1)
0045 v = gfmul(v, a);
0046 a = gfmul(a, a);
0047 b >>= 1;
0048 }
0049
0050 return v;
0051 }
0052
0053 int main(int argc, char *argv[])
0054 {
0055 int i, j, k;
0056 uint8_t v;
0057 uint8_t exptbl[256], invtbl[256];
0058
0059 printf("#include <linux/export.h>\n");
0060 printf("#include <linux/raid/pq.h>\n");
0061
0062
0063 printf("\nconst u8 __attribute__((aligned(256)))\n"
0064 "raid6_gfmul[256][256] =\n"
0065 "{\n");
0066 for (i = 0; i < 256; i++) {
0067 printf("\t{\n");
0068 for (j = 0; j < 256; j += 8) {
0069 printf("\t\t");
0070 for (k = 0; k < 8; k++)
0071 printf("0x%02x,%c", gfmul(i, j + k),
0072 (k == 7) ? '\n' : ' ');
0073 }
0074 printf("\t},\n");
0075 }
0076 printf("};\n");
0077 printf("#ifdef __KERNEL__\n");
0078 printf("EXPORT_SYMBOL(raid6_gfmul);\n");
0079 printf("#endif\n");
0080
0081
0082 printf("\nconst u8 __attribute__((aligned(256)))\n"
0083 "raid6_vgfmul[256][32] =\n"
0084 "{\n");
0085 for (i = 0; i < 256; i++) {
0086 printf("\t{\n");
0087 for (j = 0; j < 16; j += 8) {
0088 printf("\t\t");
0089 for (k = 0; k < 8; k++)
0090 printf("0x%02x,%c", gfmul(i, j + k),
0091 (k == 7) ? '\n' : ' ');
0092 }
0093 for (j = 0; j < 16; j += 8) {
0094 printf("\t\t");
0095 for (k = 0; k < 8; k++)
0096 printf("0x%02x,%c", gfmul(i, (j + k) << 4),
0097 (k == 7) ? '\n' : ' ');
0098 }
0099 printf("\t},\n");
0100 }
0101 printf("};\n");
0102 printf("#ifdef __KERNEL__\n");
0103 printf("EXPORT_SYMBOL(raid6_vgfmul);\n");
0104 printf("#endif\n");
0105
0106
0107 v = 1;
0108 printf("\nconst u8 __attribute__((aligned(256)))\n"
0109 "raid6_gfexp[256] =\n" "{\n");
0110 for (i = 0; i < 256; i += 8) {
0111 printf("\t");
0112 for (j = 0; j < 8; j++) {
0113 exptbl[i + j] = v;
0114 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
0115 v = gfmul(v, 2);
0116 if (v == 1)
0117 v = 0;
0118 }
0119 }
0120 printf("};\n");
0121 printf("#ifdef __KERNEL__\n");
0122 printf("EXPORT_SYMBOL(raid6_gfexp);\n");
0123 printf("#endif\n");
0124
0125
0126 printf("\nconst u8 __attribute__((aligned(256)))\n"
0127 "raid6_gflog[256] =\n" "{\n");
0128 for (i = 0; i < 256; i += 8) {
0129 printf("\t");
0130 for (j = 0; j < 8; j++) {
0131 v = 255;
0132 for (k = 0; k < 256; k++)
0133 if (exptbl[k] == (i + j)) {
0134 v = k;
0135 break;
0136 }
0137 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
0138 }
0139 }
0140 printf("};\n");
0141 printf("#ifdef __KERNEL__\n");
0142 printf("EXPORT_SYMBOL(raid6_gflog);\n");
0143 printf("#endif\n");
0144
0145
0146 printf("\nconst u8 __attribute__((aligned(256)))\n"
0147 "raid6_gfinv[256] =\n" "{\n");
0148 for (i = 0; i < 256; i += 8) {
0149 printf("\t");
0150 for (j = 0; j < 8; j++) {
0151 invtbl[i + j] = v = gfpow(i + j, 254);
0152 printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
0153 }
0154 }
0155 printf("};\n");
0156 printf("#ifdef __KERNEL__\n");
0157 printf("EXPORT_SYMBOL(raid6_gfinv);\n");
0158 printf("#endif\n");
0159
0160
0161 printf("\nconst u8 __attribute__((aligned(256)))\n"
0162 "raid6_gfexi[256] =\n" "{\n");
0163 for (i = 0; i < 256; i += 8) {
0164 printf("\t");
0165 for (j = 0; j < 8; j++)
0166 printf("0x%02x,%c", invtbl[exptbl[i + j] ^ 1],
0167 (j == 7) ? '\n' : ' ');
0168 }
0169 printf("};\n");
0170 printf("#ifdef __KERNEL__\n");
0171 printf("EXPORT_SYMBOL(raid6_gfexi);\n");
0172 printf("#endif\n");
0173
0174 return 0;
0175 }