xref: /openbmc/qemu/include/sysemu/rng.h (revision c122bca9)
1dccfcd0eSPaolo Bonzini /*
2dccfcd0eSPaolo Bonzini  * QEMU Random Number Generator Backend
3dccfcd0eSPaolo Bonzini  *
4dccfcd0eSPaolo Bonzini  * Copyright IBM, Corp. 2012
5dccfcd0eSPaolo Bonzini  *
6dccfcd0eSPaolo Bonzini  * Authors:
7dccfcd0eSPaolo Bonzini  *  Anthony Liguori   <aliguori@us.ibm.com>
8dccfcd0eSPaolo Bonzini  *
9dccfcd0eSPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10dccfcd0eSPaolo Bonzini  * See the COPYING file in the top-level directory.
11dccfcd0eSPaolo Bonzini  */
12dccfcd0eSPaolo Bonzini 
13dccfcd0eSPaolo Bonzini #ifndef QEMU_RNG_H
14dccfcd0eSPaolo Bonzini #define QEMU_RNG_H
15dccfcd0eSPaolo Bonzini 
16dc5e9ac7SMarkus Armbruster #include "qemu/queue.h"
17dccfcd0eSPaolo Bonzini #include "qom/object.h"
18dccfcd0eSPaolo Bonzini 
19dccfcd0eSPaolo Bonzini #define TYPE_RNG_BACKEND "rng-backend"
20c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(RngBackend, RngBackendClass,
21*30b5707cSEduardo Habkost                     RNG_BACKEND)
22dccfcd0eSPaolo Bonzini 
230198c262SLaurent Vivier #define TYPE_RNG_BUILTIN "rng-builtin"
240198c262SLaurent Vivier 
2574074e8aSLadi Prosek typedef struct RngRequest RngRequest;
26dccfcd0eSPaolo Bonzini 
27dccfcd0eSPaolo Bonzini typedef void (EntropyReceiveFunc)(void *opaque,
28dccfcd0eSPaolo Bonzini                                   const void *data,
29dccfcd0eSPaolo Bonzini                                   size_t size);
30dccfcd0eSPaolo Bonzini 
3174074e8aSLadi Prosek struct RngRequest
3274074e8aSLadi Prosek {
3374074e8aSLadi Prosek     EntropyReceiveFunc *receive_entropy;
3474074e8aSLadi Prosek     uint8_t *data;
3574074e8aSLadi Prosek     void *opaque;
3674074e8aSLadi Prosek     size_t offset;
3774074e8aSLadi Prosek     size_t size;
38443590c2SLadi Prosek     QSIMPLEQ_ENTRY(RngRequest) next;
3974074e8aSLadi Prosek };
4074074e8aSLadi Prosek 
41dccfcd0eSPaolo Bonzini struct RngBackendClass
42dccfcd0eSPaolo Bonzini {
43dccfcd0eSPaolo Bonzini     ObjectClass parent_class;
44dccfcd0eSPaolo Bonzini 
4560253ed1SLadi Prosek     void (*request_entropy)(RngBackend *s, RngRequest *req);
46dccfcd0eSPaolo Bonzini 
47dccfcd0eSPaolo Bonzini     void (*opened)(RngBackend *s, Error **errp);
48dccfcd0eSPaolo Bonzini };
49dccfcd0eSPaolo Bonzini 
50dccfcd0eSPaolo Bonzini struct RngBackend
51dccfcd0eSPaolo Bonzini {
52dccfcd0eSPaolo Bonzini     Object parent;
53dccfcd0eSPaolo Bonzini 
54dccfcd0eSPaolo Bonzini     /*< protected >*/
55dccfcd0eSPaolo Bonzini     bool opened;
56b58deb34SPaolo Bonzini     QSIMPLEQ_HEAD(, RngRequest) requests;
57dccfcd0eSPaolo Bonzini };
58dccfcd0eSPaolo Bonzini 
599f14b0adSLadi Prosek 
60dccfcd0eSPaolo Bonzini /**
61dccfcd0eSPaolo Bonzini  * rng_backend_request_entropy:
62dccfcd0eSPaolo Bonzini  * @s: the backend to request entropy from
63dccfcd0eSPaolo Bonzini  * @size: the number of bytes of data to request
64dccfcd0eSPaolo Bonzini  * @receive_entropy: a function to be invoked when entropy is available
65dccfcd0eSPaolo Bonzini  * @opaque: data that should be passed to @receive_entropy
66dccfcd0eSPaolo Bonzini  *
67dccfcd0eSPaolo Bonzini  * This function is used by the front-end to request entropy from an entropy
68dccfcd0eSPaolo Bonzini  * source.  This function can be called multiple times before @receive_entropy
69dccfcd0eSPaolo Bonzini  * is invoked with different values of @receive_entropy and @opaque.  The
70dccfcd0eSPaolo Bonzini  * backend will queue each request and handle appropriately.
71dccfcd0eSPaolo Bonzini  *
72dccfcd0eSPaolo Bonzini  * The backend does not need to pass the full amount of data to @receive_entropy
73dccfcd0eSPaolo Bonzini  * but will pass a value greater than 0.
74dccfcd0eSPaolo Bonzini  */
75dccfcd0eSPaolo Bonzini void rng_backend_request_entropy(RngBackend *s, size_t size,
76dccfcd0eSPaolo Bonzini                                  EntropyReceiveFunc *receive_entropy,
77dccfcd0eSPaolo Bonzini                                  void *opaque);
789f14b0adSLadi Prosek 
799f14b0adSLadi Prosek /**
809f14b0adSLadi Prosek  * rng_backend_free_request:
819f14b0adSLadi Prosek  * @s: the backend that created the request
829f14b0adSLadi Prosek  * @req: the request to finalize
839f14b0adSLadi Prosek  *
849f14b0adSLadi Prosek  * Used by child rng backend classes to finalize requests once they've been
859f14b0adSLadi Prosek  * processed. The request is removed from the list of active requests and
869f14b0adSLadi Prosek  * deleted.
879f14b0adSLadi Prosek  */
889f14b0adSLadi Prosek void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
89dccfcd0eSPaolo Bonzini #endif
90