* Converts vring log address to GPA * If IOMMU is enabled, the log address is IOVA * If IOMMU not enabled, the log address is already GPA */
| 457 | * If IOMMU not enabled, the log address is already GPA |
| 458 | */ |
| 459 | uint64_t |
| 460 | translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq, |
| 461 | uint64_t log_addr) |
| 462 | { |
| 463 | if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { |
| 464 | const uint64_t exp_size = sizeof(uint64_t); |
| 465 | uint64_t hva, gpa; |
| 466 | uint64_t size = exp_size; |
| 467 | |
| 468 | hva = vhost_iova_to_vva(dev, vq, log_addr, |
| 469 | &size, VHOST_ACCESS_RW); |
| 470 | |
| 471 | if (size != exp_size) |
| 472 | return 0; |
| 473 | |
| 474 | gpa = hva_to_gpa(dev, hva, exp_size); |
| 475 | if (!gpa) { |
| 476 | VHOST_LOG_DATA(dev->ifname, ERR, |
| 477 | "failed to find GPA for log_addr: 0x%" |
| 478 | PRIx64 " hva: 0x%" PRIx64 "\n", |
| 479 | log_addr, hva); |
| 480 | return 0; |
| 481 | } |
| 482 | return gpa; |
| 483 | |
| 484 | } else |
| 485 | return log_addr; |
| 486 | } |
| 487 | |
| 488 | static int |
| 489 | vring_translate_split(struct virtio_net *dev, struct vhost_virtqueue *vq) |
no test coverage detected