~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/raid6/mktables.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php