| 553 | } |
| 554 | |
| 555 | static __rte_always_inline uint32_t |
| 556 | copy_data_from_desc(void *dst, struct vhost_crypto_data_req *vc_req, |
| 557 | struct vhost_crypto_desc *desc, uint32_t size) |
| 558 | __rte_shared_locks_required(&vc_req->vq->iotlb_lock) |
| 559 | { |
| 560 | uint64_t remain; |
| 561 | uint64_t addr; |
| 562 | |
| 563 | remain = RTE_MIN(desc->len, size); |
| 564 | addr = desc->addr; |
| 565 | do { |
| 566 | uint64_t len; |
| 567 | void *src; |
| 568 | |
| 569 | len = remain; |
| 570 | src = IOVA_TO_VVA(void *, vc_req, addr, &len, VHOST_ACCESS_RO); |
| 571 | if (unlikely(src == NULL || len == 0)) |
| 572 | return 0; |
| 573 | |
| 574 | rte_memcpy(dst, src, len); |
| 575 | remain -= len; |
| 576 | /* cast is needed for 32-bit architecture */ |
| 577 | dst = RTE_PTR_ADD(dst, (size_t)len); |
| 578 | addr += len; |
| 579 | } while (unlikely(remain != 0)); |
| 580 | |
| 581 | return RTE_MIN(desc->len, size); |
| 582 | } |
| 583 | |
| 584 | |
| 585 | static __rte_always_inline int |
no test coverage detected