On 3/4/2020 5:29 AM, Dr. David Alan Gilbert wrote:
* Jagannathan Raman (jag.ra...@oracle.com) wrote:
Adds the handler to process message from QEMU,
Initialize remote process main loop, handles SYNC_SYSMEM
message by updating its "system_memory" container using
shared file descriptors received from QEMU.
Signed-off-by: John G Johnson <john.g.john...@oracle.com>
Signed-off-by: Elena Ufimtseva <elena.ufimts...@oracle.com>
Signed-off-by: Jagannathan Raman <jag.ra...@oracle.com>
---
v4 -> v5:
- We checked if we could use functions already defined in
util/main-loop.c instead of using g_main_loop_run. However,
we couldn't find a suitable function that's generic enough
to do this. All of them have emulator code embedded in them
which is not used by the remote process. We are therefore
not making any change to this patch
remote/remote-main.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/remote/remote-main.c b/remote/remote-main.c
index ecf30e0..56315cd 100644
--- a/remote/remote-main.c
+++ b/remote/remote-main.c
@@ -12,6 +12,7 @@
#include "qemu-common.h"
#include <stdio.h>
+#include <unistd.h>
#include "qemu/module.h"
#include "remote/pcihost.h"
@@ -19,12 +20,96 @@
#include "hw/boards.h"
#include "hw/qdev-core.h"
#include "qemu/main-loop.h"
+#include "remote/memory.h"
+#include "io/mpqemu-link.h"
+#include "qapi/error.h"
+#include "qemu/main-loop.h"
+#include "sysemu/cpus.h"
+#include "qemu-common.h"
+#include "hw/pci/pci.h"
+#include "qemu/thread.h"
+#include "qemu/main-loop.h"
+#include "qemu/config-file.h"
+#include "sysemu/sysemu.h"
+#include "block/block.h"
+#include "exec/ramlist.h"
+
+static MPQemuLinkState *mpqemu_link;
+PCIDevice *remote_pci_dev;
+
+static void process_msg(GIOCondition cond, MPQemuChannel *chan)
+{
+ MPQemuMsg *msg = NULL;
+ Error *err = NULL;
+
+ if ((cond & G_IO_HUP) || (cond & G_IO_ERR)) {
+ goto finalize_loop;
+ }
+
+ msg = g_malloc0(sizeof(MPQemuMsg));
+
+ if (mpqemu_msg_recv(msg, chan) < 0) {
+ error_setg(&err, "Failed to receive message");
Please give error messages more context, e.g. the device or process name
or something like that so that; it helps when we get a user
reporting a crash and they report 'Unknown command' in their log, but
then we have to figure out where to point them.
Ah OK, we'll add the exec name & PID of the QEMU process that spawned
this remote process in the error messages.
Thank you!
--
Jag
+ goto finalize_loop;
+ }
+
+ switch (msg->cmd) {
+ case INIT:
+ break;
+ case PCI_CONFIG_WRITE:
+ break;
+ case PCI_CONFIG_READ:
+ break;
+ default:
+ error_setg(&err, "Unknown command");
+ goto finalize_loop;
+ }
+
+ g_free(msg->data2);
+ g_free(msg);
+
+ return;
+
+finalize_loop:
+ if (err) {
+ error_report_err(err);
+ }
+ g_free(msg);
+ mpqemu_link_finalize(mpqemu_link);
+ mpqemu_link = NULL;
+}
int main(int argc, char *argv[])
{
+ Error *err = NULL;
+
module_call_init(MODULE_INIT_QOM);
+ bdrv_init_with_whitelist();
+
+ if (qemu_init_main_loop(&err)) {
+ error_report_err(err);
+ return -EBUSY;
+ }
+
+ qemu_init_cpu_loop();
+
+ page_size_init();
+
+ qemu_mutex_init(&ram_list.mutex);
+
So these are some subset of the things from qemu_init; I guess
we'll have to be careful when we add stuff to vl.c to think what should
also be added here.
Dave
current_machine =
MACHINE(REMOTE_MACHINE(object_new(TYPE_REMOTE_MACHINE)));
+ mpqemu_link = mpqemu_link_create();
+ if (!mpqemu_link) {
+ printf("Could not create MPQemu link\n");
+ return -1;
+ }
+
+ mpqemu_init_channel(mpqemu_link, &mpqemu_link->com, STDIN_FILENO);
+ mpqemu_link_set_callback(mpqemu_link, process_msg);
+
+ mpqemu_start_coms(mpqemu_link);
+
return 0;
}
--
1.8.3.1
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK