2008-02-06 12:39:48 +03:00
/* -*- linux-c -*- ------------------------------------------------------- *
2005-04-17 02:20:36 +04:00
*
2008-02-06 12:39:48 +03:00
* Copyright 2002 - 2007 H . Peter Anvin - All Rights Reserved
2005-04-17 02:20:36 +04:00
*
2008-02-06 12:39:48 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*
* 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 )
{
2008-02-06 12:39:47 +03:00
uint8_t v = 0 ;
while ( b ) {
if ( b & 1 )
v ^ = a ;
a = ( a < < 1 ) ^ ( a & 0x80 ? 0x1d : 0 ) ;
b > > = 1 ;
}
return v ;
2005-04-17 02:20:36 +04:00
}
static uint8_t gfpow ( uint8_t a , int b )
{
2008-02-06 12:39:47 +03:00
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 ;
2005-04-17 02:20:36 +04:00
}
int main ( int argc , char * argv [ ] )
{
2008-02-06 12:39:47 +03:00
int i , j , k ;
uint8_t v ;
uint8_t exptbl [ 256 ] , invtbl [ 256 ] ;
2009-03-31 08:09:39 +04:00
printf ( " #include <linux/raid/pq.h> \n " ) ;
2008-02-06 12:39:47 +03:00
/* Compute multiplication table */
printf ( " \n const u8 __attribute__((aligned(256))) \n "
" raid6_gfmul[256][256] = \n "
" { \n " ) ;
for ( i = 0 ; i < 256 ; i + + ) {
printf ( " \t { \n " ) ;
for ( j = 0 ; j < 256 ; j + = 8 ) {
printf ( " \t \t " ) ;
for ( k = 0 ; k < 8 ; k + + )
2008-02-06 12:39:48 +03:00
printf ( " 0x%02x,%c " , gfmul ( i , j + k ) ,
( k = = 7 ) ? ' \n ' : ' ' ) ;
2008-02-06 12:39:47 +03:00
}
printf ( " \t }, \n " ) ;
}
printf ( " }; \n " ) ;
2009-03-31 08:09:39 +04:00
printf ( " #ifdef __KERNEL__ \n " ) ;
printf ( " EXPORT_SYMBOL(raid6_gfmul); \n " ) ;
printf ( " #endif \n " ) ;
2008-02-06 12:39:47 +03:00
/* Compute power-of-2 table (exponent) */
v = 1 ;
printf ( " \n const u8 __attribute__((aligned(256))) \n "
2008-02-06 12:39:48 +03:00
" raid6_gfexp[256] = \n " " { \n " ) ;
2008-02-06 12:39:47 +03:00
for ( i = 0 ; i < 256 ; i + = 8 ) {
printf ( " \t " ) ;
for ( j = 0 ; j < 8 ; j + + ) {
2008-02-06 12:39:48 +03:00
exptbl [ i + j ] = v ;
printf ( " 0x%02x,%c " , v , ( j = = 7 ) ? ' \n ' : ' ' ) ;
2008-02-06 12:39:47 +03:00
v = gfmul ( v , 2 ) ;
if ( v = = 1 )
v = 0 ; /* For entry 255, not a real entry */
}
}
printf ( " }; \n " ) ;
2009-03-31 08:09:39 +04:00
printf ( " #ifdef __KERNEL__ \n " ) ;
printf ( " EXPORT_SYMBOL(raid6_gfexp); \n " ) ;
printf ( " #endif \n " ) ;
2008-02-06 12:39:47 +03:00
/* Compute inverse table x^-1 == x^254 */
printf ( " \n const u8 __attribute__((aligned(256))) \n "
2008-02-06 12:39:48 +03:00
" raid6_gfinv[256] = \n " " { \n " ) ;
2008-02-06 12:39:47 +03:00
for ( i = 0 ; i < 256 ; i + = 8 ) {
printf ( " \t " ) ;
for ( j = 0 ; j < 8 ; j + + ) {
2008-02-06 12:39:48 +03:00
invtbl [ i + j ] = v = gfpow ( i + j , 254 ) ;
printf ( " 0x%02x,%c " , v , ( j = = 7 ) ? ' \n ' : ' ' ) ;
2008-02-06 12:39:47 +03:00
}
}
printf ( " }; \n " ) ;
2009-03-31 08:09:39 +04:00
printf ( " #ifdef __KERNEL__ \n " ) ;
printf ( " EXPORT_SYMBOL(raid6_gfinv); \n " ) ;
printf ( " #endif \n " ) ;
2008-02-06 12:39:47 +03:00
/* Compute inv(2^x + 1) (exponent-xor-inverse) table */
printf ( " \n const u8 __attribute__((aligned(256))) \n "
2008-02-06 12:39:48 +03:00
" raid6_gfexi[256] = \n " " { \n " ) ;
2008-02-06 12:39:47 +03:00
for ( i = 0 ; i < 256 ; i + = 8 ) {
printf ( " \t " ) ;
for ( j = 0 ; j < 8 ; j + + )
2008-02-06 12:39:48 +03:00
printf ( " 0x%02x,%c " , invtbl [ exptbl [ i + j ] ^ 1 ] ,
( j = = 7 ) ? ' \n ' : ' ' ) ;
2008-02-06 12:39:47 +03:00
}
2008-02-06 12:39:48 +03:00
printf ( " }; \n " ) ;
2009-03-31 08:09:39 +04:00
printf ( " #ifdef __KERNEL__ \n " ) ;
printf ( " EXPORT_SYMBOL(raid6_gfexi); \n " ) ;
printf ( " #endif \n " ) ;
2008-02-06 12:39:47 +03:00
return 0 ;
2005-04-17 02:20:36 +04:00
}