|
@@ -182,6 +182,40 @@ fail:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Send msg and wait for a reply with command code RET_MSG.
|
|
|
|
+ * Returns the message received of size u64 or UINT64_MAX
|
|
|
|
+ * on error.
|
|
|
|
+ * Called from VCPU thread in non-coroutine context.
|
|
|
|
+ * Used by the Proxy object to communicate to remote processes.
|
|
|
|
+ */
|
|
|
|
+uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
|
|
|
|
+ Error **errp)
|
|
|
|
+{
|
|
|
|
+ ERRP_GUARD();
|
|
|
|
+ MPQemuMsg msg_reply = {0};
|
|
|
|
+ uint64_t ret = UINT64_MAX;
|
|
|
|
+
|
|
|
|
+ assert(!qemu_in_coroutine());
|
|
|
|
+
|
|
|
|
+ QEMU_LOCK_GUARD(&pdev->io_mutex);
|
|
|
|
+ if (!mpqemu_msg_send(msg, pdev->ioc, errp)) {
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!mpqemu_msg_recv(&msg_reply, pdev->ioc, errp)) {
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!mpqemu_msg_valid(&msg_reply)) {
|
|
|
|
+ error_setg(errp, "ERROR: Invalid reply received for command %d",
|
|
|
|
+ msg->cmd);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return msg_reply.data.u64;
|
|
|
|
+}
|
|
|
|
+
|
|
bool mpqemu_msg_valid(MPQemuMsg *msg)
|
|
bool mpqemu_msg_valid(MPQemuMsg *msg)
|
|
{
|
|
{
|
|
if (msg->cmd >= MPQEMU_CMD_MAX && msg->cmd < 0) {
|
|
if (msg->cmd >= MPQEMU_CMD_MAX && msg->cmd < 0) {
|