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