Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / core / random.c
diff --git a/qemu/roms/ipxe/src/core/random.c b/qemu/roms/ipxe/src/core/random.c
new file mode 100644 (file)
index 0000000..8824dca
--- /dev/null
@@ -0,0 +1,41 @@
+/** @file
+ *
+ * Random number generation
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdlib.h>
+#include <ipxe/timer.h>
+
+static int32_t rnd_seed = 0;
+
+/**
+ * Seed the pseudo-random number generator
+ *
+ * @v seed             Seed value
+ */
+void srandom ( unsigned int seed ) {
+       rnd_seed = seed;
+}
+
+/**
+ * Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
+ *
+ * @ret rand           Pseudo-random number
+ */
+long int random ( void ) {
+       int32_t q;
+
+       if ( ! rnd_seed ) /* Initialize linear congruential generator */
+               srandom ( currticks() );
+
+       /* simplified version of the LCG given in Bruce Schneier's
+          "Applied Cryptography" */
+       q = ( rnd_seed / 53668 );
+       rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q );
+       if ( rnd_seed < 0 )
+               rnd_seed += 2147483563L;
+       return rnd_seed;
+}