xref: /qemu/include/system/rng.h (revision 42015c9acb9fb418c97c42f6e0d44c84999c769d)
1a9b7b2adSAnthony Liguori /*
2a9b7b2adSAnthony Liguori  * QEMU Random Number Generator Backend
3a9b7b2adSAnthony Liguori  *
4a9b7b2adSAnthony Liguori  * Copyright IBM, Corp. 2012
5a9b7b2adSAnthony Liguori  *
6a9b7b2adSAnthony Liguori  * Authors:
7a9b7b2adSAnthony Liguori  *  Anthony Liguori   <aliguori@us.ibm.com>
8a9b7b2adSAnthony Liguori  *
9a9b7b2adSAnthony Liguori  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10a9b7b2adSAnthony Liguori  * See the COPYING file in the top-level directory.
11a9b7b2adSAnthony Liguori  */
12a9b7b2adSAnthony Liguori 
13a9b7b2adSAnthony Liguori #ifndef QEMU_RNG_H
14a9b7b2adSAnthony Liguori #define QEMU_RNG_H
15a9b7b2adSAnthony Liguori 
16a9b7b2adSAnthony Liguori #include "qemu/object.h"
17a9b7b2adSAnthony Liguori #include "qemu-common.h"
18a9b7b2adSAnthony Liguori #include "error.h"
19a9b7b2adSAnthony Liguori 
20a9b7b2adSAnthony Liguori #define TYPE_RNG_BACKEND "rng-backend"
21a9b7b2adSAnthony Liguori #define RNG_BACKEND(obj) \
22a9b7b2adSAnthony Liguori     OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND)
23a9b7b2adSAnthony Liguori #define RNG_BACKEND_GET_CLASS(obj) \
24a9b7b2adSAnthony Liguori     OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND)
25a9b7b2adSAnthony Liguori #define RNG_BACKEND_CLASS(klass) \
26a9b7b2adSAnthony Liguori     OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
27a9b7b2adSAnthony Liguori 
28a9b7b2adSAnthony Liguori typedef struct RngBackendClass RngBackendClass;
29a9b7b2adSAnthony Liguori typedef struct RngBackend RngBackend;
30a9b7b2adSAnthony Liguori 
31a9b7b2adSAnthony Liguori typedef void (EntropyReceiveFunc)(void *opaque,
32a9b7b2adSAnthony Liguori                                   const void *data,
33a9b7b2adSAnthony Liguori                                   size_t size);
34a9b7b2adSAnthony Liguori 
35a9b7b2adSAnthony Liguori struct RngBackendClass
36a9b7b2adSAnthony Liguori {
37a9b7b2adSAnthony Liguori     ObjectClass parent_class;
38a9b7b2adSAnthony Liguori 
39a9b7b2adSAnthony Liguori     void (*request_entropy)(RngBackend *s, size_t size,
40a9b7b2adSAnthony Liguori                             EntropyReceiveFunc *recieve_entropy, void *opaque);
41a9b7b2adSAnthony Liguori     void (*cancel_requests)(RngBackend *s);
42a9b7b2adSAnthony Liguori 
43a9b7b2adSAnthony Liguori     void (*opened)(RngBackend *s, Error **errp);
44a9b7b2adSAnthony Liguori };
45a9b7b2adSAnthony Liguori 
46a9b7b2adSAnthony Liguori struct RngBackend
47a9b7b2adSAnthony Liguori {
48a9b7b2adSAnthony Liguori     Object parent;
49a9b7b2adSAnthony Liguori 
50a9b7b2adSAnthony Liguori     /*< protected >*/
51a9b7b2adSAnthony Liguori     bool opened;
52a9b7b2adSAnthony Liguori };
53a9b7b2adSAnthony Liguori 
54a9b7b2adSAnthony Liguori /**
55a9b7b2adSAnthony Liguori  * rng_backend_request_entropy:
56a9b7b2adSAnthony Liguori  * @s: the backend to request entropy from
57a9b7b2adSAnthony Liguori  * @size: the number of bytes of data to request
58a9b7b2adSAnthony Liguori  * @receive_entropy: a function to be invoked when entropy is available
59a9b7b2adSAnthony Liguori  * @opaque: data that should be passed to @receive_entropy
60a9b7b2adSAnthony Liguori  *
61a9b7b2adSAnthony Liguori  * This function is used by the front-end to request entropy from an entropy
62a9b7b2adSAnthony Liguori  * source.  This function can be called multiple times before @receive_entropy
63a9b7b2adSAnthony Liguori  * is invoked with different values of @receive_entropy and @opaque.  The
64*42015c9aSAmit Shah  * backend will queue each request and handle appropriately.
65a9b7b2adSAnthony Liguori  *
66a9b7b2adSAnthony Liguori  * The backend does not need to pass the full amount of data to @receive_entropy
67*42015c9aSAmit Shah  * but will pass a value greater than 0.
68a9b7b2adSAnthony Liguori  */
69a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size,
70a9b7b2adSAnthony Liguori                                  EntropyReceiveFunc *receive_entropy,
71a9b7b2adSAnthony Liguori                                  void *opaque);
72a9b7b2adSAnthony Liguori 
73a9b7b2adSAnthony Liguori /**
74a9b7b2adSAnthony Liguori  * rng_backend_cancel_requests:
75a9b7b2adSAnthony Liguori  * @s: the backend to cancel all pending requests in
76a9b7b2adSAnthony Liguori  *
77a9b7b2adSAnthony Liguori  * Cancels all pending requests submitted by @rng_backend_request_entropy.  This
78a9b7b2adSAnthony Liguori  * should be used by a device during reset or in preparation for live migration
79a9b7b2adSAnthony Liguori  * to stop tracking any request.
80a9b7b2adSAnthony Liguori  */
81a9b7b2adSAnthony Liguori void rng_backend_cancel_requests(RngBackend *s);
82a9b7b2adSAnthony Liguori 
83a9b7b2adSAnthony Liguori /**
84a9b7b2adSAnthony Liguori  * rng_backend_open:
85a9b7b2adSAnthony Liguori  * @s: the backend to open
86a9b7b2adSAnthony Liguori  * @errp: a pointer to return the #Error object if an error occurs.
87a9b7b2adSAnthony Liguori  *
88a9b7b2adSAnthony Liguori  * This function will open the backend if it is not already open.  Calling this
89a9b7b2adSAnthony Liguori  * function on an already opened backend will not result in an error.
90a9b7b2adSAnthony Liguori  */
91a9b7b2adSAnthony Liguori void rng_backend_open(RngBackend *s, Error **errp);
92a9b7b2adSAnthony Liguori 
93a9b7b2adSAnthony Liguori #endif
94