|
@@ -1,37 +1,35 @@
|
|
|
/*
|
|
|
- This is a maximally equidistributed combined Tausworthe generator
|
|
|
- based on code from GNU Scientific Library 1.5 (30 Jun 2004)
|
|
|
-
|
|
|
- lfsr113 version:
|
|
|
-
|
|
|
- x_n = (s1_n ^ s2_n ^ s3_n ^ s4_n)
|
|
|
-
|
|
|
- s1_{n+1} = (((s1_n & 4294967294) << 18) ^ (((s1_n << 6) ^ s1_n) >> 13))
|
|
|
- s2_{n+1} = (((s2_n & 4294967288) << 2) ^ (((s2_n << 2) ^ s2_n) >> 27))
|
|
|
- s3_{n+1} = (((s3_n & 4294967280) << 7) ^ (((s3_n << 13) ^ s3_n) >> 21))
|
|
|
- s4_{n+1} = (((s4_n & 4294967168) << 13) ^ (((s4_n << 3) ^ s4_n) >> 12))
|
|
|
-
|
|
|
- The period of this generator is about 2^113 (see erratum paper).
|
|
|
-
|
|
|
- From: P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe
|
|
|
- Generators", Mathematics of Computation, 65, 213 (1996), 203--213:
|
|
|
- http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
|
|
|
- ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps
|
|
|
-
|
|
|
- There is an erratum in the paper "Tables of Maximally
|
|
|
- Equidistributed Combined LFSR Generators", Mathematics of
|
|
|
- Computation, 68, 225 (1999), 261--269:
|
|
|
- http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
|
|
|
-
|
|
|
- ... the k_j most significant bits of z_j must be non-
|
|
|
- zero, for each j. (Note: this restriction also applies to the
|
|
|
- computer code given in [4], but was mistakenly not mentioned in
|
|
|
- that paper.)
|
|
|
-
|
|
|
- This affects the seeding procedure by imposing the requirement
|
|
|
- s1 > 1, s2 > 7, s3 > 15, s4 > 127.
|
|
|
-
|
|
|
-*/
|
|
|
+ * This is a maximally equidistributed combined Tausworthe generator
|
|
|
+ * based on code from GNU Scientific Library 1.5 (30 Jun 2004)
|
|
|
+ *
|
|
|
+ * lfsr113 version:
|
|
|
+ *
|
|
|
+ * x_n = (s1_n ^ s2_n ^ s3_n ^ s4_n)
|
|
|
+ *
|
|
|
+ * s1_{n+1} = (((s1_n & 4294967294) << 18) ^ (((s1_n << 6) ^ s1_n) >> 13))
|
|
|
+ * s2_{n+1} = (((s2_n & 4294967288) << 2) ^ (((s2_n << 2) ^ s2_n) >> 27))
|
|
|
+ * s3_{n+1} = (((s3_n & 4294967280) << 7) ^ (((s3_n << 13) ^ s3_n) >> 21))
|
|
|
+ * s4_{n+1} = (((s4_n & 4294967168) << 13) ^ (((s4_n << 3) ^ s4_n) >> 12))
|
|
|
+ *
|
|
|
+ * The period of this generator is about 2^113 (see erratum paper).
|
|
|
+ *
|
|
|
+ * From: P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe
|
|
|
+ * Generators", Mathematics of Computation, 65, 213 (1996), 203--213:
|
|
|
+ * http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
|
|
|
+ * ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps
|
|
|
+ *
|
|
|
+ * There is an erratum in the paper "Tables of Maximally Equidistributed
|
|
|
+ * Combined LFSR Generators", Mathematics of Computation, 68, 225 (1999),
|
|
|
+ * 261--269: http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
|
|
|
+ *
|
|
|
+ * ... the k_j most significant bits of z_j must be non-zero,
|
|
|
+ * for each j. (Note: this restriction also applies to the
|
|
|
+ * computer code given in [4], but was mistakenly not mentioned
|
|
|
+ * in that paper.)
|
|
|
+ *
|
|
|
+ * This affects the seeding procedure by imposing the requirement
|
|
|
+ * s1 > 1, s2 > 7, s3 > 15, s4 > 127.
|
|
|
+ */
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/percpu.h>
|
|
@@ -75,15 +73,17 @@ EXPORT_SYMBOL(prandom_u32_state);
|
|
|
*/
|
|
|
u32 prandom_u32(void)
|
|
|
{
|
|
|
- unsigned long r;
|
|
|
struct rnd_state *state = &get_cpu_var(net_rand_state);
|
|
|
- r = prandom_u32_state(state);
|
|
|
+ u32 res;
|
|
|
+
|
|
|
+ res = prandom_u32_state(state);
|
|
|
put_cpu_var(state);
|
|
|
- return r;
|
|
|
+
|
|
|
+ return res;
|
|
|
}
|
|
|
EXPORT_SYMBOL(prandom_u32);
|
|
|
|
|
|
-/*
|
|
|
+/**
|
|
|
* prandom_bytes_state - get the requested number of pseudo-random bytes
|
|
|
*
|
|
|
* @state: pointer to state structure holding seeded state.
|
|
@@ -204,6 +204,7 @@ static int __init prandom_init(void)
|
|
|
prandom_seed_very_weak(state, (i + jiffies) ^ random_get_entropy());
|
|
|
prandom_warmup(state);
|
|
|
}
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
core_initcall(prandom_init);
|
|
@@ -259,6 +260,7 @@ static void __prandom_reseed(bool late)
|
|
|
|
|
|
if (latch && !late)
|
|
|
goto out;
|
|
|
+
|
|
|
latch = true;
|
|
|
|
|
|
for_each_possible_cpu(i) {
|