brintos

brintos / linux-shallow public Read only

0
0
Text · 3.9 KiB · 3be0379 Raw
178 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/* -*- linux-c -*- ------------------------------------------------------- *3 *4 *   Copyright 2002-2007 H. Peter Anvin - All Rights Reserved5 *6 * ----------------------------------------------------------------------- */7 8/*9 * mktables.c10 *11 * Make RAID-6 tables.  This is a host user space program to be run at12 * 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 21static 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 35static 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 53int 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