Applied a modified version of holger's regparm patches.
[people/adir/gpxe.git] / src / core / random.c
1 /** @file
2  *
3  * Random number generation
4  *
5  */
6
7 #include <stdlib.h>
8 #include <latch.h>
9
10 static int32_t rnd_seed = 0;
11
12 /**
13  * Seed the pseudo-random number generator
14  *
15  * @v seed              Seed value
16  */
17 void srandom ( unsigned int seed ) {
18         rnd_seed = seed;
19 }
20
21 /**
22  * Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
23  *
24  * @ret rand            Pseudo-random number
25  */
26 long int random ( void ) {
27         int32_t q;
28
29         if ( ! rnd_seed ) /* Initialize linear congruential generator */
30                 srandom ( currticks() );
31
32         /* simplified version of the LCG given in Bruce Schneier's
33            "Applied Cryptography" */
34         q = ( rnd_seed / 53668 );
35         rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q );
36         if ( rnd_seed < 0 )
37                 rnd_seed += 2147483563L;
38         return rnd_seed;
39 }