|  | /* | 
|  | * Communication channel between QEMU and remote device process | 
|  | * | 
|  | * Copyright © 2018, 2021 Oracle and/or its affiliates. | 
|  | * | 
|  | * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
|  | * See the COPYING file in the top-level directory. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #ifndef MPQEMU_LINK_H | 
|  | #define MPQEMU_LINK_H | 
|  |  | 
|  | #include "qom/object.h" | 
|  | #include "qemu/thread.h" | 
|  | #include "io/channel.h" | 
|  | #include "exec/hwaddr.h" | 
|  | #include "io/channel-socket.h" | 
|  | #include "hw/remote/proxy.h" | 
|  |  | 
|  | #define REMOTE_MAX_FDS 8 | 
|  |  | 
|  | #define MPQEMU_MSG_HDR_SIZE offsetof(MPQemuMsg, data.u64) | 
|  |  | 
|  | /** | 
|  | * MPQemuCmd: | 
|  | * | 
|  | * MPQemuCmd enum type to specify the command to be executed on the remote | 
|  | * device. | 
|  | * | 
|  | * This uses a private protocol between QEMU and the remote process. vfio-user | 
|  | * protocol would supersede this in the future. | 
|  | * | 
|  | */ | 
|  | typedef enum { | 
|  | MPQEMU_CMD_SYNC_SYSMEM, | 
|  | MPQEMU_CMD_RET, | 
|  | MPQEMU_CMD_PCI_CFGWRITE, | 
|  | MPQEMU_CMD_PCI_CFGREAD, | 
|  | MPQEMU_CMD_BAR_WRITE, | 
|  | MPQEMU_CMD_BAR_READ, | 
|  | MPQEMU_CMD_SET_IRQFD, | 
|  | MPQEMU_CMD_DEVICE_RESET, | 
|  | MPQEMU_CMD_MAX, | 
|  | } MPQemuCmd; | 
|  |  | 
|  | typedef struct { | 
|  | hwaddr gpas[REMOTE_MAX_FDS]; | 
|  | uint64_t sizes[REMOTE_MAX_FDS]; | 
|  | off_t offsets[REMOTE_MAX_FDS]; | 
|  | } SyncSysmemMsg; | 
|  |  | 
|  | typedef struct { | 
|  | uint32_t addr; | 
|  | uint32_t val; | 
|  | int len; | 
|  | } PciConfDataMsg; | 
|  |  | 
|  | typedef struct { | 
|  | hwaddr addr; | 
|  | uint64_t val; | 
|  | unsigned size; | 
|  | bool memory; | 
|  | } BarAccessMsg; | 
|  |  | 
|  | /** | 
|  | * MPQemuMsg: | 
|  | * @cmd: The remote command | 
|  | * @size: Size of the data to be shared | 
|  | * @data: Structured data | 
|  | * @fds: File descriptors to be shared with remote device | 
|  | * | 
|  | * MPQemuMsg Format of the message sent to the remote device from QEMU. | 
|  | * | 
|  | */ | 
|  |  | 
|  | typedef struct { | 
|  | int cmd; | 
|  | size_t size; | 
|  |  | 
|  | union { | 
|  | uint64_t u64; | 
|  | PciConfDataMsg pci_conf_data; | 
|  | SyncSysmemMsg sync_sysmem; | 
|  | BarAccessMsg bar_access; | 
|  | } data; | 
|  |  | 
|  | int fds[REMOTE_MAX_FDS]; | 
|  | int num_fds; | 
|  | } MPQemuMsg; | 
|  |  | 
|  | bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp); | 
|  | bool mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp); | 
|  |  | 
|  | uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev, | 
|  | Error **errp); | 
|  | bool mpqemu_msg_valid(MPQemuMsg *msg); | 
|  |  | 
|  | #endif |