xref: /netbsd-src/sys/rump/librump/rumpkern/hyperentropy.c (revision f580bd2e6e19b498858188a113aeec9e73b36f5d)
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