When vhost-user backend register memory region based host notifiers, we should return RAM device MR of notify region MR's subregion in virtio_address_space_lookup.
In seabios, it will use virtio PCI Configration Access Capability access notify region when assign notify region above 4GB. This will exit to QEMU and invoke virtio_address_space_write. When vhost-user backend register memory region based host notifiers, return RAM device MR instead of notify region MR is suitable. Co-developed-by: Zuo Boqun <zuobo...@baidu.com> Signed-off-by: Gao Shiyuan <gaoshiy...@baidu.com> Signed-off-by: Zuo Boqun <zuobo...@baidu.com> --- hw/virtio/virtio-pci.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 9534730bba..167ac9718a 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -610,13 +610,22 @@ static MemoryRegion *virtio_address_space_lookup(VirtIOPCIProxy *proxy, { int i; VirtIOPCIRegion *reg; + MemoryRegion *mr, *submr; for (i = 0; i < ARRAY_SIZE(proxy->regs); ++i) { reg = &proxy->regs[i]; if (*off >= reg->offset && *off + len <= reg->offset + reg->size) { *off -= reg->offset; - return ®->mr; + mr = ®->mr; + QTAILQ_FOREACH(submr, &mr->subregions, subregions_link) { + if (*off >= submr->addr && + *off + len < submr->addr + submr->size) { + *off -= submr->addr; + return submr; + } + } + return mr; } } -- 2.39.3 (Apple Git-146)