stub monitor implementation.
This removes monitor.c and replaces it with a smaller monitor-android.c
which implements only the minimum stubs required for the Android emulator
(really snapshot support).
NOTE: After this change, the 'monitor' command in the Android console
will always return with a KO.
Change-Id: I8b631b017d7418cbc3fd3ba36e55147ce2630459
diff --git a/monitor-android.c b/monitor-android.c
new file mode 100644
index 0000000..5c2eb10
--- /dev/null
+++ b/monitor-android.c
@@ -0,0 +1,168 @@
+#include "monitor/monitor.h"
+
+#include <stdarg.h>
+#include "hw/hw.h"
+
+struct Monitor {
+ CharDriverState *chr;
+ int mux_out;
+ // int reset_seen;
+ int flags;
+ // int suspend_cnt;
+ uint8_t outbuf[1024];
+ int outbuf_index;
+ // ReadLineState *rs;
+ // CPUOldState *mon_cpu;
+ // BlockDriverCompletionFunc *password_completion_cb;
+ // void *password_opaque;
+ QLIST_ENTRY(Monitor) entry;
+ //int has_quit;
+#ifdef CONFIG_ANDROID
+ void* fake_opaque;
+ MonitorFakeFunc fake_func;
+ int64_t fake_count;
+
+#endif
+};
+
+// Minimalistic / fake implementation of the QEMU Monitor.
+
+Monitor* cur_mon;
+
+/* Return non-zero iff we have a current monitor, and it is in QMP mode. */
+int monitor_cur_is_qmp(void)
+{
+ return 0;
+}
+
+Monitor*
+monitor_fake_new(void* opaque, MonitorFakeFunc cb)
+{
+ Monitor* mon;
+
+ assert(cb != NULL);
+ mon = g_malloc0(sizeof(*mon));
+ mon->fake_opaque = opaque;
+ mon->fake_func = cb;
+ mon->fake_count = 0;
+
+ return mon;
+}
+
+int
+monitor_fake_get_bytes(Monitor* mon)
+{
+ assert(mon->fake_func != NULL);
+ return mon->fake_count;
+}
+
+void
+monitor_fake_free(Monitor* mon)
+{
+ assert(mon->fake_func != NULL);
+ free(mon);
+}
+
+/* This replaces the definition in monitor.c which is in a
+ * #ifndef CONFIG_ANDROID .. #endif block.
+ */
+void monitor_flush(Monitor *mon)
+{
+ if (!mon)
+ return;
+
+ if (mon->fake_func != NULL) {
+ mon->fake_func(mon->fake_opaque, (void*)mon->outbuf, mon->outbuf_index);
+ mon->outbuf_index = 0;
+ mon->fake_count += mon->outbuf_index;
+ } else if (!mon->mux_out) {
+ qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
+ mon->outbuf_index = 0;
+ }
+}
+
+/* flush at every end of line or if the buffer is full */
+static void monitor_puts(Monitor *mon, const char *str)
+{
+ char c;
+
+ if (!mon)
+ return;
+
+ for(;;) {
+ c = *str++;
+ if (c == '\0')
+ break;
+ if (c == '\n')
+ mon->outbuf[mon->outbuf_index++] = '\r';
+ mon->outbuf[mon->outbuf_index++] = c;
+ if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
+ || c == '\n')
+ monitor_flush(mon);
+ }
+}
+
+void monitor_vprintf(Monitor* mon, const char* fmt, va_list args) {
+ char buf[4096];
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ monitor_puts(mon, buf);
+}
+
+void monitor_printf(Monitor *mon, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ monitor_vprintf(mon, fmt, ap);
+ va_end(ap);
+}
+
+void monitor_print_filename(Monitor *mon, const char *filename)
+{
+ int i;
+
+ for (i = 0; filename[i]; i++) {
+ switch (filename[i]) {
+ case ' ':
+ case '"':
+ case '\\':
+ monitor_printf(mon, "\\%c", filename[i]);
+ break;
+ case '\t':
+ monitor_printf(mon, "\\t");
+ break;
+ case '\r':
+ monitor_printf(mon, "\\r");
+ break;
+ case '\n':
+ monitor_printf(mon, "\\n");
+ break;
+ default:
+ monitor_printf(mon, "%c", filename[i]);
+ break;
+ }
+ }
+}
+
+void monitor_protocol_event(MonitorEvent event, QObject *data)
+{
+ /* XXX: TODO */
+}
+
+void monitor_set_error(Monitor *mon, QError *qerror)
+{
+ QDECREF(qerror);
+}
+
+void monitor_init(CharDriverState* cs, int flags) {
+ // Nothing.
+}
+
+/* boot_set handler */
+static QEMUBootSetHandler *qemu_boot_set_handler = NULL;
+static void *boot_opaque;
+
+void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
+{
+ qemu_boot_set_handler = func;
+ boot_opaque = opaque;
+}