summaryrefslogtreecommitdiff
path: root/sys/src/9/pc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-08-27 20:42:31 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-08-27 20:42:31 +0200
commit0a5f81a44230cbd562b6d71a0a5be018e24a5ba6 (patch)
tree883f1cb3f5cc91053fb377c2ac28b2db1bd07ba1 /sys/src/9/pc
parent71ac88392f2033256b29f22bd8afdd7374100e5a (diff)
kernel: switch to fast portable chacha based seed-once random number generator
Diffstat (limited to 'sys/src/9/pc')
-rw-r--r--sys/src/9/pc/devarch.c5
-rw-r--r--sys/src/9/pc/mkfile2
-rw-r--r--sys/src/9/pc/pcrandom.c152
3 files changed, 6 insertions, 153 deletions
diff --git a/sys/src/9/pc/devarch.c b/sys/src/9/pc/devarch.c
index f3be061cb..0b4cad252 100644
--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -872,6 +872,11 @@ cpuidentify(void)
fprestore = fpx87restore;
}
+ if(strcmp(m->cpuidid, "GenuineIntel") == 0 && (m->cpuidcx & Rdrnd) != 0)
+ hwrandbuf = rdrandbuf;
+ else
+ hwrandbuf = nil;
+
cputype = t;
return t->family;
}
diff --git a/sys/src/9/pc/mkfile b/sys/src/9/pc/mkfile
index 96ab2c623..c6e683e22 100644
--- a/sys/src/9/pc/mkfile
+++ b/sys/src/9/pc/mkfile
@@ -32,6 +32,7 @@ PORT=\
proc.$O\
qio.$O\
qlock.$O\
+ random.$O\
rdb.$O\
rebootcmd.$O\
segment.$O\
@@ -52,7 +53,6 @@ OBJ=\
memory.$O\
mmu.$O\
trap.$O\
- pcrandom.$O\
$CONF.root.$O\
$CONF.rootc.$O\
$DEVS\
diff --git a/sys/src/9/pc/pcrandom.c b/sys/src/9/pc/pcrandom.c
deleted file mode 100644
index 386d7bf8e..000000000
--- a/sys/src/9/pc/pcrandom.c
+++ /dev/null
@@ -1,152 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-static int haverdrand;
-
-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;
-
- while(waserror())
- ;
- for(;;){
- if(++rb.randomcount <= 100000)
- continue;
- 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)
-{
- if(!strcmp(m->cpuidid, "GenuineIntel")
- && (m->cpuidcx & Rdrnd)){
- haverdrand = 1;
- }
- else{
- /* Frequency close but not equal to HZ */
- addclock0link(randomclock, MS2HZ+3);
- 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(haverdrand){
- rdrandbuf(p, n);
- return n;
- }
-
- 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;
-}