2 * QEMU Builtin Random Number Generator Backend
4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
5 * See the COPYING file in the top-level directory.
8 #include "qemu/osdep.h"
9 #include "sysemu/rng.h"
10 #include "qemu/main-loop.h"
11 #include "qemu/guest-random.h"
12 #include "qom/object.h"
14 typedef struct RngBuiltin RngBuiltin
;
15 DECLARE_INSTANCE_CHECKER(RngBuiltin
, RNG_BUILTIN
,
23 static void rng_builtin_receive_entropy_bh(void *opaque
)
25 RngBuiltin
*s
= opaque
;
27 while (!QSIMPLEQ_EMPTY(&s
->parent
.requests
)) {
28 RngRequest
*req
= QSIMPLEQ_FIRST(&s
->parent
.requests
);
30 qemu_guest_getrandom_nofail(req
->data
, req
->size
);
32 req
->receive_entropy(req
->opaque
, req
->data
, req
->size
);
34 rng_backend_finalize_request(&s
->parent
, req
);
38 static void rng_builtin_request_entropy(RngBackend
*b
, RngRequest
*req
)
40 RngBuiltin
*s
= RNG_BUILTIN(b
);
42 qemu_bh_schedule(s
->bh
);
45 static void rng_builtin_init(Object
*obj
)
47 RngBuiltin
*s
= RNG_BUILTIN(obj
);
49 s
->bh
= qemu_bh_new(rng_builtin_receive_entropy_bh
, s
);
52 static void rng_builtin_finalize(Object
*obj
)
54 RngBuiltin
*s
= RNG_BUILTIN(obj
);
56 qemu_bh_delete(s
->bh
);
59 static void rng_builtin_class_init(ObjectClass
*klass
, void *data
)
61 RngBackendClass
*rbc
= RNG_BACKEND_CLASS(klass
);
63 rbc
->request_entropy
= rng_builtin_request_entropy
;
66 static const TypeInfo rng_builtin_info
= {
67 .name
= TYPE_RNG_BUILTIN
,
68 .parent
= TYPE_RNG_BACKEND
,
69 .instance_size
= sizeof(RngBuiltin
),
70 .instance_init
= rng_builtin_init
,
71 .instance_finalize
= rng_builtin_finalize
,
72 .class_init
= rng_builtin_class_init
,
75 static void register_types(void)
77 type_register_static(&rng_builtin_info
);
80 type_init(register_types
);