Blame view

lib/raid6/mktables.c 3.57 KB
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
1
  /* -*- linux-c -*- ------------------------------------------------------- *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   *
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
3
   *   Copyright 2002-2007 H. Peter Anvin - All Rights Reserved
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
   *
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
5
6
7
   *   This file is part of the Linux kernel, and is made available under
   *   the terms of the GNU General Public License version 2 or (at your
   *   option) any later version; incorporated herein by reference.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   *
   * ----------------------------------------------------------------------- */
  
  /*
   * mktables.c
   *
   * Make RAID-6 tables.  This is a host user space program to be run at
   * compile time.
   */
  
  #include <stdio.h>
  #include <string.h>
  #include <inttypes.h>
  #include <stdlib.h>
  #include <time.h>
  
  static uint8_t gfmul(uint8_t a, uint8_t b)
  {
54212cf40   Oliver Pinter   coding style clea...
26
27
28
29
30
31
32
33
34
35
  	uint8_t v = 0;
  
  	while (b) {
  		if (b & 1)
  			v ^= a;
  		a = (a << 1) ^ (a & 0x80 ? 0x1d : 0);
  		b >>= 1;
  	}
  
  	return v;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
39
  }
  
  static uint8_t gfpow(uint8_t a, int b)
  {
54212cf40   Oliver Pinter   coding style clea...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  	uint8_t v = 1;
  
  	b %= 255;
  	if (b < 0)
  		b += 255;
  
  	while (b) {
  		if (b & 1)
  			v = gfmul(v, a);
  		a = gfmul(a, a);
  		b >>= 1;
  	}
  
  	return v;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
  }
  
  int main(int argc, char *argv[])
  {
54212cf40   Oliver Pinter   coding style clea...
58
59
60
  	int i, j, k;
  	uint8_t v;
  	uint8_t exptbl[256], invtbl[256];
f701d589a   Dan Williams   md/raid6: move ra...
61
62
  	printf("#include <linux/raid/pq.h>
  ");
daaa5f7cb   Paul Gortmaker   md: Add in export...
63
64
  	printf("#include <linux/export.h>
  ");
54212cf40   Oliver Pinter   coding style clea...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  
  	/* Compute multiplication table */
  	printf("
  const u8  __attribute__((aligned(256)))
  "
  		"raid6_gfmul[256][256] =
  "
  		"{
  ");
  	for (i = 0; i < 256; i++) {
  		printf("\t{
  ");
  		for (j = 0; j < 256; j += 8) {
  			printf("\t\t");
  			for (k = 0; k < 8; k++)
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
80
81
82
  				printf("0x%02x,%c", gfmul(i, j + k),
  				       (k == 7) ? '
  ' : ' ');
54212cf40   Oliver Pinter   coding style clea...
83
84
85
86
87
88
  		}
  		printf("\t},
  ");
  	}
  	printf("};
  ");
f701d589a   Dan Williams   md/raid6: move ra...
89
90
91
92
93
94
  	printf("#ifdef __KERNEL__
  ");
  	printf("EXPORT_SYMBOL(raid6_gfmul);
  ");
  	printf("#endif
  ");
54212cf40   Oliver Pinter   coding style clea...
95

048a8b8c8   Jim Kukunas   lib/raid6: Add SS...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  	/* Compute vector multiplication table */
  	printf("
  const u8  __attribute__((aligned(256)))
  "
  		"raid6_vgfmul[256][32] =
  "
  		"{
  ");
  	for (i = 0; i < 256; i++) {
  		printf("\t{
  ");
  		for (j = 0; j < 16; j += 8) {
  			printf("\t\t");
  			for (k = 0; k < 8; k++)
  				printf("0x%02x,%c", gfmul(i, j + k),
  				       (k == 7) ? '
  ' : ' ');
  		}
  		for (j = 0; j < 16; j += 8) {
  			printf("\t\t");
  			for (k = 0; k < 8; k++)
  				printf("0x%02x,%c", gfmul(i, (j + k) << 4),
  				       (k == 7) ? '
  ' : ' ');
  		}
  		printf("\t},
  ");
  	}
  	printf("};
  ");
  	printf("#ifdef __KERNEL__
  ");
  	printf("EXPORT_SYMBOL(raid6_vgfmul);
  ");
  	printf("#endif
  ");
54212cf40   Oliver Pinter   coding style clea...
132
133
134
135
136
  	/* Compute power-of-2 table (exponent) */
  	v = 1;
  	printf("
  const u8 __attribute__((aligned(256)))
  "
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
137
138
139
  	       "raid6_gfexp[256] =
  " "{
  ");
54212cf40   Oliver Pinter   coding style clea...
140
141
142
  	for (i = 0; i < 256; i += 8) {
  		printf("\t");
  		for (j = 0; j < 8; j++) {
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
143
144
145
  			exptbl[i + j] = v;
  			printf("0x%02x,%c", v, (j == 7) ? '
  ' : ' ');
54212cf40   Oliver Pinter   coding style clea...
146
147
148
149
  			v = gfmul(v, 2);
  			if (v == 1)
  				v = 0;	/* For entry 255, not a real entry */
  		}
54212cf40   Oliver Pinter   coding style clea...
150
151
152
  	}
  	printf("};
  ");
f701d589a   Dan Williams   md/raid6: move ra...
153
154
155
156
157
158
  	printf("#ifdef __KERNEL__
  ");
  	printf("EXPORT_SYMBOL(raid6_gfexp);
  ");
  	printf("#endif
  ");
54212cf40   Oliver Pinter   coding style clea...
159
160
161
162
163
  
  	/* Compute inverse table x^-1 == x^254 */
  	printf("
  const u8 __attribute__((aligned(256)))
  "
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
164
165
166
  	       "raid6_gfinv[256] =
  " "{
  ");
54212cf40   Oliver Pinter   coding style clea...
167
168
169
  	for (i = 0; i < 256; i += 8) {
  		printf("\t");
  		for (j = 0; j < 8; j++) {
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
170
171
172
  			invtbl[i + j] = v = gfpow(i + j, 254);
  			printf("0x%02x,%c", v, (j == 7) ? '
  ' : ' ');
54212cf40   Oliver Pinter   coding style clea...
173
  		}
54212cf40   Oliver Pinter   coding style clea...
174
175
176
  	}
  	printf("};
  ");
f701d589a   Dan Williams   md/raid6: move ra...
177
178
179
180
181
182
  	printf("#ifdef __KERNEL__
  ");
  	printf("EXPORT_SYMBOL(raid6_gfinv);
  ");
  	printf("#endif
  ");
54212cf40   Oliver Pinter   coding style clea...
183
184
185
186
187
  
  	/* Compute inv(2^x + 1) (exponent-xor-inverse) table */
  	printf("
  const u8 __attribute__((aligned(256)))
  "
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
188
189
190
  	       "raid6_gfexi[256] =
  " "{
  ");
54212cf40   Oliver Pinter   coding style clea...
191
192
193
  	for (i = 0; i < 256; i += 8) {
  		printf("\t");
  		for (j = 0; j < 8; j++)
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
194
195
196
  			printf("0x%02x,%c", invtbl[exptbl[i + j] ^ 1],
  			       (j == 7) ? '
  ' : ' ');
54212cf40   Oliver Pinter   coding style clea...
197
  	}
98ec302be   H. Peter Anvin   md: raid6: Fix mk...
198
199
  	printf("};
  ");
f701d589a   Dan Williams   md/raid6: move ra...
200
201
202
203
204
205
  	printf("#ifdef __KERNEL__
  ");
  	printf("EXPORT_SYMBOL(raid6_gfexi);
  ");
  	printf("#endif
  ");
54212cf40   Oliver Pinter   coding style clea...
206
207
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  }