|
@@ -19,6 +19,7 @@
|
|
#include "exec/memattrs.h"
|
|
#include "exec/memattrs.h"
|
|
#include "hw/remote/memory.h"
|
|
#include "hw/remote/memory.h"
|
|
#include "hw/remote/iohub.h"
|
|
#include "hw/remote/iohub.h"
|
|
|
|
+#include "sysemu/reset.h"
|
|
|
|
|
|
static void process_config_write(QIOChannel *ioc, PCIDevice *dev,
|
|
static void process_config_write(QIOChannel *ioc, PCIDevice *dev,
|
|
MPQemuMsg *msg, Error **errp);
|
|
MPQemuMsg *msg, Error **errp);
|
|
@@ -26,6 +27,8 @@ static void process_config_read(QIOChannel *ioc, PCIDevice *dev,
|
|
MPQemuMsg *msg, Error **errp);
|
|
MPQemuMsg *msg, Error **errp);
|
|
static void process_bar_write(QIOChannel *ioc, MPQemuMsg *msg, Error **errp);
|
|
static void process_bar_write(QIOChannel *ioc, MPQemuMsg *msg, Error **errp);
|
|
static void process_bar_read(QIOChannel *ioc, MPQemuMsg *msg, Error **errp);
|
|
static void process_bar_read(QIOChannel *ioc, MPQemuMsg *msg, Error **errp);
|
|
|
|
+static void process_device_reset_msg(QIOChannel *ioc, PCIDevice *dev,
|
|
|
|
+ Error **errp);
|
|
|
|
|
|
void coroutine_fn mpqemu_remote_msg_loop_co(void *data)
|
|
void coroutine_fn mpqemu_remote_msg_loop_co(void *data)
|
|
{
|
|
{
|
|
@@ -69,6 +72,9 @@ void coroutine_fn mpqemu_remote_msg_loop_co(void *data)
|
|
case MPQEMU_CMD_SET_IRQFD:
|
|
case MPQEMU_CMD_SET_IRQFD:
|
|
process_set_irqfd_msg(pci_dev, &msg);
|
|
process_set_irqfd_msg(pci_dev, &msg);
|
|
break;
|
|
break;
|
|
|
|
+ case MPQEMU_CMD_DEVICE_RESET:
|
|
|
|
+ process_device_reset_msg(com->ioc, pci_dev, &local_err);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
error_setg(&local_err,
|
|
error_setg(&local_err,
|
|
"Unknown command (%d) received for device %s"
|
|
"Unknown command (%d) received for device %s"
|
|
@@ -206,3 +212,19 @@ fail:
|
|
getpid());
|
|
getpid());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static void process_device_reset_msg(QIOChannel *ioc, PCIDevice *dev,
|
|
|
|
+ Error **errp)
|
|
|
|
+{
|
|
|
|
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
|
|
|
+ DeviceState *s = DEVICE(dev);
|
|
|
|
+ MPQemuMsg ret = { 0 };
|
|
|
|
+
|
|
|
|
+ if (dc->reset) {
|
|
|
|
+ dc->reset(s);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret.cmd = MPQEMU_CMD_RET;
|
|
|
|
+
|
|
|
|
+ mpqemu_msg_send(&ret, ioc, errp);
|
|
|
|
+}
|