summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-05-03 08:49:25 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-05-03 08:49:25 +0200
commit7f04d86dfbb43cdbd18b2e3be31421dc9efee3b7 (patch)
tree8c8fc0888439b6e20cd856c6e1d9ae27001b14d3 /sys/src
parent5377a194478225481976f8400d10c093e5bdfa01 (diff)
kernel: move duplicated random.c to port
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/alphapc/mkfile2
-rw-r--r--sys/src/9/bitsy/mkfile2
-rw-r--r--sys/src/9/bitsy/random.c138
-rw-r--r--sys/src/9/kw/mkfile2
-rw-r--r--sys/src/9/kw/random.c138
-rw-r--r--sys/src/9/mtx/mkfile2
-rw-r--r--sys/src/9/mtx/random.c138
-rw-r--r--sys/src/9/omap/mkfile2
-rw-r--r--sys/src/9/omap/random.c138
-rw-r--r--sys/src/9/omap4/mkfile2
-rw-r--r--sys/src/9/omap4/random.c138
-rw-r--r--sys/src/9/pc/mkfile2
-rw-r--r--sys/src/9/port/random.c (renamed from sys/src/9/pc/random.c)5
-rw-r--r--sys/src/9/ppc/mkfile2
-rw-r--r--sys/src/9/ppc/random.c138
15 files changed, 10 insertions, 839 deletions
diff --git a/sys/src/9/alphapc/mkfile b/sys/src/9/alphapc/mkfile
index 137ecb392..77071544a 100644
--- a/sys/src/9/alphapc/mkfile
+++ b/sys/src/9/alphapc/mkfile
@@ -36,6 +36,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -47,7 +48,6 @@ OBJ=\
i8259.$O\
main.$O\
mmu.$O\
- random.$O\
trap.$O\
$CONF.root.$O\
$CONF.rootc.$O\
diff --git a/sys/src/9/bitsy/mkfile b/sys/src/9/bitsy/mkfile
index 00e19c138..05768dc72 100644
--- a/sys/src/9/bitsy/mkfile
+++ b/sys/src/9/bitsy/mkfile
@@ -34,6 +34,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -45,7 +46,6 @@ OBJ=\
main.$O\
mmu.$O\
power.$O\
- random.$O\
sa1110dma.$O\
screen.$O\
trap.$O\
diff --git a/sys/src/9/bitsy/random.c b/sys/src/9/bitsy/random.c
deleted file mode 100644
index 7bade6cd1..000000000
--- a/sys/src/9/bitsy/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[128];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be precictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}
diff --git a/sys/src/9/kw/mkfile b/sys/src/9/kw/mkfile
index ccd74bcc3..c8d606a7f 100644
--- a/sys/src/9/kw/mkfile
+++ b/sys/src/9/kw/mkfile
@@ -39,6 +39,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -52,7 +53,6 @@ OBJ=\
fpimem.$O\
main.$O\
mmu.$O\
- random.$O\
trap.$O\
$CONF.root.$O\
$CONF.rootc.$O\
diff --git a/sys/src/9/kw/random.c b/sys/src/9/kw/random.c
deleted file mode 100644
index 1f7c0983d..000000000
--- a/sys/src/9/kw/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[128];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be predictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}
diff --git a/sys/src/9/mtx/mkfile b/sys/src/9/mtx/mkfile
index be2e8917d..f1efadf6a 100644
--- a/sys/src/9/mtx/mkfile
+++ b/sys/src/9/mtx/mkfile
@@ -36,6 +36,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -44,7 +45,6 @@ OBJ=\
i8259.$O\
main.$O\
mmu.$O\
- random.$O\
raven.$O\
trap.$O\
$CONF.root.$O\
diff --git a/sys/src/9/mtx/random.c b/sys/src/9/mtx/random.c
deleted file mode 100644
index 3c204b8d1..000000000
--- a/sys/src/9/mtx/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[1024];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be precictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}
diff --git a/sys/src/9/omap/mkfile b/sys/src/9/omap/mkfile
index fcd7db859..2dac0ca0a 100644
--- a/sys/src/9/omap/mkfile
+++ b/sys/src/9/omap/mkfile
@@ -39,6 +39,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -51,7 +52,6 @@ OBJ=\
fpimem.$O\
main.$O\
mmu.$O\
- random.$O\
trap.$O\
$CONF.root.$O\
$CONF.rootc.$O\
diff --git a/sys/src/9/omap/random.c b/sys/src/9/omap/random.c
deleted file mode 100644
index 1f7c0983d..000000000
--- a/sys/src/9/omap/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[128];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be predictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}
diff --git a/sys/src/9/omap4/mkfile b/sys/src/9/omap4/mkfile
index 169367ab1..9e0eb6c15 100644
--- a/sys/src/9/omap4/mkfile
+++ b/sys/src/9/omap4/mkfile
@@ -37,12 +37,12 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
main.$O\
mmu.$O\
- random.$O\
clock.$O\
arch.$O\
trap.$O\
diff --git a/sys/src/9/omap4/random.c b/sys/src/9/omap4/random.c
deleted file mode 100644
index 1f7c0983d..000000000
--- a/sys/src/9/omap4/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[128];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be predictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}
diff --git a/sys/src/9/pc/mkfile b/sys/src/9/pc/mkfile
index a55801d54..4e61f7237 100644
--- a/sys/src/9/pc/mkfile
+++ b/sys/src/9/pc/mkfile
@@ -41,6 +41,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -51,7 +52,6 @@ OBJ=\
main.$O\
memory.$O\
mmu.$O\
- random.$O\
syscallfmt.$O\
trap.$O\
$CONF.root.$O\
diff --git a/sys/src/9/pc/random.c b/sys/src/9/port/random.c
index 8e60a2ba0..3a697827a 100644
--- a/sys/src/9/pc/random.c
+++ b/sys/src/9/port/random.c
@@ -5,14 +5,13 @@
#include "fns.h"
#include "../port/error.h"
-
struct Rb
{
QLock;
Rendez producer;
Rendez consumer;
ulong randomcount;
- uchar buf[1024];
+ uchar buf[128];
uchar *ep;
uchar *rp;
uchar *wp;
@@ -85,7 +84,7 @@ void
randominit(void)
{
/* Frequency close but not equal to HZ */
- addclock0link(randomclock, 13);
+ addclock0link(randomclock, MS2HZ+3);
rb.ep = rb.buf + sizeof(rb.buf);
rb.rp = rb.wp = rb.buf;
kproc("genrandom", genrandom, 0);
diff --git a/sys/src/9/ppc/mkfile b/sys/src/9/ppc/mkfile
index 3a8024c09..0ced83b9c 100644
--- a/sys/src/9/ppc/mkfile
+++ b/sys/src/9/ppc/mkfile
@@ -37,13 +37,13 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
clock.$O\
main.$O\
mmu.$O\
- random.$O\
trap.$O\
$CONF.root.$O\
$CONF.rootc.$O\
diff --git a/sys/src/9/ppc/random.c b/sys/src/9/ppc/random.c
deleted file mode 100644
index 3c204b8d1..000000000
--- a/sys/src/9/ppc/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[1024];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be precictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}