From 7f04d86dfbb43cdbd18b2e3be31421dc9efee3b7 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 3 May 2012 08:49:25 +0200 Subject: kernel: move duplicated random.c to port --- sys/src/9/ppc/mkfile | 2 +- sys/src/9/ppc/random.c | 138 ------------------------------------------------- 2 files changed, 1 insertion(+), 139 deletions(-) delete mode 100644 sys/src/9/ppc/random.c (limited to 'sys/src/9/ppc') 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; -} -- cgit v1.2.3