@@ -15,6 +15,8 @@
#include "qemu/thread.h"
#include "io/channel.h"
#include "exec/hwaddr.h"
+#include "io/channel-socket.h"
+#include "hw/pci/proxy.h"
#define REMOTE_MAX_FDS 8
@@ -77,6 +79,8 @@ typedef struct MPQemuRequest MPQemuRequest;
void mpqemu_msg_send_in_co(MPQemuRequest *req, QIOChannel *ioc, Error **errp);
void mpqemu_msg_recv_in_co(MPQemuRequest *req, QIOChannel *ioc, Error **errp);
+uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
+ Error **errp);
void mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
void mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
@@ -17,6 +17,7 @@
#include "qemu/iov.h"
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
+#include "io/channel.h"
void mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp)
{
@@ -150,6 +151,43 @@ fail:
}
}
+uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
+ Error **errp)
+{
+ MPQemuMsg msg_reply = {0};
+ uint64_t ret = UINT64_MAX;
+ Error *local_err = NULL;
+
+ qemu_mutex_unlock_iothread();
+ qemu_mutex_lock(&pdev->io_mutex);
+
+ mpqemu_msg_send(msg, pdev->ioc, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ goto exit_send;
+ }
+
+ mpqemu_msg_recv(&msg_reply, pdev->ioc, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ goto exit_send;
+ }
+
+ if (!mpqemu_msg_valid(&msg_reply) || msg_reply.cmd != RET_MSG) {
+ error_setg(errp, "ERROR: Invalid reply received for command %d",
+ msg->cmd);
+ goto exit_send;
+ } else {
+ ret = msg_reply.data.u64;
+ }
+
+ exit_send:
+ qemu_mutex_unlock(&pdev->io_mutex);
+ qemu_mutex_lock_iothread();
+
+ return ret;
+}
+
static void coroutine_fn mpqemu_msg_send_co(void *data)
{
MPQemuRequest *req = (MPQemuRequest *)data;