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 #include "qemu/rng.h" 147b1b5d19SPaolo Bonzini #include "qapi/qmp/qerror.h" 15a9b7b2adSAnthony Liguori 16a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size, 17a9b7b2adSAnthony Liguori EntropyReceiveFunc *receive_entropy, 18a9b7b2adSAnthony Liguori void *opaque) 19a9b7b2adSAnthony Liguori { 20a9b7b2adSAnthony Liguori RngBackendClass *k = RNG_BACKEND_GET_CLASS(s); 21a9b7b2adSAnthony Liguori 22a9b7b2adSAnthony Liguori if (k->request_entropy) { 23a9b7b2adSAnthony Liguori k->request_entropy(s, size, receive_entropy, opaque); 24a9b7b2adSAnthony Liguori } 25a9b7b2adSAnthony Liguori } 26a9b7b2adSAnthony Liguori 27a9b7b2adSAnthony Liguori void rng_backend_cancel_requests(RngBackend *s) 28a9b7b2adSAnthony Liguori { 29a9b7b2adSAnthony Liguori RngBackendClass *k = RNG_BACKEND_GET_CLASS(s); 30a9b7b2adSAnthony Liguori 31a9b7b2adSAnthony Liguori if (k->cancel_requests) { 32a9b7b2adSAnthony Liguori k->cancel_requests(s); 33a9b7b2adSAnthony Liguori } 34a9b7b2adSAnthony Liguori } 35a9b7b2adSAnthony Liguori 36a9b7b2adSAnthony Liguori static bool rng_backend_prop_get_opened(Object *obj, Error **errp) 37a9b7b2adSAnthony Liguori { 38a9b7b2adSAnthony Liguori RngBackend *s = RNG_BACKEND(obj); 39a9b7b2adSAnthony Liguori 40a9b7b2adSAnthony Liguori return s->opened; 41a9b7b2adSAnthony Liguori } 42a9b7b2adSAnthony Liguori 43a9b7b2adSAnthony Liguori void rng_backend_open(RngBackend *s, Error **errp) 44a9b7b2adSAnthony Liguori { 45a9b7b2adSAnthony Liguori object_property_set_bool(OBJECT(s), true, "opened", errp); 46a9b7b2adSAnthony Liguori } 47a9b7b2adSAnthony Liguori 48a9b7b2adSAnthony Liguori static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp) 49a9b7b2adSAnthony Liguori { 50a9b7b2adSAnthony Liguori RngBackend *s = RNG_BACKEND(obj); 51a9b7b2adSAnthony Liguori RngBackendClass *k = RNG_BACKEND_GET_CLASS(s); 52a9b7b2adSAnthony Liguori 53a9b7b2adSAnthony Liguori if (value == s->opened) { 54a9b7b2adSAnthony Liguori return; 55a9b7b2adSAnthony Liguori } 56a9b7b2adSAnthony Liguori 57a9b7b2adSAnthony Liguori if (!value && s->opened) { 58a9b7b2adSAnthony Liguori error_set(errp, QERR_PERMISSION_DENIED); 59a9b7b2adSAnthony Liguori return; 60a9b7b2adSAnthony Liguori } 61a9b7b2adSAnthony Liguori 62a9b7b2adSAnthony Liguori if (k->opened) { 63a9b7b2adSAnthony Liguori k->opened(s, errp); 64a9b7b2adSAnthony Liguori } 65a9b7b2adSAnthony Liguori 66a9b7b2adSAnthony Liguori if (!error_is_set(errp)) { 67a9b7b2adSAnthony Liguori s->opened = value; 68a9b7b2adSAnthony Liguori } 69a9b7b2adSAnthony Liguori } 70a9b7b2adSAnthony Liguori 71a9b7b2adSAnthony Liguori static void rng_backend_init(Object *obj) 72a9b7b2adSAnthony Liguori { 73a9b7b2adSAnthony Liguori object_property_add_bool(obj, "opened", 74a9b7b2adSAnthony Liguori rng_backend_prop_get_opened, 75a9b7b2adSAnthony Liguori rng_backend_prop_set_opened, 76a9b7b2adSAnthony Liguori NULL); 77a9b7b2adSAnthony Liguori } 78a9b7b2adSAnthony Liguori 79*8c43a6f0SAndreas Färber static const TypeInfo rng_backend_info = { 80a9b7b2adSAnthony Liguori .name = TYPE_RNG_BACKEND, 81a9b7b2adSAnthony Liguori .parent = TYPE_OBJECT, 82a9b7b2adSAnthony Liguori .instance_size = sizeof(RngBackend), 83a9b7b2adSAnthony Liguori .instance_init = rng_backend_init, 84a9b7b2adSAnthony Liguori .class_size = sizeof(RngBackendClass), 85a9b7b2adSAnthony Liguori .abstract = true, 86a9b7b2adSAnthony Liguori }; 87a9b7b2adSAnthony Liguori 88a9b7b2adSAnthony Liguori static void register_types(void) 89a9b7b2adSAnthony Liguori { 90a9b7b2adSAnthony Liguori type_register_static(&rng_backend_info); 91a9b7b2adSAnthony Liguori } 92a9b7b2adSAnthony Liguori 93a9b7b2adSAnthony Liguori type_init(register_types); 94