virtio-rng.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*
  2. * A virtio device implementing a hardware random number generator.
  3. *
  4. * Copyright 2012 Red Hat, Inc.
  5. * Copyright 2012 Amit Shah <amit.shah@redhat.com>
  6. *
  7. * This work is licensed under the terms of the GNU GPL, version 2 or
  8. * (at your option) any later version. See the COPYING file in the
  9. * top-level directory.
  10. */
  11. #include "qemu/iov.h"
  12. #include "hw/qdev.h"
  13. #include "hw/virtio/virtio.h"
  14. #include "hw/virtio/virtio-rng.h"
  15. #include "sysemu/rng.h"
  16. #include "qom/object_interfaces.h"
  17. #include "trace.h"
  18. static bool is_guest_ready(VirtIORNG *vrng)
  19. {
  20. VirtIODevice *vdev = VIRTIO_DEVICE(vrng);
  21. if (virtio_queue_ready(vrng->vq)
  22. && (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
  23. return true;
  24. }
  25. trace_virtio_rng_guest_not_ready(vrng);
  26. return false;
  27. }
  28. static size_t get_request_size(VirtQueue *vq, unsigned quota)
  29. {
  30. unsigned int in, out;
  31. virtqueue_get_avail_bytes(vq, &in, &out, quota, 0);
  32. return in;
  33. }
  34. static void virtio_rng_process(VirtIORNG *vrng);
  35. /* Send data from a char device over to the guest */
  36. static void chr_read(void *opaque, const void *buf, size_t size)
  37. {
  38. VirtIORNG *vrng = opaque;
  39. VirtIODevice *vdev = VIRTIO_DEVICE(vrng);
  40. VirtQueueElement elem;
  41. size_t len;
  42. int offset;
  43. if (!is_guest_ready(vrng)) {
  44. return;
  45. }
  46. vrng->quota_remaining -= size;
  47. offset = 0;
  48. while (offset < size) {
  49. if (!virtqueue_pop(vrng->vq, &elem)) {
  50. break;
  51. }
  52. len = iov_from_buf(elem.in_sg, elem.in_num,
  53. 0, buf + offset, size - offset);
  54. offset += len;
  55. virtqueue_push(vrng->vq, &elem, len);
  56. trace_virtio_rng_pushed(vrng, len);
  57. }
  58. virtio_notify(vdev, vrng->vq);
  59. }
  60. static void virtio_rng_process(VirtIORNG *vrng)
  61. {
  62. size_t size;
  63. unsigned quota;
  64. if (!is_guest_ready(vrng)) {
  65. return;
  66. }
  67. if (vrng->quota_remaining < 0) {
  68. quota = 0;
  69. } else {
  70. quota = MIN((uint64_t)vrng->quota_remaining, (uint64_t)UINT32_MAX);
  71. }
  72. size = get_request_size(vrng->vq, quota);
  73. trace_virtio_rng_request(vrng, size, quota);
  74. size = MIN(vrng->quota_remaining, size);
  75. if (size) {
  76. rng_backend_request_entropy(vrng->rng, size, chr_read, vrng);
  77. }
  78. }
  79. static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
  80. {
  81. VirtIORNG *vrng = VIRTIO_RNG(vdev);
  82. virtio_rng_process(vrng);
  83. }
  84. static uint64_t get_features(VirtIODevice *vdev, uint64_t f)
  85. {
  86. return f;
  87. }
  88. static void virtio_rng_save(QEMUFile *f, void *opaque)
  89. {
  90. VirtIODevice *vdev = opaque;
  91. virtio_save(vdev, f);
  92. }
  93. static int virtio_rng_load(QEMUFile *f, void *opaque, int version_id)
  94. {
  95. VirtIORNG *vrng = opaque;
  96. int ret;
  97. if (version_id != 1) {
  98. return -EINVAL;
  99. }
  100. ret = virtio_load(VIRTIO_DEVICE(vrng), f, version_id);
  101. if (ret != 0) {
  102. return ret;
  103. }
  104. /* We may have an element ready but couldn't process it due to a quota
  105. * limit. Make sure to try again after live migration when the quota may
  106. * have been reset.
  107. */
  108. virtio_rng_process(vrng);
  109. return 0;
  110. }
  111. static void check_rate_limit(void *opaque)
  112. {
  113. VirtIORNG *vrng = opaque;
  114. vrng->quota_remaining = vrng->conf.max_bytes;
  115. virtio_rng_process(vrng);
  116. timer_mod(vrng->rate_limit_timer,
  117. qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + vrng->conf.period_ms);
  118. }
  119. static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
  120. {
  121. VirtIODevice *vdev = VIRTIO_DEVICE(dev);
  122. VirtIORNG *vrng = VIRTIO_RNG(dev);
  123. Error *local_err = NULL;
  124. if (vrng->conf.period_ms <= 0) {
  125. error_setg(errp, "'period' parameter expects a positive integer");
  126. return;
  127. }
  128. /* Workaround: Property parsing does not enforce unsigned integers,
  129. * So this is a hack to reject such numbers. */
  130. if (vrng->conf.max_bytes > INT64_MAX) {
  131. error_setg(errp, "'max-bytes' parameter must be non-negative, "
  132. "and less than 2^63");
  133. return;
  134. }
  135. if (vrng->conf.rng == NULL) {
  136. vrng->conf.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM));
  137. user_creatable_complete(OBJECT(vrng->conf.default_backend),
  138. &local_err);
  139. if (local_err) {
  140. error_propagate(errp, local_err);
  141. object_unref(OBJECT(vrng->conf.default_backend));
  142. return;
  143. }
  144. object_property_add_child(OBJECT(dev),
  145. "default-backend",
  146. OBJECT(vrng->conf.default_backend),
  147. NULL);
  148. /* The child property took a reference, we can safely drop ours now */
  149. object_unref(OBJECT(vrng->conf.default_backend));
  150. object_property_set_link(OBJECT(dev),
  151. OBJECT(vrng->conf.default_backend),
  152. "rng", NULL);
  153. }
  154. vrng->rng = vrng->conf.rng;
  155. if (vrng->rng == NULL) {
  156. error_setg(errp, "'rng' parameter expects a valid object");
  157. return;
  158. }
  159. virtio_init(vdev, "virtio-rng", VIRTIO_ID_RNG, 0);
  160. vrng->vq = virtio_add_queue(vdev, 8, handle_input);
  161. vrng->quota_remaining = vrng->conf.max_bytes;
  162. vrng->rate_limit_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL,
  163. check_rate_limit, vrng);
  164. timer_mod(vrng->rate_limit_timer,
  165. qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + vrng->conf.period_ms);
  166. register_savevm(dev, "virtio-rng", -1, 1, virtio_rng_save,
  167. virtio_rng_load, vrng);
  168. }
  169. static void virtio_rng_device_unrealize(DeviceState *dev, Error **errp)
  170. {
  171. VirtIODevice *vdev = VIRTIO_DEVICE(dev);
  172. VirtIORNG *vrng = VIRTIO_RNG(dev);
  173. timer_del(vrng->rate_limit_timer);
  174. timer_free(vrng->rate_limit_timer);
  175. unregister_savevm(dev, "virtio-rng", vrng);
  176. virtio_cleanup(vdev);
  177. }
  178. static Property virtio_rng_properties[] = {
  179. /* Set a default rate limit of 2^47 bytes per minute or roughly 2TB/s. If
  180. * you have an entropy source capable of generating more entropy than this
  181. * and you can pass it through via virtio-rng, then hats off to you. Until
  182. * then, this is unlimited for all practical purposes.
  183. */
  184. DEFINE_PROP_UINT64("max-bytes", VirtIORNG, conf.max_bytes, INT64_MAX),
  185. DEFINE_PROP_UINT32("period", VirtIORNG, conf.period_ms, 1 << 16),
  186. DEFINE_PROP_END_OF_LIST(),
  187. };
  188. static void virtio_rng_class_init(ObjectClass *klass, void *data)
  189. {
  190. DeviceClass *dc = DEVICE_CLASS(klass);
  191. VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
  192. dc->props = virtio_rng_properties;
  193. set_bit(DEVICE_CATEGORY_MISC, dc->categories);
  194. vdc->realize = virtio_rng_device_realize;
  195. vdc->unrealize = virtio_rng_device_unrealize;
  196. vdc->get_features = get_features;
  197. }
  198. static void virtio_rng_initfn(Object *obj)
  199. {
  200. VirtIORNG *vrng = VIRTIO_RNG(obj);
  201. object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
  202. (Object **)&vrng->conf.rng,
  203. qdev_prop_allow_set_link_before_realize,
  204. OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL);
  205. }
  206. static const TypeInfo virtio_rng_info = {
  207. .name = TYPE_VIRTIO_RNG,
  208. .parent = TYPE_VIRTIO_DEVICE,
  209. .instance_size = sizeof(VirtIORNG),
  210. .instance_init = virtio_rng_initfn,
  211. .class_init = virtio_rng_class_init,
  212. };
  213. static void virtio_register_types(void)
  214. {
  215. type_register_static(&virtio_rng_info);
  216. }
  217. type_init(virtio_register_types)