virtio.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. /*
  2. * Virtio Support
  3. *
  4. * Copyright IBM, Corp. 2007
  5. *
  6. * Authors:
  7. * Anthony Liguori <aliguori@us.ibm.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2. See
  10. * the COPYING file in the top-level directory.
  11. *
  12. */
  13. #include <inttypes.h>
  14. #include "trace.h"
  15. #include "qemu-error.h"
  16. #include "virtio.h"
  17. #include "qemu-barrier.h"
  18. /* The alignment to use between consumer and producer parts of vring.
  19. * x86 pagesize again. */
  20. #define VIRTIO_PCI_VRING_ALIGN 4096
  21. typedef struct VRingDesc
  22. {
  23. uint64_t addr;
  24. uint32_t len;
  25. uint16_t flags;
  26. uint16_t next;
  27. } VRingDesc;
  28. typedef struct VRingAvail
  29. {
  30. uint16_t flags;
  31. uint16_t idx;
  32. uint16_t ring[0];
  33. } VRingAvail;
  34. typedef struct VRingUsedElem
  35. {
  36. uint32_t id;
  37. uint32_t len;
  38. } VRingUsedElem;
  39. typedef struct VRingUsed
  40. {
  41. uint16_t flags;
  42. uint16_t idx;
  43. VRingUsedElem ring[0];
  44. } VRingUsed;
  45. typedef struct VRing
  46. {
  47. unsigned int num;
  48. target_phys_addr_t desc;
  49. target_phys_addr_t avail;
  50. target_phys_addr_t used;
  51. } VRing;
  52. struct VirtQueue
  53. {
  54. VRing vring;
  55. target_phys_addr_t pa;
  56. uint16_t last_avail_idx;
  57. /* Last used index value we have signalled on */
  58. uint16_t signalled_used;
  59. /* Last used index value we have signalled on */
  60. bool signalled_used_valid;
  61. /* Notification enabled? */
  62. bool notification;
  63. int inuse;
  64. uint16_t vector;
  65. void (*handle_output)(VirtIODevice *vdev, VirtQueue *vq);
  66. VirtIODevice *vdev;
  67. EventNotifier guest_notifier;
  68. EventNotifier host_notifier;
  69. };
  70. /* virt queue functions */
  71. static void virtqueue_init(VirtQueue *vq)
  72. {
  73. target_phys_addr_t pa = vq->pa;
  74. vq->vring.desc = pa;
  75. vq->vring.avail = pa + vq->vring.num * sizeof(VRingDesc);
  76. vq->vring.used = vring_align(vq->vring.avail +
  77. offsetof(VRingAvail, ring[vq->vring.num]),
  78. VIRTIO_PCI_VRING_ALIGN);
  79. }
  80. static inline uint64_t vring_desc_addr(target_phys_addr_t desc_pa, int i)
  81. {
  82. target_phys_addr_t pa;
  83. pa = desc_pa + sizeof(VRingDesc) * i + offsetof(VRingDesc, addr);
  84. return ldq_phys(pa);
  85. }
  86. static inline uint32_t vring_desc_len(target_phys_addr_t desc_pa, int i)
  87. {
  88. target_phys_addr_t pa;
  89. pa = desc_pa + sizeof(VRingDesc) * i + offsetof(VRingDesc, len);
  90. return ldl_phys(pa);
  91. }
  92. static inline uint16_t vring_desc_flags(target_phys_addr_t desc_pa, int i)
  93. {
  94. target_phys_addr_t pa;
  95. pa = desc_pa + sizeof(VRingDesc) * i + offsetof(VRingDesc, flags);
  96. return lduw_phys(pa);
  97. }
  98. static inline uint16_t vring_desc_next(target_phys_addr_t desc_pa, int i)
  99. {
  100. target_phys_addr_t pa;
  101. pa = desc_pa + sizeof(VRingDesc) * i + offsetof(VRingDesc, next);
  102. return lduw_phys(pa);
  103. }
  104. static inline uint16_t vring_avail_flags(VirtQueue *vq)
  105. {
  106. target_phys_addr_t pa;
  107. pa = vq->vring.avail + offsetof(VRingAvail, flags);
  108. return lduw_phys(pa);
  109. }
  110. static inline uint16_t vring_avail_idx(VirtQueue *vq)
  111. {
  112. target_phys_addr_t pa;
  113. pa = vq->vring.avail + offsetof(VRingAvail, idx);
  114. return lduw_phys(pa);
  115. }
  116. static inline uint16_t vring_avail_ring(VirtQueue *vq, int i)
  117. {
  118. target_phys_addr_t pa;
  119. pa = vq->vring.avail + offsetof(VRingAvail, ring[i]);
  120. return lduw_phys(pa);
  121. }
  122. static inline uint16_t vring_used_event(VirtQueue *vq)
  123. {
  124. return vring_avail_ring(vq, vq->vring.num);
  125. }
  126. static inline void vring_used_ring_id(VirtQueue *vq, int i, uint32_t val)
  127. {
  128. target_phys_addr_t pa;
  129. pa = vq->vring.used + offsetof(VRingUsed, ring[i].id);
  130. stl_phys(pa, val);
  131. }
  132. static inline void vring_used_ring_len(VirtQueue *vq, int i, uint32_t val)
  133. {
  134. target_phys_addr_t pa;
  135. pa = vq->vring.used + offsetof(VRingUsed, ring[i].len);
  136. stl_phys(pa, val);
  137. }
  138. static uint16_t vring_used_idx(VirtQueue *vq)
  139. {
  140. target_phys_addr_t pa;
  141. pa = vq->vring.used + offsetof(VRingUsed, idx);
  142. return lduw_phys(pa);
  143. }
  144. static inline void vring_used_idx_set(VirtQueue *vq, uint16_t val)
  145. {
  146. target_phys_addr_t pa;
  147. pa = vq->vring.used + offsetof(VRingUsed, idx);
  148. stw_phys(pa, val);
  149. }
  150. static inline void vring_used_flags_set_bit(VirtQueue *vq, int mask)
  151. {
  152. target_phys_addr_t pa;
  153. pa = vq->vring.used + offsetof(VRingUsed, flags);
  154. stw_phys(pa, lduw_phys(pa) | mask);
  155. }
  156. static inline void vring_used_flags_unset_bit(VirtQueue *vq, int mask)
  157. {
  158. target_phys_addr_t pa;
  159. pa = vq->vring.used + offsetof(VRingUsed, flags);
  160. stw_phys(pa, lduw_phys(pa) & ~mask);
  161. }
  162. static inline void vring_avail_event(VirtQueue *vq, uint16_t val)
  163. {
  164. target_phys_addr_t pa;
  165. if (!vq->notification) {
  166. return;
  167. }
  168. pa = vq->vring.used + offsetof(VRingUsed, ring[vq->vring.num]);
  169. stw_phys(pa, val);
  170. }
  171. void virtio_queue_set_notification(VirtQueue *vq, int enable)
  172. {
  173. vq->notification = enable;
  174. if (vq->vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX)) {
  175. vring_avail_event(vq, vring_avail_idx(vq));
  176. } else if (enable) {
  177. vring_used_flags_unset_bit(vq, VRING_USED_F_NO_NOTIFY);
  178. } else {
  179. vring_used_flags_set_bit(vq, VRING_USED_F_NO_NOTIFY);
  180. }
  181. }
  182. int virtio_queue_ready(VirtQueue *vq)
  183. {
  184. return vq->vring.avail != 0;
  185. }
  186. int virtio_queue_empty(VirtQueue *vq)
  187. {
  188. return vring_avail_idx(vq) == vq->last_avail_idx;
  189. }
  190. void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
  191. unsigned int len, unsigned int idx)
  192. {
  193. unsigned int offset;
  194. int i;
  195. trace_virtqueue_fill(vq, elem, len, idx);
  196. offset = 0;
  197. for (i = 0; i < elem->in_num; i++) {
  198. size_t size = MIN(len - offset, elem->in_sg[i].iov_len);
  199. cpu_physical_memory_unmap(elem->in_sg[i].iov_base,
  200. elem->in_sg[i].iov_len,
  201. 1, size);
  202. offset += elem->in_sg[i].iov_len;
  203. }
  204. for (i = 0; i < elem->out_num; i++)
  205. cpu_physical_memory_unmap(elem->out_sg[i].iov_base,
  206. elem->out_sg[i].iov_len,
  207. 0, elem->out_sg[i].iov_len);
  208. idx = (idx + vring_used_idx(vq)) % vq->vring.num;
  209. /* Get a pointer to the next entry in the used ring. */
  210. vring_used_ring_id(vq, idx, elem->index);
  211. vring_used_ring_len(vq, idx, len);
  212. }
  213. void virtqueue_flush(VirtQueue *vq, unsigned int count)
  214. {
  215. uint16_t old, new;
  216. /* Make sure buffer is written before we update index. */
  217. smp_wmb();
  218. trace_virtqueue_flush(vq, count);
  219. old = vring_used_idx(vq);
  220. new = old + count;
  221. vring_used_idx_set(vq, new);
  222. vq->inuse -= count;
  223. if (unlikely((int16_t)(new - vq->signalled_used) < (uint16_t)(new - old)))
  224. vq->signalled_used_valid = false;
  225. }
  226. void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
  227. unsigned int len)
  228. {
  229. virtqueue_fill(vq, elem, len, 0);
  230. virtqueue_flush(vq, 1);
  231. }
  232. static int virtqueue_num_heads(VirtQueue *vq, unsigned int idx)
  233. {
  234. uint16_t num_heads = vring_avail_idx(vq) - idx;
  235. /* Check it isn't doing very strange things with descriptor numbers. */
  236. if (num_heads > vq->vring.num) {
  237. error_report("Guest moved used index from %u to %u",
  238. idx, vring_avail_idx(vq));
  239. exit(1);
  240. }
  241. return num_heads;
  242. }
  243. static unsigned int virtqueue_get_head(VirtQueue *vq, unsigned int idx)
  244. {
  245. unsigned int head;
  246. /* Grab the next descriptor number they're advertising, and increment
  247. * the index we've seen. */
  248. head = vring_avail_ring(vq, idx % vq->vring.num);
  249. /* If their number is silly, that's a fatal mistake. */
  250. if (head >= vq->vring.num) {
  251. error_report("Guest says index %u is available", head);
  252. exit(1);
  253. }
  254. return head;
  255. }
  256. static unsigned virtqueue_next_desc(target_phys_addr_t desc_pa,
  257. unsigned int i, unsigned int max)
  258. {
  259. unsigned int next;
  260. /* If this descriptor says it doesn't chain, we're done. */
  261. if (!(vring_desc_flags(desc_pa, i) & VRING_DESC_F_NEXT))
  262. return max;
  263. /* Check they're not leading us off end of descriptors. */
  264. next = vring_desc_next(desc_pa, i);
  265. /* Make sure compiler knows to grab that: we don't want it changing! */
  266. smp_wmb();
  267. if (next >= max) {
  268. error_report("Desc next is %u", next);
  269. exit(1);
  270. }
  271. return next;
  272. }
  273. int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes)
  274. {
  275. unsigned int idx;
  276. int total_bufs, in_total, out_total;
  277. idx = vq->last_avail_idx;
  278. total_bufs = in_total = out_total = 0;
  279. while (virtqueue_num_heads(vq, idx)) {
  280. unsigned int max, num_bufs, indirect = 0;
  281. target_phys_addr_t desc_pa;
  282. int i;
  283. max = vq->vring.num;
  284. num_bufs = total_bufs;
  285. i = virtqueue_get_head(vq, idx++);
  286. desc_pa = vq->vring.desc;
  287. if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_INDIRECT) {
  288. if (vring_desc_len(desc_pa, i) % sizeof(VRingDesc)) {
  289. error_report("Invalid size for indirect buffer table");
  290. exit(1);
  291. }
  292. /* If we've got too many, that implies a descriptor loop. */
  293. if (num_bufs >= max) {
  294. error_report("Looped descriptor");
  295. exit(1);
  296. }
  297. /* loop over the indirect descriptor table */
  298. indirect = 1;
  299. max = vring_desc_len(desc_pa, i) / sizeof(VRingDesc);
  300. num_bufs = i = 0;
  301. desc_pa = vring_desc_addr(desc_pa, i);
  302. }
  303. do {
  304. /* If we've got too many, that implies a descriptor loop. */
  305. if (++num_bufs > max) {
  306. error_report("Looped descriptor");
  307. exit(1);
  308. }
  309. if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_WRITE) {
  310. if (in_bytes > 0 &&
  311. (in_total += vring_desc_len(desc_pa, i)) >= in_bytes)
  312. return 1;
  313. } else {
  314. if (out_bytes > 0 &&
  315. (out_total += vring_desc_len(desc_pa, i)) >= out_bytes)
  316. return 1;
  317. }
  318. } while ((i = virtqueue_next_desc(desc_pa, i, max)) != max);
  319. if (!indirect)
  320. total_bufs = num_bufs;
  321. else
  322. total_bufs++;
  323. }
  324. return 0;
  325. }
  326. void virtqueue_map_sg(struct iovec *sg, target_phys_addr_t *addr,
  327. size_t num_sg, int is_write)
  328. {
  329. unsigned int i;
  330. target_phys_addr_t len;
  331. for (i = 0; i < num_sg; i++) {
  332. len = sg[i].iov_len;
  333. sg[i].iov_base = cpu_physical_memory_map(addr[i], &len, is_write);
  334. if (sg[i].iov_base == NULL || len != sg[i].iov_len) {
  335. error_report("virtio: trying to map MMIO memory");
  336. exit(1);
  337. }
  338. }
  339. }
  340. int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem)
  341. {
  342. unsigned int i, head, max;
  343. target_phys_addr_t desc_pa = vq->vring.desc;
  344. if (!virtqueue_num_heads(vq, vq->last_avail_idx))
  345. return 0;
  346. /* When we start there are none of either input nor output. */
  347. elem->out_num = elem->in_num = 0;
  348. max = vq->vring.num;
  349. i = head = virtqueue_get_head(vq, vq->last_avail_idx++);
  350. if (vq->vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX)) {
  351. vring_avail_event(vq, vring_avail_idx(vq));
  352. }
  353. if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_INDIRECT) {
  354. if (vring_desc_len(desc_pa, i) % sizeof(VRingDesc)) {
  355. error_report("Invalid size for indirect buffer table");
  356. exit(1);
  357. }
  358. /* loop over the indirect descriptor table */
  359. max = vring_desc_len(desc_pa, i) / sizeof(VRingDesc);
  360. desc_pa = vring_desc_addr(desc_pa, i);
  361. i = 0;
  362. }
  363. /* Collect all the descriptors */
  364. do {
  365. struct iovec *sg;
  366. if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_WRITE) {
  367. if (elem->in_num >= ARRAY_SIZE(elem->in_sg)) {
  368. error_report("Too many write descriptors in indirect table");
  369. exit(1);
  370. }
  371. elem->in_addr[elem->in_num] = vring_desc_addr(desc_pa, i);
  372. sg = &elem->in_sg[elem->in_num++];
  373. } else {
  374. if (elem->out_num >= ARRAY_SIZE(elem->out_sg)) {
  375. error_report("Too many read descriptors in indirect table");
  376. exit(1);
  377. }
  378. elem->out_addr[elem->out_num] = vring_desc_addr(desc_pa, i);
  379. sg = &elem->out_sg[elem->out_num++];
  380. }
  381. sg->iov_len = vring_desc_len(desc_pa, i);
  382. /* If we've got too many, that implies a descriptor loop. */
  383. if ((elem->in_num + elem->out_num) > max) {
  384. error_report("Looped descriptor");
  385. exit(1);
  386. }
  387. } while ((i = virtqueue_next_desc(desc_pa, i, max)) != max);
  388. /* Now map what we have collected */
  389. virtqueue_map_sg(elem->in_sg, elem->in_addr, elem->in_num, 1);
  390. virtqueue_map_sg(elem->out_sg, elem->out_addr, elem->out_num, 0);
  391. elem->index = head;
  392. vq->inuse++;
  393. trace_virtqueue_pop(vq, elem, elem->in_num, elem->out_num);
  394. return elem->in_num + elem->out_num;
  395. }
  396. /* virtio device */
  397. static void virtio_notify_vector(VirtIODevice *vdev, uint16_t vector)
  398. {
  399. if (vdev->binding->notify) {
  400. vdev->binding->notify(vdev->binding_opaque, vector);
  401. }
  402. }
  403. void virtio_update_irq(VirtIODevice *vdev)
  404. {
  405. virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
  406. }
  407. void virtio_set_status(VirtIODevice *vdev, uint8_t val)
  408. {
  409. trace_virtio_set_status(vdev, val);
  410. if (vdev->set_status) {
  411. vdev->set_status(vdev, val);
  412. }
  413. vdev->status = val;
  414. }
  415. void virtio_reset(void *opaque)
  416. {
  417. VirtIODevice *vdev = opaque;
  418. int i;
  419. virtio_set_status(vdev, 0);
  420. if (vdev->reset)
  421. vdev->reset(vdev);
  422. vdev->guest_features = 0;
  423. vdev->queue_sel = 0;
  424. vdev->status = 0;
  425. vdev->isr = 0;
  426. vdev->config_vector = VIRTIO_NO_VECTOR;
  427. virtio_notify_vector(vdev, vdev->config_vector);
  428. for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
  429. vdev->vq[i].vring.desc = 0;
  430. vdev->vq[i].vring.avail = 0;
  431. vdev->vq[i].vring.used = 0;
  432. vdev->vq[i].last_avail_idx = 0;
  433. vdev->vq[i].pa = 0;
  434. vdev->vq[i].vector = VIRTIO_NO_VECTOR;
  435. vdev->vq[i].signalled_used = 0;
  436. vdev->vq[i].signalled_used_valid = false;
  437. vdev->vq[i].notification = true;
  438. }
  439. }
  440. uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr)
  441. {
  442. uint8_t val;
  443. vdev->get_config(vdev, vdev->config);
  444. if (addr > (vdev->config_len - sizeof(val)))
  445. return (uint32_t)-1;
  446. memcpy(&val, vdev->config + addr, sizeof(val));
  447. return val;
  448. }
  449. uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr)
  450. {
  451. uint16_t val;
  452. vdev->get_config(vdev, vdev->config);
  453. if (addr > (vdev->config_len - sizeof(val)))
  454. return (uint32_t)-1;
  455. memcpy(&val, vdev->config + addr, sizeof(val));
  456. return val;
  457. }
  458. uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr)
  459. {
  460. uint32_t val;
  461. vdev->get_config(vdev, vdev->config);
  462. if (addr > (vdev->config_len - sizeof(val)))
  463. return (uint32_t)-1;
  464. memcpy(&val, vdev->config + addr, sizeof(val));
  465. return val;
  466. }
  467. void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data)
  468. {
  469. uint8_t val = data;
  470. if (addr > (vdev->config_len - sizeof(val)))
  471. return;
  472. memcpy(vdev->config + addr, &val, sizeof(val));
  473. if (vdev->set_config)
  474. vdev->set_config(vdev, vdev->config);
  475. }
  476. void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data)
  477. {
  478. uint16_t val = data;
  479. if (addr > (vdev->config_len - sizeof(val)))
  480. return;
  481. memcpy(vdev->config + addr, &val, sizeof(val));
  482. if (vdev->set_config)
  483. vdev->set_config(vdev, vdev->config);
  484. }
  485. void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data)
  486. {
  487. uint32_t val = data;
  488. if (addr > (vdev->config_len - sizeof(val)))
  489. return;
  490. memcpy(vdev->config + addr, &val, sizeof(val));
  491. if (vdev->set_config)
  492. vdev->set_config(vdev, vdev->config);
  493. }
  494. void virtio_queue_set_addr(VirtIODevice *vdev, int n, target_phys_addr_t addr)
  495. {
  496. vdev->vq[n].pa = addr;
  497. virtqueue_init(&vdev->vq[n]);
  498. }
  499. target_phys_addr_t virtio_queue_get_addr(VirtIODevice *vdev, int n)
  500. {
  501. return vdev->vq[n].pa;
  502. }
  503. int virtio_queue_get_num(VirtIODevice *vdev, int n)
  504. {
  505. return vdev->vq[n].vring.num;
  506. }
  507. void virtio_queue_notify_vq(VirtQueue *vq)
  508. {
  509. if (vq->vring.desc) {
  510. VirtIODevice *vdev = vq->vdev;
  511. trace_virtio_queue_notify(vdev, vq - vdev->vq, vq);
  512. vq->handle_output(vdev, vq);
  513. }
  514. }
  515. void virtio_queue_notify(VirtIODevice *vdev, int n)
  516. {
  517. virtio_queue_notify_vq(&vdev->vq[n]);
  518. }
  519. uint16_t virtio_queue_vector(VirtIODevice *vdev, int n)
  520. {
  521. return n < VIRTIO_PCI_QUEUE_MAX ? vdev->vq[n].vector :
  522. VIRTIO_NO_VECTOR;
  523. }
  524. void virtio_queue_set_vector(VirtIODevice *vdev, int n, uint16_t vector)
  525. {
  526. if (n < VIRTIO_PCI_QUEUE_MAX)
  527. vdev->vq[n].vector = vector;
  528. }
  529. VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
  530. void (*handle_output)(VirtIODevice *, VirtQueue *))
  531. {
  532. int i;
  533. for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
  534. if (vdev->vq[i].vring.num == 0)
  535. break;
  536. }
  537. if (i == VIRTIO_PCI_QUEUE_MAX || queue_size > VIRTQUEUE_MAX_SIZE)
  538. abort();
  539. vdev->vq[i].vring.num = queue_size;
  540. vdev->vq[i].handle_output = handle_output;
  541. return &vdev->vq[i];
  542. }
  543. void virtio_irq(VirtQueue *vq)
  544. {
  545. trace_virtio_irq(vq);
  546. vq->vdev->isr |= 0x01;
  547. virtio_notify_vector(vq->vdev, vq->vector);
  548. }
  549. /* Assuming a given event_idx value from the other size, if
  550. * we have just incremented index from old to new_idx,
  551. * should we trigger an event? */
  552. static inline int vring_need_event(uint16_t event, uint16_t new, uint16_t old)
  553. {
  554. /* Note: Xen has similar logic for notification hold-off
  555. * in include/xen/interface/io/ring.h with req_event and req_prod
  556. * corresponding to event_idx + 1 and new respectively.
  557. * Note also that req_event and req_prod in Xen start at 1,
  558. * event indexes in virtio start at 0. */
  559. return (uint16_t)(new - event - 1) < (uint16_t)(new - old);
  560. }
  561. static bool vring_notify(VirtIODevice *vdev, VirtQueue *vq)
  562. {
  563. uint16_t old, new;
  564. bool v;
  565. /* Always notify when queue is empty (when feature acknowledge) */
  566. if (((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
  567. !vq->inuse && vring_avail_idx(vq) == vq->last_avail_idx)) {
  568. return true;
  569. }
  570. if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
  571. return !(vring_avail_flags(vq) & VRING_AVAIL_F_NO_INTERRUPT);
  572. }
  573. v = vq->signalled_used_valid;
  574. vq->signalled_used_valid = true;
  575. old = vq->signalled_used;
  576. new = vq->signalled_used = vring_used_idx(vq);
  577. return !v || vring_need_event(vring_used_event(vq), new, old);
  578. }
  579. void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
  580. {
  581. if (!vring_notify(vdev, vq)) {
  582. return;
  583. }
  584. trace_virtio_notify(vdev, vq);
  585. vdev->isr |= 0x01;
  586. virtio_notify_vector(vdev, vq->vector);
  587. }
  588. void virtio_notify_config(VirtIODevice *vdev)
  589. {
  590. if (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK))
  591. return;
  592. vdev->isr |= 0x03;
  593. virtio_notify_vector(vdev, vdev->config_vector);
  594. }
  595. void virtio_save(VirtIODevice *vdev, QEMUFile *f)
  596. {
  597. int i;
  598. if (vdev->binding->save_config)
  599. vdev->binding->save_config(vdev->binding_opaque, f);
  600. qemu_put_8s(f, &vdev->status);
  601. qemu_put_8s(f, &vdev->isr);
  602. qemu_put_be16s(f, &vdev->queue_sel);
  603. qemu_put_be32s(f, &vdev->guest_features);
  604. qemu_put_be32(f, vdev->config_len);
  605. qemu_put_buffer(f, vdev->config, vdev->config_len);
  606. for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
  607. if (vdev->vq[i].vring.num == 0)
  608. break;
  609. }
  610. qemu_put_be32(f, i);
  611. for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
  612. if (vdev->vq[i].vring.num == 0)
  613. break;
  614. qemu_put_be32(f, vdev->vq[i].vring.num);
  615. qemu_put_be64(f, vdev->vq[i].pa);
  616. qemu_put_be16s(f, &vdev->vq[i].last_avail_idx);
  617. if (vdev->binding->save_queue)
  618. vdev->binding->save_queue(vdev->binding_opaque, i, f);
  619. }
  620. }
  621. int virtio_set_features(VirtIODevice *vdev, uint32_t val)
  622. {
  623. uint32_t supported_features =
  624. vdev->binding->get_features(vdev->binding_opaque);
  625. bool bad = (val & ~supported_features) != 0;
  626. val &= supported_features;
  627. if (vdev->set_features) {
  628. vdev->set_features(vdev, val);
  629. }
  630. vdev->guest_features = val;
  631. return bad ? -1 : 0;
  632. }
  633. int virtio_load(VirtIODevice *vdev, QEMUFile *f)
  634. {
  635. int num, i, ret;
  636. uint32_t features;
  637. uint32_t supported_features;
  638. if (vdev->binding->load_config) {
  639. ret = vdev->binding->load_config(vdev->binding_opaque, f);
  640. if (ret)
  641. return ret;
  642. }
  643. qemu_get_8s(f, &vdev->status);
  644. qemu_get_8s(f, &vdev->isr);
  645. qemu_get_be16s(f, &vdev->queue_sel);
  646. qemu_get_be32s(f, &features);
  647. if (virtio_set_features(vdev, features) < 0) {
  648. supported_features = vdev->binding->get_features(vdev->binding_opaque);
  649. error_report("Features 0x%x unsupported. Allowed features: 0x%x",
  650. features, supported_features);
  651. return -1;
  652. }
  653. vdev->config_len = qemu_get_be32(f);
  654. qemu_get_buffer(f, vdev->config, vdev->config_len);
  655. num = qemu_get_be32(f);
  656. for (i = 0; i < num; i++) {
  657. vdev->vq[i].vring.num = qemu_get_be32(f);
  658. vdev->vq[i].pa = qemu_get_be64(f);
  659. qemu_get_be16s(f, &vdev->vq[i].last_avail_idx);
  660. vdev->vq[i].signalled_used_valid = false;
  661. vdev->vq[i].notification = true;
  662. if (vdev->vq[i].pa) {
  663. uint16_t nheads;
  664. virtqueue_init(&vdev->vq[i]);
  665. nheads = vring_avail_idx(&vdev->vq[i]) - vdev->vq[i].last_avail_idx;
  666. /* Check it isn't doing very strange things with descriptor numbers. */
  667. if (nheads > vdev->vq[i].vring.num) {
  668. error_report("VQ %d size 0x%x Guest index 0x%x "
  669. "inconsistent with Host index 0x%x: delta 0x%x",
  670. i, vdev->vq[i].vring.num,
  671. vring_avail_idx(&vdev->vq[i]),
  672. vdev->vq[i].last_avail_idx, nheads);
  673. return -1;
  674. }
  675. } else if (vdev->vq[i].last_avail_idx) {
  676. error_report("VQ %d address 0x0 "
  677. "inconsistent with Host index 0x%x",
  678. i, vdev->vq[i].last_avail_idx);
  679. return -1;
  680. }
  681. if (vdev->binding->load_queue) {
  682. ret = vdev->binding->load_queue(vdev->binding_opaque, i, f);
  683. if (ret)
  684. return ret;
  685. }
  686. }
  687. virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
  688. return 0;
  689. }
  690. void virtio_cleanup(VirtIODevice *vdev)
  691. {
  692. qemu_del_vm_change_state_handler(vdev->vmstate);
  693. if (vdev->config)
  694. g_free(vdev->config);
  695. g_free(vdev->vq);
  696. g_free(vdev);
  697. }
  698. static void virtio_vmstate_change(void *opaque, int running, RunState state)
  699. {
  700. VirtIODevice *vdev = opaque;
  701. bool backend_run = running && (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK);
  702. vdev->vm_running = running;
  703. if (backend_run) {
  704. virtio_set_status(vdev, vdev->status);
  705. }
  706. if (vdev->binding->vmstate_change) {
  707. vdev->binding->vmstate_change(vdev->binding_opaque, backend_run);
  708. }
  709. if (!backend_run) {
  710. virtio_set_status(vdev, vdev->status);
  711. }
  712. }
  713. VirtIODevice *virtio_common_init(const char *name, uint16_t device_id,
  714. size_t config_size, size_t struct_size)
  715. {
  716. VirtIODevice *vdev;
  717. int i;
  718. vdev = g_malloc0(struct_size);
  719. vdev->device_id = device_id;
  720. vdev->status = 0;
  721. vdev->isr = 0;
  722. vdev->queue_sel = 0;
  723. vdev->config_vector = VIRTIO_NO_VECTOR;
  724. vdev->vq = g_malloc0(sizeof(VirtQueue) * VIRTIO_PCI_QUEUE_MAX);
  725. vdev->vm_running = runstate_is_running();
  726. for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
  727. vdev->vq[i].vector = VIRTIO_NO_VECTOR;
  728. vdev->vq[i].vdev = vdev;
  729. }
  730. vdev->name = name;
  731. vdev->config_len = config_size;
  732. if (vdev->config_len)
  733. vdev->config = g_malloc0(config_size);
  734. else
  735. vdev->config = NULL;
  736. vdev->vmstate = qemu_add_vm_change_state_handler(virtio_vmstate_change, vdev);
  737. return vdev;
  738. }
  739. void virtio_bind_device(VirtIODevice *vdev, const VirtIOBindings *binding,
  740. void *opaque)
  741. {
  742. vdev->binding = binding;
  743. vdev->binding_opaque = opaque;
  744. }
  745. target_phys_addr_t virtio_queue_get_desc_addr(VirtIODevice *vdev, int n)
  746. {
  747. return vdev->vq[n].vring.desc;
  748. }
  749. target_phys_addr_t virtio_queue_get_avail_addr(VirtIODevice *vdev, int n)
  750. {
  751. return vdev->vq[n].vring.avail;
  752. }
  753. target_phys_addr_t virtio_queue_get_used_addr(VirtIODevice *vdev, int n)
  754. {
  755. return vdev->vq[n].vring.used;
  756. }
  757. target_phys_addr_t virtio_queue_get_ring_addr(VirtIODevice *vdev, int n)
  758. {
  759. return vdev->vq[n].vring.desc;
  760. }
  761. target_phys_addr_t virtio_queue_get_desc_size(VirtIODevice *vdev, int n)
  762. {
  763. return sizeof(VRingDesc) * vdev->vq[n].vring.num;
  764. }
  765. target_phys_addr_t virtio_queue_get_avail_size(VirtIODevice *vdev, int n)
  766. {
  767. return offsetof(VRingAvail, ring) +
  768. sizeof(uint64_t) * vdev->vq[n].vring.num;
  769. }
  770. target_phys_addr_t virtio_queue_get_used_size(VirtIODevice *vdev, int n)
  771. {
  772. return offsetof(VRingUsed, ring) +
  773. sizeof(VRingUsedElem) * vdev->vq[n].vring.num;
  774. }
  775. target_phys_addr_t virtio_queue_get_ring_size(VirtIODevice *vdev, int n)
  776. {
  777. return vdev->vq[n].vring.used - vdev->vq[n].vring.desc +
  778. virtio_queue_get_used_size(vdev, n);
  779. }
  780. uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n)
  781. {
  782. return vdev->vq[n].last_avail_idx;
  783. }
  784. void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
  785. {
  786. vdev->vq[n].last_avail_idx = idx;
  787. }
  788. VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n)
  789. {
  790. return vdev->vq + n;
  791. }
  792. EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq)
  793. {
  794. return &vq->guest_notifier;
  795. }
  796. EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq)
  797. {
  798. return &vq->host_notifier;
  799. }