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