1
2
3
4
5
6
7
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
27
28
29
30
31
32
33
34
35typedef 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
47typedef struct {
48 hwaddr gpas[REMOTE_MAX_FDS];
49 uint64_t sizes[REMOTE_MAX_FDS];
50 off_t offsets[REMOTE_MAX_FDS];
51} SyncSysmemMsg;
52
53typedef struct {
54 uint32_t addr;
55 uint32_t val;
56 int len;
57} PciConfDataMsg;
58
59typedef struct {
60 hwaddr addr;
61 uint64_t val;
62 unsigned size;
63 bool memory;
64} BarAccessMsg;
65
66
67
68
69
70
71
72
73
74
75
76
77typedef 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
92bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
93bool mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
94
95uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
96 Error **errp);
97bool mpqemu_msg_valid(MPQemuMsg *msg);
98
99#endif
100