qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

mpqemu-link.h (2222B)


      1 /*
      2  * Communication channel between QEMU and remote device process
      3  *
      4  * Copyright © 2018, 2021 Oracle and/or its affiliates.
      5  *
      6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
      7  * See the COPYING file in the top-level directory.
      8  *
      9  */
     10 
     11 #ifndef MPQEMU_LINK_H
     12 #define MPQEMU_LINK_H
     13 
     14 #include "qom/object.h"
     15 #include "qemu/thread.h"
     16 #include "io/channel.h"
     17 #include "exec/hwaddr.h"
     18 #include "io/channel-socket.h"
     19 #include "hw/remote/proxy.h"
     20 
     21 #define REMOTE_MAX_FDS 8
     22 
     23 #define MPQEMU_MSG_HDR_SIZE offsetof(MPQemuMsg, data.u64)
     24 
     25 /**
     26  * MPQemuCmd:
     27  *
     28  * MPQemuCmd enum type to specify the command to be executed on the remote
     29  * device.
     30  *
     31  * This uses a private protocol between QEMU and the remote process. vfio-user
     32  * protocol would supersede this in the future.
     33  *
     34  */
     35 typedef enum {
     36     MPQEMU_CMD_SYNC_SYSMEM,
     37     MPQEMU_CMD_RET,
     38     MPQEMU_CMD_PCI_CFGWRITE,
     39     MPQEMU_CMD_PCI_CFGREAD,
     40     MPQEMU_CMD_BAR_WRITE,
     41     MPQEMU_CMD_BAR_READ,
     42     MPQEMU_CMD_SET_IRQFD,
     43     MPQEMU_CMD_DEVICE_RESET,
     44     MPQEMU_CMD_MAX,
     45 } MPQemuCmd;
     46 
     47 typedef struct {
     48     hwaddr gpas[REMOTE_MAX_FDS];
     49     uint64_t sizes[REMOTE_MAX_FDS];
     50     off_t offsets[REMOTE_MAX_FDS];
     51 } SyncSysmemMsg;
     52 
     53 typedef struct {
     54     uint32_t addr;
     55     uint32_t val;
     56     int len;
     57 } PciConfDataMsg;
     58 
     59 typedef struct {
     60     hwaddr addr;
     61     uint64_t val;
     62     unsigned size;
     63     bool memory;
     64 } BarAccessMsg;
     65 
     66 /**
     67  * MPQemuMsg:
     68  * @cmd: The remote command
     69  * @size: Size of the data to be shared
     70  * @data: Structured data
     71  * @fds: File descriptors to be shared with remote device
     72  *
     73  * MPQemuMsg Format of the message sent to the remote device from QEMU.
     74  *
     75  */
     76 
     77 typedef struct {
     78     int cmd;
     79     size_t size;
     80 
     81     union {
     82         uint64_t u64;
     83         PciConfDataMsg pci_conf_data;
     84         SyncSysmemMsg sync_sysmem;
     85         BarAccessMsg bar_access;
     86     } data;
     87 
     88     int fds[REMOTE_MAX_FDS];
     89     int num_fds;
     90 } MPQemuMsg;
     91 
     92 bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
     93 bool mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
     94 
     95 uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
     96                                          Error **errp);
     97 bool mpqemu_msg_valid(MPQemuMsg *msg);
     98 
     99 #endif