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