Блин, переводчика надо покромсать на маленьких тузиков...
Да и Тцо тоже, чтоб шухер не поднимал.
void add_device_randomness(const void *buf, unsigned int size)
{
unsigned long time = get_cycles() ^ jiffies; // В случае МИПСа, time будет равен jiffies;
// Эти функции пихают size байт по адресу из второго аргумента
// и пихают в общий пул (первый арг.)
mix_pool_bytes(&input_pool, buf, size, NULL);
mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
} mix_pool_bytes - развернуто, это вот такая шняга.
static void _mix_pool_bytes(struct entropy_store *r, const void *in, int nbytes, __u8 out[64]) {
unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
int input_rotate;
int wordmask = r->poolinfo->poolwords - 1;
const char *bytes = in;
__u32 w;
tap1 = r->poolinfo->tap1;
tap2 = r->poolinfo->tap2;
tap3 = r->poolinfo->tap3;
tap4 = r->poolinfo->tap4;
tap5 = r->poolinfo->tap5;
smp_rmb();
input_rotate = ACCESS_ONCE(r->input_rotate);
i = ACCESS_ONCE(r->add_ptr);
/* mix one byte at a time to simplify size handling and churn faster */
while (nbytes--) {
w = rol32(*bytes++, input_rotate & 31);
i = (i - 1) & wordmask;
/* XOR in the various taps */
w ^= r->pool[i];
w ^= r->pool[(i + tap1) & wordmask];
w ^= r->pool[(i + tap2) & wordmask];
w ^= r->pool[(i + tap3) & wordmask];
w ^= r->pool[(i + tap4) & wordmask];
w ^= r->pool[(i + tap5) & wordmask];
/* Mix the result back in with a twist */
r->pool[i] = (w >> 3) ^ twist_table[w & 7];
/*
* Normally, we add 7 bits of rotation to the pool.
* At the beginning of the pool, add an extra 7 bits
* rotation, so that successive passes spread the
* input bits across the pool evenly.
*/
input_rotate += i ? 7 : 14;
}
ACCESS_ONCE(r->input_rotate) = input_rotate;
ACCESS_ONCE(r->add_ptr) = i;
smp_wmb();
if (out)
for (j = 0; j < 16; j++)
((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
}
Вращения с семью побайтными XOR это необратимая ж...а. Входной аргумент у этой
функции это так сказать "волшебный пендаль", чтоб оно закрутилось. Достаточно различия
в один байт от предыдущего значения. А jiffies это такая клёвая штука - она два раза себя
одинаковой не возвращает, как бы не тужились.
И опять же, это всего лишь функция наполнения пула энтропии, для генерации чисел оттуда ещё выбирать нужно.