1*f580bd2eSriastradh /* $NetBSD: hyperentropy.c,v 1.17 2020/04/30 03:41:20 riastradh Exp $ */
22d797719Spooka
32d797719Spooka /*
42d797719Spooka * Copyright (c) 2014 Antti Kantee. All Rights Reserved.
52d797719Spooka *
62d797719Spooka * Redistribution and use in source and binary forms, with or without
72d797719Spooka * modification, are permitted provided that the following conditions
82d797719Spooka * are met:
92d797719Spooka * 1. Redistributions of source code must retain the above copyright
102d797719Spooka * notice, this list of conditions and the following disclaimer.
112d797719Spooka * 2. Redistributions in binary form must reproduce the above copyright
122d797719Spooka * notice, this list of conditions and the following disclaimer in the
132d797719Spooka * documentation and/or other materials provided with the distribution.
142d797719Spooka *
152d797719Spooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
162d797719Spooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
172d797719Spooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
182d797719Spooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
192d797719Spooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
202d797719Spooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
212d797719Spooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
222d797719Spooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
232d797719Spooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
242d797719Spooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
252d797719Spooka * SUCH DAMAGE.
262d797719Spooka */
272d797719Spooka
2870b43d6dSjustin #include <sys/cdefs.h>
29*f580bd2eSriastradh __KERNEL_RCSID(0, "$NetBSD: hyperentropy.c,v 1.17 2020/04/30 03:41:20 riastradh Exp $");
302d797719Spooka
315179cdd3Sriastradh #include <sys/param.h>
322d797719Spooka #include <sys/kmem.h>
3367d6ba47Sriastradh #include <sys/rndsource.h>
342d797719Spooka
356bb51422Spooka #include <rump-sys/kern.h>
362d797719Spooka
376bb51422Spooka #include <rump/rumpuser.h>
382d797719Spooka
392d797719Spooka static krndsource_t rndsrc;
402d797719Spooka
412d797719Spooka static void
feedrandom(size_t bytes,void * cookie __unused)42e3389aceSriastradh feedrandom(size_t bytes, void *cookie __unused)
432d797719Spooka {
4484093338Spooka uint8_t *rnddata;
452b38f133Sriastradh size_t n, nread;
462d797719Spooka
474df5e81cSriastradh rnddata = kmem_intr_alloc(bytes, KM_SLEEP);
482b38f133Sriastradh n = 0;
494df5e81cSriastradh while (n < bytes) {
504df5e81cSriastradh if (rumpuser_getrandom(rnddata + n, bytes - n,
512b38f133Sriastradh RUMPUSER_RANDOM_HARD|RUMPUSER_RANDOM_NOWAIT, &nread)
522b38f133Sriastradh != 0)
532b38f133Sriastradh break;
544df5e81cSriastradh n += MIN(nread, bytes - n);
552b38f133Sriastradh }
562b38f133Sriastradh if (n) {
572b38f133Sriastradh rnd_add_data_sync(&rndsrc, rnddata, n, NBBY*n);
589e2ce23eSriastradh }
594df5e81cSriastradh kmem_intr_free(rnddata, bytes);
602d797719Spooka }
612d797719Spooka
622d797719Spooka void
rump_hyperentropy_init(void)632d797719Spooka rump_hyperentropy_init(void)
642d797719Spooka {
652d797719Spooka
66e3389aceSriastradh rndsource_setcb(&rndsrc, &feedrandom, NULL);
672d797719Spooka rnd_attach_source(&rndsrc, "rump_hyperent", RND_TYPE_VM,
68ea6af427Stls RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
692d797719Spooka }
70