From: Elena Ufimtseva <elena.ufimts...@oracle.com> Perform device reset in the remote process when QEMU performs device reset. This is required to reset the internal state (like registers, etc...) of emulated devices
Signed-off-by: Elena Ufimtseva <elena.ufimts...@oracle.com> Signed-off-by: John G Johnson <john.g.john...@oracle.com> Signed-off-by: Jagannathan Raman <jag.ra...@oracle.com> --- hw/i386/remote-msg.c | 16 ++++++++++++++++ hw/pci/proxy.c | 20 ++++++++++++++++++++ include/io/mpqemu-link.h | 1 + 3 files changed, 37 insertions(+) diff --git a/hw/i386/remote-msg.c b/hw/i386/remote-msg.c index 919bddc1d5..63d2be4701 100644 --- a/hw/i386/remote-msg.c +++ b/hw/i386/remote-msg.c @@ -11,6 +11,7 @@ #include "exec/memattrs.h" #include "hw/i386/remote-memory.h" #include "hw/remote/iohub.h" +#include "sysemu/reset.h" static void process_connect_dev_msg(MPQemuMsg *msg, QIOChannel *com, Error **errp); @@ -23,6 +24,7 @@ static void process_bar_read(QIOChannel *ioc, MPQemuMsg *msg, Error **errp); static void process_get_pci_info_msg(QIOChannel *ioc, MPQemuMsg *msg, PCIDevice *pci_dev); static void process_proxy_ping_msg(QIOChannel *ioc); +static void process_device_reset_msg(QIOChannel *ioc); gboolean mpqemu_process_msg(QIOChannel *ioc, GIOCondition cond, gpointer opaque) @@ -80,6 +82,9 @@ gboolean mpqemu_process_msg(QIOChannel *ioc, GIOCondition cond, case PROXY_PING: process_proxy_ping_msg(ioc); break; + case DEVICE_RESET: + process_device_reset_msg(ioc); + break; default: error_setg(&local_err, "Unknown command (%d) received from proxy \ in remote process pid=%d", msg.cmd, getpid()); @@ -283,3 +288,14 @@ static void process_proxy_ping_msg(QIOChannel *ioc) mpqemu_msg_send(&ret, ioc); } + +static void process_device_reset_msg(QIOChannel *ioc) +{ + MPQemuMsg ret = { 0 }; + + qemu_devices_reset(); + + ret.cmd = RET_MSG; + + mpqemu_msg_send(&ret, ioc); +} diff --git a/hw/pci/proxy.c b/hw/pci/proxy.c index e2e9a13287..9cba2bec65 100644 --- a/hw/pci/proxy.c +++ b/hw/pci/proxy.c @@ -26,6 +26,7 @@ static void probe_pci_info(PCIDevice *dev); static void start_hb_timer(PCIProxyDev *dev); static void pci_proxy_dev_exit(PCIDevice *pdev); +static void proxy_device_reset(DeviceState *dev); static void proxy_set_socket(PCIProxyDev *pdev, int fd, Error **errp) { @@ -198,6 +199,8 @@ static void pci_proxy_dev_class_init(ObjectClass *klass, void *data) k->config_write = pci_proxy_write_config; k->exit = pci_proxy_dev_exit; + dc->reset = proxy_device_reset; + device_class_set_props(dc, proxy_properties); } @@ -414,3 +417,20 @@ static void pci_proxy_dev_exit(PCIDevice *pdev) stop_hb_timer(dev); } + +static void proxy_device_reset(DeviceState *dev) +{ + PCIProxyDev *pdev = PCI_PROXY_DEV(dev); + MPQemuMsg msg = { 0 }; + Error *local_err = NULL; + + msg.bytestream = 0; + msg.size = sizeof(msg.data1); + msg.cmd = DEVICE_RESET; + + (void)mpqemu_msg_send_reply_co(&msg, pdev->com, &local_err); + if (local_err) { + error_report("Failed to send DEVICE_RESET to the remote process"); + } + +} diff --git a/include/io/mpqemu-link.h b/include/io/mpqemu-link.h index 676d7eb3ef..29dce60035 100644 --- a/include/io/mpqemu-link.h +++ b/include/io/mpqemu-link.h @@ -45,6 +45,7 @@ typedef enum { SET_IRQFD, GET_PCI_INFO, PROXY_PING, + DEVICE_RESET, MAX = INT_MAX, } MPQemuCmd; -- 2.25.GIT