mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
multi-process: PCI BAR read/write handling for proxy & remote endpoints
Proxy device object implements handler for PCI BAR writes and reads. The handler uses BAR_WRITE/BAR_READ message to communicate to the remote process with the BAR address and value to be written/read. The remote process implements handler for BAR_WRITE/BAR_READ message. Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> Signed-off-by: John G Johnson <john.g.johnson@oracle.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: a8b76714a9688be5552c4c92d089bc9e8a4707ff.1611938319.git.jag.raman@oracle.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
11ab872588
commit
7ee3f82384
5 changed files with 168 additions and 0 deletions
|
@ -152,3 +152,63 @@ static void pci_proxy_dev_register_types(void)
|
|||
}
|
||||
|
||||
type_init(pci_proxy_dev_register_types)
|
||||
|
||||
static void send_bar_access_msg(PCIProxyDev *pdev, MemoryRegion *mr,
|
||||
bool write, hwaddr addr, uint64_t *val,
|
||||
unsigned size, bool memory)
|
||||
{
|
||||
MPQemuMsg msg = { 0 };
|
||||
long ret = -EINVAL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
msg.size = sizeof(BarAccessMsg);
|
||||
msg.data.bar_access.addr = mr->addr + addr;
|
||||
msg.data.bar_access.size = size;
|
||||
msg.data.bar_access.memory = memory;
|
||||
|
||||
if (write) {
|
||||
msg.cmd = MPQEMU_CMD_BAR_WRITE;
|
||||
msg.data.bar_access.val = *val;
|
||||
} else {
|
||||
msg.cmd = MPQEMU_CMD_BAR_READ;
|
||||
}
|
||||
|
||||
ret = mpqemu_msg_send_and_await_reply(&msg, pdev, &local_err);
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
}
|
||||
|
||||
if (!write) {
|
||||
*val = ret;
|
||||
}
|
||||
}
|
||||
|
||||
static void proxy_bar_write(void *opaque, hwaddr addr, uint64_t val,
|
||||
unsigned size)
|
||||
{
|
||||
ProxyMemoryRegion *pmr = opaque;
|
||||
|
||||
send_bar_access_msg(pmr->dev, &pmr->mr, true, addr, &val, size,
|
||||
pmr->memory);
|
||||
}
|
||||
|
||||
static uint64_t proxy_bar_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
ProxyMemoryRegion *pmr = opaque;
|
||||
uint64_t val;
|
||||
|
||||
send_bar_access_msg(pmr->dev, &pmr->mr, false, addr, &val, size,
|
||||
pmr->memory);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
const MemoryRegionOps proxy_mr_ops = {
|
||||
.read = proxy_bar_read,
|
||||
.write = proxy_bar_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.impl = {
|
||||
.min_access_size = 1,
|
||||
.max_access_size = 8,
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue