static void randomseed(void*) { Seedbuf *s; s = secalloc(sizeof(Seedbuf)); if(hwrandbuf != nil) (*hwrandbuf)(s->buf, sizeof(s->buf)); /* Frequency close but not equal to HZ */ up->tns = (vlong)(MS2HZ+3)*1000000LL; up->tmode = Tperiodic; up->tt = nil; up->ta = s; up->tf = randomsample; timeradd(up); while(s->nbuf < sizeof(s->buf)){ if(++s->randomcount <= 100000) continue; if(anyhigher()) sched(); } timerdel(up); sha2_512(s->buf, sizeof(s->buf), s->buf, &s->ds); setupChachastate(rs, s->buf, 32, s->buf+32, 12, 20); qunlock(rs); secfree(s); pexit("", 1); } void randominit(void) { rs = secalloc(sizeof(*rs)); qlock(rs); /* randomseed() unlocks once seeded */ kproc("randomseed", randomseed, nil); }