1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "qemu/osdep.h"
26#include "qemu/units.h"
27#include <dirent.h>
28#include "cpu.h"
29#include "hw/hw.h"
30#include "monitor/qdev.h"
31#include "hw/usb.h"
32#include "hw/pci/pci.h"
33#include "sysemu/watchdog.h"
34#include "hw/loader.h"
35#include "exec/gdbstub.h"
36#include "net/net.h"
37#include "net/slirp.h"
38#include "chardev/char-fe.h"
39#include "chardev/char-io.h"
40#include "chardev/char-mux.h"
41#include "ui/qemu-spice.h"
42#include "sysemu/numa.h"
43#include "monitor/monitor.h"
44#include "qemu/config-file.h"
45#include "qemu/readline.h"
46#include "ui/console.h"
47#include "ui/input.h"
48#include "sysemu/block-backend.h"
49#include "audio/audio.h"
50#include "disas/disas.h"
51#include "sysemu/balloon.h"
52#include "qemu/timer.h"
53#include "sysemu/hw_accel.h"
54#include "qemu/acl.h"
55#include "sysemu/tpm.h"
56#include "qapi/qmp/qdict.h"
57#include "qapi/qmp/qerror.h"
58#include "qapi/qmp/qnum.h"
59#include "qapi/qmp/qstring.h"
60#include "qapi/qmp/qjson.h"
61#include "qapi/qmp/json-streamer.h"
62#include "qapi/qmp/json-parser.h"
63#include "qapi/qmp/qlist.h"
64#include "qom/object_interfaces.h"
65#include "trace-root.h"
66#include "trace/control.h"
67#include "monitor/hmp-target.h"
68#ifdef CONFIG_TRACE_SIMPLE
69#include "trace/simple.h"
70#endif
71#include "exec/memory.h"
72#include "exec/exec-all.h"
73#include "qemu/log.h"
74#include "qemu/option.h"
75#include "hmp.h"
76#include "qemu/thread.h"
77#include "block/qapi.h"
78#include "qapi/qapi-commands.h"
79#include "qapi/qapi-events.h"
80#include "qapi/error.h"
81#include "qapi/qmp-event.h"
82#include "qapi/qapi-introspect.h"
83#include "sysemu/qtest.h"
84#include "sysemu/cpus.h"
85#include "sysemu/iothread.h"
86#include "qemu/cutils.h"
87
88#if defined(TARGET_S390X)
89#include "hw/s390x/storage-keys.h"
90#include "hw/s390x/storage-attributes.h"
91#endif
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127typedef struct mon_cmd_t {
128 const char *name;
129 const char *args_type;
130 const char *params;
131 const char *help;
132 const char *flags;
133 void (*cmd)(Monitor *mon, const QDict *qdict);
134
135
136
137
138 struct mon_cmd_t *sub_table;
139 void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
140} mon_cmd_t;
141
142
143typedef struct mon_fd_t mon_fd_t;
144struct mon_fd_t {
145 char *name;
146 int fd;
147 QLIST_ENTRY(mon_fd_t) next;
148};
149
150
151typedef struct MonFdsetFd MonFdsetFd;
152struct MonFdsetFd {
153 int fd;
154 bool removed;
155 char *opaque;
156 QLIST_ENTRY(MonFdsetFd) next;
157};
158
159
160typedef struct MonFdset MonFdset;
161struct MonFdset {
162 int64_t id;
163 QLIST_HEAD(, MonFdsetFd) fds;
164 QLIST_HEAD(, MonFdsetFd) dup_fds;
165 QLIST_ENTRY(MonFdset) next;
166};
167
168typedef struct {
169 JSONMessageParser parser;
170
171
172
173
174
175
176 QmpCommandList *commands;
177 bool capab_offered[QMP_CAPABILITY__MAX];
178 bool capab[QMP_CAPABILITY__MAX];
179
180
181
182
183 QemuMutex qmp_queue_lock;
184
185 GQueue *qmp_requests;
186
187 GQueue *qmp_responses;
188} MonitorQMP;
189
190
191
192
193
194
195typedef struct MonitorQAPIEventState {
196 QAPIEvent event;
197 QDict *data;
198 QEMUTimer *timer;
199 QDict *qdict;
200} MonitorQAPIEventState;
201
202typedef struct {
203 int64_t rate;
204} MonitorQAPIEventConf;
205
206struct Monitor {
207 CharBackend chr;
208 int reset_seen;
209 int flags;
210 int suspend_cnt;
211 bool skip_flush;
212 bool use_io_thread;
213
214
215
216
217
218
219
220 ReadLineState *rs;
221
222 MonitorQMP qmp;
223 gchar *mon_cpu_path;
224 BlockCompletionFunc *password_completion_cb;
225 void *password_opaque;
226 mon_cmd_t *cmd_table;
227 QTAILQ_ENTRY(Monitor) entry;
228
229
230
231
232
233 QemuMutex mon_lock;
234
235
236
237
238 QLIST_HEAD(, mon_fd_t) fds;
239 QString *outbuf;
240 guint out_watch;
241
242 int mux_out;
243};
244
245
246IOThread *mon_iothread;
247
248
249QEMUBH *qmp_dispatcher_bh;
250
251
252QEMUBH *qmp_respond_bh;
253
254struct QMPRequest {
255
256 Monitor *mon;
257
258 QObject *id;
259
260
261
262
263 QObject *req;
264 Error *err;
265
266
267
268
269
270 bool need_resume;
271};
272typedef struct QMPRequest QMPRequest;
273
274
275#define QMP_ACCEPT_UNKNOWNS 1
276
277
278static QemuMutex monitor_lock;
279static GHashTable *monitor_qapi_event_state;
280static QTAILQ_HEAD(mon_list, Monitor) mon_list;
281
282
283static QemuMutex mon_fdsets_lock;
284static QLIST_HEAD(mon_fdsets, MonFdset) mon_fdsets;
285
286static int mon_refcount;
287
288static mon_cmd_t mon_cmds[];
289static mon_cmd_t info_cmds[];
290
291QmpCommandList qmp_commands, qmp_cap_negotiation_commands;
292
293__thread Monitor *cur_mon;
294
295static void monitor_command_cb(void *opaque, const char *cmdline,
296 void *readline_opaque);
297
298
299
300
301static inline bool monitor_is_qmp(const Monitor *mon)
302{
303 return (mon->flags & MONITOR_USE_CONTROL);
304}
305
306
307
308
309
310
311static inline bool monitor_uses_readline(const Monitor *mon)
312{
313 return mon->flags & MONITOR_USE_READLINE;
314}
315
316static inline bool monitor_is_hmp_non_interactive(const Monitor *mon)
317{
318 return !monitor_is_qmp(mon) && !monitor_uses_readline(mon);
319}
320
321
322
323
324
325
326
327static inline QEMUClockType monitor_get_event_clock(void)
328{
329 return qtest_enabled() ? QEMU_CLOCK_VIRTUAL : QEMU_CLOCK_REALTIME;
330}
331
332
333
334
335bool monitor_cur_is_qmp(void)
336{
337 return cur_mon && monitor_is_qmp(cur_mon);
338}
339
340void monitor_read_command(Monitor *mon, int show_prompt)
341{
342 if (!mon->rs)
343 return;
344
345 readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
346 if (show_prompt)
347 readline_show_prompt(mon->rs);
348}
349
350int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
351 void *opaque)
352{
353 if (mon->rs) {
354 readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
355
356 return 0;
357 } else {
358 monitor_printf(mon, "terminal does not support password prompting\n");
359 return -ENOTTY;
360 }
361}
362
363static void qmp_request_free(QMPRequest *req)
364{
365 qobject_unref(req->id);
366 qobject_unref(req->req);
367 error_free(req->err);
368 g_free(req);
369}
370
371
372static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon)
373{
374 while (!g_queue_is_empty(mon->qmp.qmp_requests)) {
375 qmp_request_free(g_queue_pop_head(mon->qmp.qmp_requests));
376 }
377}
378
379
380static void monitor_qmp_cleanup_resp_queue_locked(Monitor *mon)
381{
382 while (!g_queue_is_empty(mon->qmp.qmp_responses)) {
383 qobject_unref((QDict *)g_queue_pop_head(mon->qmp.qmp_responses));
384 }
385}
386
387static void monitor_qmp_cleanup_queues(Monitor *mon)
388{
389 qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
390 monitor_qmp_cleanup_req_queue_locked(mon);
391 monitor_qmp_cleanup_resp_queue_locked(mon);
392 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
393}
394
395
396static void monitor_flush_locked(Monitor *mon);
397
398static gboolean monitor_unblocked(GIOChannel *chan, GIOCondition cond,
399 void *opaque)
400{
401 Monitor *mon = opaque;
402
403 qemu_mutex_lock(&mon->mon_lock);
404 mon->out_watch = 0;
405 monitor_flush_locked(mon);
406 qemu_mutex_unlock(&mon->mon_lock);
407 return FALSE;
408}
409
410
411static void monitor_flush_locked(Monitor *mon)
412{
413 int rc;
414 size_t len;
415 const char *buf;
416
417 if (mon->skip_flush) {
418 return;
419 }
420
421 buf = qstring_get_str(mon->outbuf);
422 len = qstring_get_length(mon->outbuf);
423
424 if (len && !mon->mux_out) {
425 rc = qemu_chr_fe_write(&mon->chr, (const uint8_t *) buf, len);
426 if ((rc < 0 && errno != EAGAIN) || (rc == len)) {
427
428 qobject_unref(mon->outbuf);
429 mon->outbuf = qstring_new();
430 return;
431 }
432 if (rc > 0) {
433
434 QString *tmp = qstring_from_str(buf + rc);
435 qobject_unref(mon->outbuf);
436 mon->outbuf = tmp;
437 }
438 if (mon->out_watch == 0) {
439 mon->out_watch =
440 qemu_chr_fe_add_watch(&mon->chr, G_IO_OUT | G_IO_HUP,
441 monitor_unblocked, mon);
442 }
443 }
444}
445
446void monitor_flush(Monitor *mon)
447{
448 qemu_mutex_lock(&mon->mon_lock);
449 monitor_flush_locked(mon);
450 qemu_mutex_unlock(&mon->mon_lock);
451}
452
453
454static void monitor_puts(Monitor *mon, const char *str)
455{
456 char c;
457
458 qemu_mutex_lock(&mon->mon_lock);
459 for(;;) {
460 c = *str++;
461 if (c == '\0')
462 break;
463 if (c == '\n') {
464 qstring_append_chr(mon->outbuf, '\r');
465 }
466 qstring_append_chr(mon->outbuf, c);
467 if (c == '\n') {
468 monitor_flush_locked(mon);
469 }
470 }
471 qemu_mutex_unlock(&mon->mon_lock);
472}
473
474void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
475{
476 char *buf;
477
478 if (!mon)
479 return;
480
481 if (monitor_is_qmp(mon)) {
482 return;
483 }
484
485 buf = g_strdup_vprintf(fmt, ap);
486 monitor_puts(mon, buf);
487 g_free(buf);
488}
489
490void monitor_printf(Monitor *mon, const char *fmt, ...)
491{
492 va_list ap;
493 va_start(ap, fmt);
494 monitor_vprintf(mon, fmt, ap);
495 va_end(ap);
496}
497
498int monitor_fprintf(FILE *stream, const char *fmt, ...)
499{
500 va_list ap;
501 va_start(ap, fmt);
502 monitor_vprintf((Monitor *)stream, fmt, ap);
503 va_end(ap);
504 return 0;
505}
506
507static void qmp_send_response(Monitor *mon, QDict *rsp)
508{
509 QObject *data = QOBJECT(rsp);
510 QString *json;
511
512 json = mon->flags & MONITOR_USE_PRETTY ? qobject_to_json_pretty(data) :
513 qobject_to_json(data);
514 assert(json != NULL);
515
516 qstring_append_chr(json, '\n');
517 monitor_puts(mon, qstring_get_str(json));
518
519 qobject_unref(json);
520}
521
522static void qmp_queue_response(Monitor *mon, QDict *rsp)
523{
524 if (mon->use_io_thread) {
525
526
527
528
529 qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
530 g_queue_push_tail(mon->qmp.qmp_responses, qobject_ref(rsp));
531 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
532 qemu_bh_schedule(qmp_respond_bh);
533 } else {
534
535
536
537
538 qmp_send_response(mon, rsp);
539 }
540}
541
542struct QMPResponse {
543 Monitor *mon;
544 QDict *data;
545};
546typedef struct QMPResponse QMPResponse;
547
548static QDict *monitor_qmp_response_pop_one(Monitor *mon)
549{
550 QDict *data;
551
552 qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
553 data = g_queue_pop_head(mon->qmp.qmp_responses);
554 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
555
556 return data;
557}
558
559static void monitor_qmp_response_flush(Monitor *mon)
560{
561 QDict *data;
562
563 while ((data = monitor_qmp_response_pop_one(mon))) {
564 qmp_send_response(mon, data);
565 qobject_unref(data);
566 }
567}
568
569
570
571
572
573static bool monitor_qmp_response_pop_any(QMPResponse *response)
574{
575 Monitor *mon;
576 QDict *data = NULL;
577
578 qemu_mutex_lock(&monitor_lock);
579 QTAILQ_FOREACH(mon, &mon_list, entry) {
580 data = monitor_qmp_response_pop_one(mon);
581 if (data) {
582 response->mon = mon;
583 response->data = data;
584 break;
585 }
586 }
587 qemu_mutex_unlock(&monitor_lock);
588 return data != NULL;
589}
590
591static void monitor_qmp_bh_responder(void *opaque)
592{
593 QMPResponse response;
594
595 while (monitor_qmp_response_pop_any(&response)) {
596 qmp_send_response(response.mon, response.data);
597 qobject_unref(response.data);
598 }
599}
600
601static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT__MAX] = {
602
603 [QAPI_EVENT_RTC_CHANGE] = { 1000 * SCALE_MS },
604 [QAPI_EVENT_WATCHDOG] = { 1000 * SCALE_MS },
605 [QAPI_EVENT_BALLOON_CHANGE] = { 1000 * SCALE_MS },
606 [QAPI_EVENT_QUORUM_REPORT_BAD] = { 1000 * SCALE_MS },
607 [QAPI_EVENT_QUORUM_FAILURE] = { 1000 * SCALE_MS },
608 [QAPI_EVENT_VSERPORT_CHANGE] = { 1000 * SCALE_MS },
609};
610
611
612
613
614
615
616static void monitor_qapi_event_emit(QAPIEvent event, QDict *qdict)
617{
618 Monitor *mon;
619
620 trace_monitor_protocol_event_emit(event, qdict);
621 QTAILQ_FOREACH(mon, &mon_list, entry) {
622 if (monitor_is_qmp(mon)
623 && mon->qmp.commands != &qmp_cap_negotiation_commands) {
624 qmp_queue_response(mon, qdict);
625 }
626 }
627}
628
629static void monitor_qapi_event_handler(void *opaque);
630
631
632
633
634
635static void
636monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict *qdict)
637{
638 MonitorQAPIEventConf *evconf;
639 MonitorQAPIEventState *evstate;
640
641 assert(event < QAPI_EVENT__MAX);
642 evconf = &monitor_qapi_event_conf[event];
643 trace_monitor_protocol_event_queue(event, qdict, evconf->rate);
644
645 qemu_mutex_lock(&monitor_lock);
646
647 if (!evconf->rate) {
648
649 monitor_qapi_event_emit(event, qdict);
650 } else {
651 QDict *data = qobject_to(QDict, qdict_get(qdict, "data"));
652 MonitorQAPIEventState key = { .event = event, .data = data };
653
654 evstate = g_hash_table_lookup(monitor_qapi_event_state, &key);
655 assert(!evstate || timer_pending(evstate->timer));
656
657 if (evstate) {
658
659
660
661
662
663 qobject_unref(evstate->qdict);
664 evstate->qdict = qobject_ref(qdict);
665 } else {
666
667
668
669
670
671
672 int64_t now = qemu_clock_get_ns(monitor_get_event_clock());
673
674 monitor_qapi_event_emit(event, qdict);
675
676 evstate = g_new(MonitorQAPIEventState, 1);
677 evstate->event = event;
678 evstate->data = qobject_ref(data);
679 evstate->qdict = NULL;
680 evstate->timer = timer_new_ns(monitor_get_event_clock(),
681 monitor_qapi_event_handler,
682 evstate);
683 g_hash_table_add(monitor_qapi_event_state, evstate);
684 timer_mod_ns(evstate->timer, now + evconf->rate);
685 }
686 }
687
688 qemu_mutex_unlock(&monitor_lock);
689}
690
691static void
692monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
693{
694
695
696
697
698
699
700 typedef struct MonitorQapiEvent {
701 QAPIEvent event;
702 QDict *qdict;
703 QSIMPLEQ_ENTRY(MonitorQapiEvent) entry;
704 } MonitorQapiEvent;
705 static __thread QSIMPLEQ_HEAD(, MonitorQapiEvent) event_queue;
706 static __thread bool reentered;
707 MonitorQapiEvent *ev;
708
709 if (!reentered) {
710 QSIMPLEQ_INIT(&event_queue);
711 }
712
713 ev = g_new(MonitorQapiEvent, 1);
714 ev->qdict = qobject_ref(qdict);
715 ev->event = event;
716 QSIMPLEQ_INSERT_TAIL(&event_queue, ev, entry);
717 if (reentered) {
718 return;
719 }
720
721 reentered = true;
722
723 while ((ev = QSIMPLEQ_FIRST(&event_queue)) != NULL) {
724 QSIMPLEQ_REMOVE_HEAD(&event_queue, entry);
725 monitor_qapi_event_queue_no_reenter(ev->event, ev->qdict);
726 qobject_unref(ev->qdict);
727 g_free(ev);
728 }
729
730 reentered = false;
731}
732
733
734
735
736
737
738static void monitor_qapi_event_handler(void *opaque)
739{
740 MonitorQAPIEventState *evstate = opaque;
741 MonitorQAPIEventConf *evconf = &monitor_qapi_event_conf[evstate->event];
742
743 trace_monitor_protocol_event_handler(evstate->event, evstate->qdict);
744 qemu_mutex_lock(&monitor_lock);
745
746 if (evstate->qdict) {
747 int64_t now = qemu_clock_get_ns(monitor_get_event_clock());
748
749 monitor_qapi_event_emit(evstate->event, evstate->qdict);
750 qobject_unref(evstate->qdict);
751 evstate->qdict = NULL;
752 timer_mod_ns(evstate->timer, now + evconf->rate);
753 } else {
754 g_hash_table_remove(monitor_qapi_event_state, evstate);
755 qobject_unref(evstate->data);
756 timer_free(evstate->timer);
757 g_free(evstate);
758 }
759
760 qemu_mutex_unlock(&monitor_lock);
761}
762
763static unsigned int qapi_event_throttle_hash(const void *key)
764{
765 const MonitorQAPIEventState *evstate = key;
766 unsigned int hash = evstate->event * 255;
767
768 if (evstate->event == QAPI_EVENT_VSERPORT_CHANGE) {
769 hash += g_str_hash(qdict_get_str(evstate->data, "id"));
770 }
771
772 if (evstate->event == QAPI_EVENT_QUORUM_REPORT_BAD) {
773 hash += g_str_hash(qdict_get_str(evstate->data, "node-name"));
774 }
775
776 return hash;
777}
778
779static gboolean qapi_event_throttle_equal(const void *a, const void *b)
780{
781 const MonitorQAPIEventState *eva = a;
782 const MonitorQAPIEventState *evb = b;
783
784 if (eva->event != evb->event) {
785 return FALSE;
786 }
787
788 if (eva->event == QAPI_EVENT_VSERPORT_CHANGE) {
789 return !strcmp(qdict_get_str(eva->data, "id"),
790 qdict_get_str(evb->data, "id"));
791 }
792
793 if (eva->event == QAPI_EVENT_QUORUM_REPORT_BAD) {
794 return !strcmp(qdict_get_str(eva->data, "node-name"),
795 qdict_get_str(evb->data, "node-name"));
796 }
797
798 return TRUE;
799}
800
801static void monitor_qapi_event_init(void)
802{
803 monitor_qapi_event_state = g_hash_table_new(qapi_event_throttle_hash,
804 qapi_event_throttle_equal);
805 qmp_event_set_func_emit(monitor_qapi_event_queue);
806}
807
808static void handle_hmp_command(Monitor *mon, const char *cmdline);
809
810static void monitor_data_init(Monitor *mon, bool skip_flush,
811 bool use_io_thread)
812{
813 memset(mon, 0, sizeof(Monitor));
814 qemu_mutex_init(&mon->mon_lock);
815 qemu_mutex_init(&mon->qmp.qmp_queue_lock);
816 mon->outbuf = qstring_new();
817
818 mon->cmd_table = mon_cmds;
819 mon->skip_flush = skip_flush;
820 mon->use_io_thread = use_io_thread;
821 mon->qmp.qmp_requests = g_queue_new();
822 mon->qmp.qmp_responses = g_queue_new();
823}
824
825static void monitor_data_destroy(Monitor *mon)
826{
827 g_free(mon->mon_cpu_path);
828 qemu_chr_fe_deinit(&mon->chr, false);
829 if (monitor_is_qmp(mon)) {
830 json_message_parser_destroy(&mon->qmp.parser);
831 }
832 readline_free(mon->rs);
833 qobject_unref(mon->outbuf);
834 qemu_mutex_destroy(&mon->mon_lock);
835 qemu_mutex_destroy(&mon->qmp.qmp_queue_lock);
836 monitor_qmp_cleanup_req_queue_locked(mon);
837 monitor_qmp_cleanup_resp_queue_locked(mon);
838 g_queue_free(mon->qmp.qmp_requests);
839 g_queue_free(mon->qmp.qmp_responses);
840}
841
842char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
843 int64_t cpu_index, Error **errp)
844{
845 char *output = NULL;
846 Monitor *old_mon, hmp;
847
848 monitor_data_init(&hmp, true, false);
849
850 old_mon = cur_mon;
851 cur_mon = &hmp;
852
853 if (has_cpu_index) {
854 int ret = monitor_set_cpu(cpu_index);
855 if (ret < 0) {
856 cur_mon = old_mon;
857 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
858 "a CPU number");
859 goto out;
860 }
861 }
862
863 handle_hmp_command(&hmp, command_line);
864 cur_mon = old_mon;
865
866 qemu_mutex_lock(&hmp.mon_lock);
867 if (qstring_get_length(hmp.outbuf) > 0) {
868 output = g_strdup(qstring_get_str(hmp.outbuf));
869 } else {
870 output = g_strdup("");
871 }
872 qemu_mutex_unlock(&hmp.mon_lock);
873
874out:
875 monitor_data_destroy(&hmp);
876 return output;
877}
878
879static int compare_cmd(const char *name, const char *list)
880{
881 const char *p, *pstart;
882 int len;
883 len = strlen(name);
884 p = list;
885 for(;;) {
886 pstart = p;
887 p = qemu_strchrnul(p, '|');
888 if ((p - pstart) == len && !memcmp(pstart, name, len))
889 return 1;
890 if (*p == '\0')
891 break;
892 p++;
893 }
894 return 0;
895}
896
897static int get_str(char *buf, int buf_size, const char **pp)
898{
899 const char *p;
900 char *q;
901 int c;
902
903 q = buf;
904 p = *pp;
905 while (qemu_isspace(*p)) {
906 p++;
907 }
908 if (*p == '\0') {
909 fail:
910 *q = '\0';
911 *pp = p;
912 return -1;
913 }
914 if (*p == '\"') {
915 p++;
916 while (*p != '\0' && *p != '\"') {
917 if (*p == '\\') {
918 p++;
919 c = *p++;
920 switch (c) {
921 case 'n':
922 c = '\n';
923 break;
924 case 'r':
925 c = '\r';
926 break;
927 case '\\':
928 case '\'':
929 case '\"':
930 break;
931 default:
932 printf("unsupported escape code: '\\%c'\n", c);
933 goto fail;
934 }
935 if ((q - buf) < buf_size - 1) {
936 *q++ = c;
937 }
938 } else {
939 if ((q - buf) < buf_size - 1) {
940 *q++ = *p;
941 }
942 p++;
943 }
944 }
945 if (*p != '\"') {
946 printf("unterminated string\n");
947 goto fail;
948 }
949 p++;
950 } else {
951 while (*p != '\0' && !qemu_isspace(*p)) {
952 if ((q - buf) < buf_size - 1) {
953 *q++ = *p;
954 }
955 p++;
956 }
957 }
958 *q = '\0';
959 *pp = p;
960 return 0;
961}
962
963#define MAX_ARGS 16
964
965static void free_cmdline_args(char **args, int nb_args)
966{
967 int i;
968
969 assert(nb_args <= MAX_ARGS);
970
971 for (i = 0; i < nb_args; i++) {
972 g_free(args[i]);
973 }
974
975}
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990static int parse_cmdline(const char *cmdline,
991 int *pnb_args, char **args)
992{
993 const char *p;
994 int nb_args, ret;
995 char buf[1024];
996
997 p = cmdline;
998 nb_args = 0;
999 for (;;) {
1000 while (qemu_isspace(*p)) {
1001 p++;
1002 }
1003 if (*p == '\0') {
1004 break;
1005 }
1006 if (nb_args >= MAX_ARGS) {
1007 goto fail;
1008 }
1009 ret = get_str(buf, sizeof(buf), &p);
1010 if (ret < 0) {
1011 goto fail;
1012 }
1013 args[nb_args] = g_strdup(buf);
1014 nb_args++;
1015 }
1016 *pnb_args = nb_args;
1017 return 0;
1018
1019 fail:
1020 free_cmdline_args(args, nb_args);
1021 return -1;
1022}
1023
1024
1025
1026
1027static bool cmd_can_preconfig(const mon_cmd_t *cmd)
1028{
1029 if (!cmd->flags) {
1030 return false;
1031 }
1032
1033 return strchr(cmd->flags, 'p');
1034}
1035
1036static void help_cmd_dump_one(Monitor *mon,
1037 const mon_cmd_t *cmd,
1038 char **prefix_args,
1039 int prefix_args_nb)
1040{
1041 int i;
1042
1043 if (runstate_check(RUN_STATE_PRECONFIG) && !cmd_can_preconfig(cmd)) {
1044 return;
1045 }
1046
1047 for (i = 0; i < prefix_args_nb; i++) {
1048 monitor_printf(mon, "%s ", prefix_args[i]);
1049 }
1050 monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
1051}
1052
1053
1054static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
1055 char **args, int nb_args, int arg_index)
1056{
1057 const mon_cmd_t *cmd;
1058
1059
1060 if (arg_index >= nb_args) {
1061 for (cmd = cmds; cmd->name != NULL; cmd++) {
1062 help_cmd_dump_one(mon, cmd, args, arg_index);
1063 }
1064 return;
1065 }
1066
1067
1068 for (cmd = cmds; cmd->name != NULL; cmd++) {
1069 if (compare_cmd(args[arg_index], cmd->name) &&
1070 ((!runstate_check(RUN_STATE_PRECONFIG) ||
1071 cmd_can_preconfig(cmd)))) {
1072 if (cmd->sub_table) {
1073
1074 help_cmd_dump(mon, cmd->sub_table,
1075 args, nb_args, arg_index + 1);
1076 } else {
1077 help_cmd_dump_one(mon, cmd, args, arg_index);
1078 }
1079 break;
1080 }
1081 }
1082}
1083
1084static void help_cmd(Monitor *mon, const char *name)
1085{
1086 char *args[MAX_ARGS];
1087 int nb_args = 0;
1088
1089
1090 if (name) {
1091
1092 if (!strcmp(name, "log")) {
1093 const QEMULogItem *item;
1094 monitor_printf(mon, "Log items (comma separated):\n");
1095 monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
1096 for (item = qemu_log_items; item->mask != 0; item++) {
1097 monitor_printf(mon, "%-10s %s\n", item->name, item->help);
1098 }
1099 return;
1100 }
1101
1102 if (parse_cmdline(name, &nb_args, args) < 0) {
1103 return;
1104 }
1105 }
1106
1107
1108 help_cmd_dump(mon, mon->cmd_table, args, nb_args, 0);
1109
1110 free_cmdline_args(args, nb_args);
1111}
1112
1113static void do_help_cmd(Monitor *mon, const QDict *qdict)
1114{
1115 help_cmd(mon, qdict_get_try_str(qdict, "name"));
1116}
1117
1118static void hmp_trace_event(Monitor *mon, const QDict *qdict)
1119{
1120 const char *tp_name = qdict_get_str(qdict, "name");
1121 bool new_state = qdict_get_bool(qdict, "option");
1122 bool has_vcpu = qdict_haskey(qdict, "vcpu");
1123 int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
1124 Error *local_err = NULL;
1125
1126 if (vcpu < 0) {
1127 monitor_printf(mon, "argument vcpu must be positive");
1128 return;
1129 }
1130
1131 qmp_trace_event_set_state(tp_name, new_state, true, true, has_vcpu, vcpu, &local_err);
1132 if (local_err) {
1133 error_report_err(local_err);
1134 }
1135}
1136
1137#ifdef CONFIG_TRACE_SIMPLE
1138static void hmp_trace_file(Monitor *mon, const QDict *qdict)
1139{
1140 const char *op = qdict_get_try_str(qdict, "op");
1141 const char *arg = qdict_get_try_str(qdict, "arg");
1142
1143 if (!op) {
1144 st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
1145 } else if (!strcmp(op, "on")) {
1146 st_set_trace_file_enabled(true);
1147 } else if (!strcmp(op, "off")) {
1148 st_set_trace_file_enabled(false);
1149 } else if (!strcmp(op, "flush")) {
1150 st_flush_trace_buffer();
1151 } else if (!strcmp(op, "set")) {
1152 if (arg) {
1153 st_set_trace_file(arg);
1154 }
1155 } else {
1156 monitor_printf(mon, "unexpected argument \"%s\"\n", op);
1157 help_cmd(mon, "trace-file");
1158 }
1159}
1160#endif
1161
1162static void hmp_info_help(Monitor *mon, const QDict *qdict)
1163{
1164 help_cmd(mon, "info");
1165}
1166
1167static void query_commands_cb(QmpCommand *cmd, void *opaque)
1168{
1169 CommandInfoList *info, **list = opaque;
1170
1171 if (!cmd->enabled) {
1172 return;
1173 }
1174
1175 info = g_malloc0(sizeof(*info));
1176 info->value = g_malloc0(sizeof(*info->value));
1177 info->value->name = g_strdup(cmd->name);
1178 info->next = *list;
1179 *list = info;
1180}
1181
1182CommandInfoList *qmp_query_commands(Error **errp)
1183{
1184 CommandInfoList *list = NULL;
1185
1186 qmp_for_each_command(cur_mon->qmp.commands, query_commands_cb, &list);
1187
1188 return list;
1189}
1190
1191EventInfoList *qmp_query_events(Error **errp)
1192{
1193 EventInfoList *info, *ev_list = NULL;
1194 QAPIEvent e;
1195
1196 for (e = 0 ; e < QAPI_EVENT__MAX ; e++) {
1197 const char *event_name = QAPIEvent_str(e);
1198 assert(event_name != NULL);
1199 info = g_malloc0(sizeof(*info));
1200 info->value = g_malloc0(sizeof(*info->value));
1201 info->value->name = g_strdup(event_name);
1202
1203 info->next = ev_list;
1204 ev_list = info;
1205 }
1206
1207 return ev_list;
1208}
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data,
1220 Error **errp)
1221{
1222 *ret_data = qobject_from_qlit(&qmp_schema_qlit);
1223}
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237static void qmp_unregister_commands_hack(void)
1238{
1239#ifndef CONFIG_REPLICATION
1240 qmp_unregister_command(&qmp_commands, "xen-set-replication");
1241 qmp_unregister_command(&qmp_commands, "query-xen-replication-status");
1242 qmp_unregister_command(&qmp_commands, "xen-colo-do-checkpoint");
1243#endif
1244#ifndef TARGET_I386
1245 qmp_unregister_command(&qmp_commands, "rtc-reset-reinjection");
1246 qmp_unregister_command(&qmp_commands, "query-sev");
1247 qmp_unregister_command(&qmp_commands, "query-sev-launch-measure");
1248 qmp_unregister_command(&qmp_commands, "query-sev-capabilities");
1249#endif
1250#ifndef TARGET_S390X
1251 qmp_unregister_command(&qmp_commands, "dump-skeys");
1252#endif
1253#ifndef TARGET_ARM
1254 qmp_unregister_command(&qmp_commands, "query-gic-capabilities");
1255#endif
1256#if !defined(TARGET_S390X) && !defined(TARGET_I386)
1257 qmp_unregister_command(&qmp_commands, "query-cpu-model-expansion");
1258#endif
1259#if !defined(TARGET_S390X)
1260 qmp_unregister_command(&qmp_commands, "query-cpu-model-baseline");
1261 qmp_unregister_command(&qmp_commands, "query-cpu-model-comparison");
1262#endif
1263#if !defined(TARGET_PPC) && !defined(TARGET_ARM) && !defined(TARGET_I386) \
1264 && !defined(TARGET_S390X)
1265 qmp_unregister_command(&qmp_commands, "query-cpu-definitions");
1266#endif
1267}
1268
1269static void monitor_init_qmp_commands(void)
1270{
1271
1272
1273
1274
1275
1276
1277
1278 qmp_init_marshal(&qmp_commands);
1279
1280 qmp_register_command(&qmp_commands, "query-qmp-schema",
1281 qmp_query_qmp_schema, QCO_ALLOW_PRECONFIG);
1282 qmp_register_command(&qmp_commands, "device_add", qmp_device_add,
1283 QCO_NO_OPTIONS);
1284 qmp_register_command(&qmp_commands, "netdev_add", qmp_netdev_add,
1285 QCO_NO_OPTIONS);
1286
1287 qmp_unregister_commands_hack();
1288
1289 QTAILQ_INIT(&qmp_cap_negotiation_commands);
1290 qmp_register_command(&qmp_cap_negotiation_commands, "qmp_capabilities",
1291 qmp_marshal_qmp_capabilities, QCO_ALLOW_PRECONFIG);
1292}
1293
1294static bool qmp_oob_enabled(Monitor *mon)
1295{
1296 return mon->qmp.capab[QMP_CAPABILITY_OOB];
1297}
1298
1299static void monitor_qmp_caps_reset(Monitor *mon)
1300{
1301 memset(mon->qmp.capab_offered, 0, sizeof(mon->qmp.capab_offered));
1302 memset(mon->qmp.capab, 0, sizeof(mon->qmp.capab));
1303 mon->qmp.capab_offered[QMP_CAPABILITY_OOB] = mon->use_io_thread;
1304}
1305
1306
1307
1308
1309
1310
1311static bool qmp_caps_accept(Monitor *mon, QMPCapabilityList *list,
1312 Error **errp)
1313{
1314 GString *unavailable = NULL;
1315 bool capab[QMP_CAPABILITY__MAX];
1316
1317 memset(capab, 0, sizeof(capab));
1318
1319 for (; list; list = list->next) {
1320 if (!mon->qmp.capab_offered[list->value]) {
1321 if (!unavailable) {
1322 unavailable = g_string_new(QMPCapability_str(list->value));
1323 } else {
1324 g_string_append_printf(unavailable, ", %s",
1325 QMPCapability_str(list->value));
1326 }
1327 }
1328 capab[list->value] = true;
1329 }
1330
1331 if (unavailable) {
1332 error_setg(errp, "Capability %s not available", unavailable->str);
1333 g_string_free(unavailable, true);
1334 return false;
1335 }
1336
1337 memcpy(mon->qmp.capab, capab, sizeof(capab));
1338 return true;
1339}
1340
1341void qmp_qmp_capabilities(bool has_enable, QMPCapabilityList *enable,
1342 Error **errp)
1343{
1344 if (cur_mon->qmp.commands == &qmp_commands) {
1345 error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
1346 "Capabilities negotiation is already complete, command "
1347 "ignored");
1348 return;
1349 }
1350
1351 if (!qmp_caps_accept(cur_mon, enable, errp)) {
1352 return;
1353 }
1354
1355 cur_mon->qmp.commands = &qmp_commands;
1356}
1357
1358
1359int monitor_set_cpu(int cpu_index)
1360{
1361 CPUState *cpu;
1362
1363 cpu = qemu_get_cpu(cpu_index);
1364 if (cpu == NULL) {
1365 return -1;
1366 }
1367 g_free(cur_mon->mon_cpu_path);
1368 cur_mon->mon_cpu_path = object_get_canonical_path(OBJECT(cpu));
1369 return 0;
1370}
1371
1372
1373static CPUState *mon_get_cpu_sync(bool synchronize)
1374{
1375 CPUState *cpu;
1376
1377 if (cur_mon->mon_cpu_path) {
1378 cpu = (CPUState *) object_resolve_path_type(cur_mon->mon_cpu_path,
1379 TYPE_CPU, NULL);
1380 if (!cpu) {
1381 g_free(cur_mon->mon_cpu_path);
1382 cur_mon->mon_cpu_path = NULL;
1383 }
1384 }
1385 if (!cur_mon->mon_cpu_path) {
1386 if (!first_cpu) {
1387 return NULL;
1388 }
1389 monitor_set_cpu(first_cpu->cpu_index);
1390 cpu = first_cpu;
1391 }
1392 if (synchronize) {
1393 cpu_synchronize_state(cpu);
1394 }
1395 return cpu;
1396}
1397
1398CPUState *mon_get_cpu(void)
1399{
1400 return mon_get_cpu_sync(true);
1401}
1402
1403CPUArchState *mon_get_cpu_env(void)
1404{
1405 CPUState *cs = mon_get_cpu();
1406
1407 return cs ? cs->env_ptr : NULL;
1408}
1409
1410int monitor_get_cpu_index(void)
1411{
1412 CPUState *cs = mon_get_cpu_sync(false);
1413
1414 return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
1415}
1416
1417static void hmp_info_registers(Monitor *mon, const QDict *qdict)
1418{
1419 bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
1420 CPUState *cs;
1421
1422 if (all_cpus) {
1423 CPU_FOREACH(cs) {
1424 monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
1425 cpu_dump_state(cs, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
1426 }
1427 } else {
1428 cs = mon_get_cpu();
1429
1430 if (!cs) {
1431 monitor_printf(mon, "No CPU available\n");
1432 return;
1433 }
1434
1435 cpu_dump_state(cs, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
1436 }
1437}
1438
1439#ifdef CONFIG_TCG
1440static void hmp_info_jit(Monitor *mon, const QDict *qdict)
1441{
1442 if (!tcg_enabled()) {
1443 error_report("JIT information is only available with accel=tcg");
1444 return;
1445 }
1446
1447 dump_exec_info((FILE *)mon, monitor_fprintf);
1448 dump_drift_info((FILE *)mon, monitor_fprintf);
1449}
1450
1451static void hmp_info_opcount(Monitor *mon, const QDict *qdict)
1452{
1453 dump_opcount_info((FILE *)mon, monitor_fprintf);
1454}
1455#endif
1456
1457static void hmp_info_history(Monitor *mon, const QDict *qdict)
1458{
1459 int i;
1460 const char *str;
1461
1462 if (!mon->rs)
1463 return;
1464 i = 0;
1465 for(;;) {
1466 str = readline_get_history(mon->rs, i);
1467 if (!str)
1468 break;
1469 monitor_printf(mon, "%d: '%s'\n", i, str);
1470 i++;
1471 }
1472}
1473
1474static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
1475{
1476 CPUState *cs = mon_get_cpu();
1477
1478 if (!cs) {
1479 monitor_printf(mon, "No CPU available\n");
1480 return;
1481 }
1482 cpu_dump_statistics(cs, (FILE *)mon, &monitor_fprintf, 0);
1483}
1484
1485static void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
1486{
1487 const char *name = qdict_get_try_str(qdict, "name");
1488 bool has_vcpu = qdict_haskey(qdict, "vcpu");
1489 int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
1490 TraceEventInfoList *events;
1491 TraceEventInfoList *elem;
1492 Error *local_err = NULL;
1493
1494 if (name == NULL) {
1495 name = "*";
1496 }
1497 if (vcpu < 0) {
1498 monitor_printf(mon, "argument vcpu must be positive");
1499 return;
1500 }
1501
1502 events = qmp_trace_event_get_state(name, has_vcpu, vcpu, &local_err);
1503 if (local_err) {
1504 error_report_err(local_err);
1505 return;
1506 }
1507
1508 for (elem = events; elem != NULL; elem = elem->next) {
1509 monitor_printf(mon, "%s : state %u\n",
1510 elem->value->name,
1511 elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
1512 }
1513 qapi_free_TraceEventInfoList(events);
1514}
1515
1516void qmp_client_migrate_info(const char *protocol, const char *hostname,
1517 bool has_port, int64_t port,
1518 bool has_tls_port, int64_t tls_port,
1519 bool has_cert_subject, const char *cert_subject,
1520 Error **errp)
1521{
1522 if (strcmp(protocol, "spice") == 0) {
1523 if (!qemu_using_spice(errp)) {
1524 return;
1525 }
1526
1527 if (!has_port && !has_tls_port) {
1528 error_setg(errp, QERR_MISSING_PARAMETER, "port/tls-port");
1529 return;
1530 }
1531
1532 if (qemu_spice_migrate_info(hostname,
1533 has_port ? port : -1,
1534 has_tls_port ? tls_port : -1,
1535 cert_subject)) {
1536 error_setg(errp, QERR_UNDEFINED_ERROR);
1537 return;
1538 }
1539 return;
1540 }
1541
1542 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", "spice");
1543}
1544
1545static void hmp_logfile(Monitor *mon, const QDict *qdict)
1546{
1547 Error *err = NULL;
1548
1549 qemu_set_log_filename(qdict_get_str(qdict, "filename"), &err);
1550 if (err) {
1551 error_report_err(err);
1552 }
1553}
1554
1555static void hmp_log(Monitor *mon, const QDict *qdict)
1556{
1557 int mask;
1558 const char *items = qdict_get_str(qdict, "items");
1559
1560 if (!strcmp(items, "none")) {
1561 mask = 0;
1562 } else {
1563 mask = qemu_str_to_log_mask(items);
1564 if (!mask) {
1565 help_cmd(mon, "log");
1566 return;
1567 }
1568 }
1569 qemu_set_log(mask);
1570}
1571
1572static void hmp_singlestep(Monitor *mon, const QDict *qdict)
1573{
1574 const char *option = qdict_get_try_str(qdict, "option");
1575 if (!option || !strcmp(option, "on")) {
1576 singlestep = 1;
1577 } else if (!strcmp(option, "off")) {
1578 singlestep = 0;
1579 } else {
1580 monitor_printf(mon, "unexpected option %s\n", option);
1581 }
1582}
1583
1584static void hmp_gdbserver(Monitor *mon, const QDict *qdict)
1585{
1586 const char *device = qdict_get_try_str(qdict, "device");
1587 if (!device)
1588 device = "tcp::" DEFAULT_GDBSTUB_PORT;
1589 if (gdbserver_start(device) < 0) {
1590 monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1591 device);
1592 } else if (strcmp(device, "none") == 0) {
1593 monitor_printf(mon, "Disabled gdbserver\n");
1594 } else {
1595 monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1596 device);
1597 }
1598}
1599
1600static void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
1601{
1602 const char *action = qdict_get_str(qdict, "action");
1603 if (select_watchdog_action(action) == -1) {
1604 monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1605 }
1606}
1607
1608static void monitor_printc(Monitor *mon, int c)
1609{
1610 monitor_printf(mon, "'");
1611 switch(c) {
1612 case '\'':
1613 monitor_printf(mon, "\\'");
1614 break;
1615 case '\\':
1616 monitor_printf(mon, "\\\\");
1617 break;
1618 case '\n':
1619 monitor_printf(mon, "\\n");
1620 break;
1621 case '\r':
1622 monitor_printf(mon, "\\r");
1623 break;
1624 default:
1625 if (c >= 32 && c <= 126) {
1626 monitor_printf(mon, "%c", c);
1627 } else {
1628 monitor_printf(mon, "\\x%02x", c);
1629 }
1630 break;
1631 }
1632 monitor_printf(mon, "'");
1633}
1634
1635static void memory_dump(Monitor *mon, int count, int format, int wsize,
1636 hwaddr addr, int is_physical)
1637{
1638 int l, line_size, i, max_digits, len;
1639 uint8_t buf[16];
1640 uint64_t v;
1641 CPUState *cs = mon_get_cpu();
1642
1643 if (!cs && (format == 'i' || !is_physical)) {
1644 monitor_printf(mon, "Can not dump without CPU\n");
1645 return;
1646 }
1647
1648 if (format == 'i') {
1649 monitor_disas(mon, cs, addr, count, is_physical);
1650 return;
1651 }
1652
1653 len = wsize * count;
1654 if (wsize == 1)
1655 line_size = 8;
1656 else
1657 line_size = 16;
1658 max_digits = 0;
1659
1660 switch(format) {
1661 case 'o':
1662 max_digits = DIV_ROUND_UP(wsize * 8, 3);
1663 break;
1664 default:
1665 case 'x':
1666 max_digits = (wsize * 8) / 4;
1667 break;
1668 case 'u':
1669 case 'd':
1670 max_digits = DIV_ROUND_UP(wsize * 8 * 10, 33);
1671 break;
1672 case 'c':
1673 wsize = 1;
1674 break;
1675 }
1676
1677 while (len > 0) {
1678 if (is_physical)
1679 monitor_printf(mon, TARGET_FMT_plx ":", addr);
1680 else
1681 monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1682 l = len;
1683 if (l > line_size)
1684 l = line_size;
1685 if (is_physical) {
1686 cpu_physical_memory_read(addr, buf, l);
1687 } else {
1688 if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
1689 monitor_printf(mon, " Cannot access memory\n");
1690 break;
1691 }
1692 }
1693 i = 0;
1694 while (i < l) {
1695 switch(wsize) {
1696 default:
1697 case 1:
1698 v = ldub_p(buf + i);
1699 break;
1700 case 2:
1701 v = lduw_p(buf + i);
1702 break;
1703 case 4:
1704 v = (uint32_t)ldl_p(buf + i);
1705 break;
1706 case 8:
1707 v = ldq_p(buf + i);
1708 break;
1709 }
1710 monitor_printf(mon, " ");
1711 switch(format) {
1712 case 'o':
1713 monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1714 break;
1715 case 'x':
1716 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1717 break;
1718 case 'u':
1719 monitor_printf(mon, "%*" PRIu64, max_digits, v);
1720 break;
1721 case 'd':
1722 monitor_printf(mon, "%*" PRId64, max_digits, v);
1723 break;
1724 case 'c':
1725 monitor_printc(mon, v);
1726 break;
1727 }
1728 i += wsize;
1729 }
1730 monitor_printf(mon, "\n");
1731 addr += l;
1732 len -= l;
1733 }
1734}
1735
1736static void hmp_memory_dump(Monitor *mon, const QDict *qdict)
1737{
1738 int count = qdict_get_int(qdict, "count");
1739 int format = qdict_get_int(qdict, "format");
1740 int size = qdict_get_int(qdict, "size");
1741 target_long addr = qdict_get_int(qdict, "addr");
1742
1743 memory_dump(mon, count, format, size, addr, 0);
1744}
1745
1746static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
1747{
1748 int count = qdict_get_int(qdict, "count");
1749 int format = qdict_get_int(qdict, "format");
1750 int size = qdict_get_int(qdict, "size");
1751 hwaddr addr = qdict_get_int(qdict, "addr");
1752
1753 memory_dump(mon, count, format, size, addr, 1);
1754}
1755
1756static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp)
1757{
1758 MemoryRegionSection mrs = memory_region_find(get_system_memory(),
1759 addr, 1);
1760
1761 if (!mrs.mr) {
1762 error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
1763 return NULL;
1764 }
1765
1766 if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
1767 error_setg(errp, "Memory at address 0x%" HWADDR_PRIx "is not RAM", addr);
1768 memory_region_unref(mrs.mr);
1769 return NULL;
1770 }
1771
1772 *p_mr = mrs.mr;
1773 return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
1774}
1775
1776static void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
1777{
1778 hwaddr addr = qdict_get_int(qdict, "addr");
1779 Error *local_err = NULL;
1780 MemoryRegion *mr = NULL;
1781 void *ptr;
1782
1783 ptr = gpa2hva(&mr, addr, &local_err);
1784 if (local_err) {
1785 error_report_err(local_err);
1786 return;
1787 }
1788
1789 monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
1790 " (%s) is %p\n",
1791 addr, mr->name, ptr);
1792
1793 memory_region_unref(mr);
1794}
1795
1796#ifdef CONFIG_LINUX
1797static uint64_t vtop(void *ptr, Error **errp)
1798{
1799 uint64_t pinfo;
1800 uint64_t ret = -1;
1801 uintptr_t addr = (uintptr_t) ptr;
1802 uintptr_t pagesize = getpagesize();
1803 off_t offset = addr / pagesize * sizeof(pinfo);
1804 int fd;
1805
1806 fd = open("/proc/self/pagemap", O_RDONLY);
1807 if (fd == -1) {
1808 error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
1809 return -1;
1810 }
1811
1812
1813 atomic_add((uint8_t *)ptr, 0);
1814
1815 if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
1816 error_setg_errno(errp, errno, "Cannot read pagemap");
1817 goto out;
1818 }
1819 if ((pinfo & (1ull << 63)) == 0) {
1820 error_setg(errp, "Page not present");
1821 goto out;
1822 }
1823 ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));
1824
1825out:
1826 close(fd);
1827 return ret;
1828}
1829
1830static void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
1831{
1832 hwaddr addr = qdict_get_int(qdict, "addr");
1833 Error *local_err = NULL;
1834 MemoryRegion *mr = NULL;
1835 void *ptr;
1836 uint64_t physaddr;
1837
1838 ptr = gpa2hva(&mr, addr, &local_err);
1839 if (local_err) {
1840 error_report_err(local_err);
1841 return;
1842 }
1843
1844 physaddr = vtop(ptr, &local_err);
1845 if (local_err) {
1846 error_report_err(local_err);
1847 } else {
1848 monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
1849 " (%s) is 0x%" PRIx64 "\n",
1850 addr, mr->name, (uint64_t) physaddr);
1851 }
1852
1853 memory_region_unref(mr);
1854}
1855#endif
1856
1857static void do_print(Monitor *mon, const QDict *qdict)
1858{
1859 int format = qdict_get_int(qdict, "format");
1860 hwaddr val = qdict_get_int(qdict, "val");
1861
1862 switch(format) {
1863 case 'o':
1864 monitor_printf(mon, "%#" HWADDR_PRIo, val);
1865 break;
1866 case 'x':
1867 monitor_printf(mon, "%#" HWADDR_PRIx, val);
1868 break;
1869 case 'u':
1870 monitor_printf(mon, "%" HWADDR_PRIu, val);
1871 break;
1872 default:
1873 case 'd':
1874 monitor_printf(mon, "%" HWADDR_PRId, val);
1875 break;
1876 case 'c':
1877 monitor_printc(mon, val);
1878 break;
1879 }
1880 monitor_printf(mon, "\n");
1881}
1882
1883static void hmp_sum(Monitor *mon, const QDict *qdict)
1884{
1885 uint32_t addr;
1886 uint16_t sum;
1887 uint32_t start = qdict_get_int(qdict, "start");
1888 uint32_t size = qdict_get_int(qdict, "size");
1889
1890 sum = 0;
1891 for(addr = start; addr < (start + size); addr++) {
1892 uint8_t val = address_space_ldub(&address_space_memory, addr,
1893 MEMTXATTRS_UNSPECIFIED, NULL);
1894
1895 sum = (sum >> 1) | (sum << 15);
1896 sum += val;
1897 }
1898 monitor_printf(mon, "%05d\n", sum);
1899}
1900
1901static int mouse_button_state;
1902
1903static void hmp_mouse_move(Monitor *mon, const QDict *qdict)
1904{
1905 int dx, dy, dz, button;
1906 const char *dx_str = qdict_get_str(qdict, "dx_str");
1907 const char *dy_str = qdict_get_str(qdict, "dy_str");
1908 const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1909
1910 dx = strtol(dx_str, NULL, 0);
1911 dy = strtol(dy_str, NULL, 0);
1912 qemu_input_queue_rel(NULL, INPUT_AXIS_X, dx);
1913 qemu_input_queue_rel(NULL, INPUT_AXIS_Y, dy);
1914
1915 if (dz_str) {
1916 dz = strtol(dz_str, NULL, 0);
1917 if (dz != 0) {
1918 button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
1919 qemu_input_queue_btn(NULL, button, true);
1920 qemu_input_event_sync();
1921 qemu_input_queue_btn(NULL, button, false);
1922 }
1923 }
1924 qemu_input_event_sync();
1925}
1926
1927static void hmp_mouse_button(Monitor *mon, const QDict *qdict)
1928{
1929 static uint32_t bmap[INPUT_BUTTON__MAX] = {
1930 [INPUT_BUTTON_LEFT] = MOUSE_EVENT_LBUTTON,
1931 [INPUT_BUTTON_MIDDLE] = MOUSE_EVENT_MBUTTON,
1932 [INPUT_BUTTON_RIGHT] = MOUSE_EVENT_RBUTTON,
1933 };
1934 int button_state = qdict_get_int(qdict, "button_state");
1935
1936 if (mouse_button_state == button_state) {
1937 return;
1938 }
1939 qemu_input_update_buttons(NULL, bmap, mouse_button_state, button_state);
1940 qemu_input_event_sync();
1941 mouse_button_state = button_state;
1942}
1943
1944static void hmp_ioport_read(Monitor *mon, const QDict *qdict)
1945{
1946 int size = qdict_get_int(qdict, "size");
1947 int addr = qdict_get_int(qdict, "addr");
1948 int has_index = qdict_haskey(qdict, "index");
1949 uint32_t val;
1950 int suffix;
1951
1952 if (has_index) {
1953 int index = qdict_get_int(qdict, "index");
1954 cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1955 addr++;
1956 }
1957 addr &= 0xffff;
1958
1959 switch(size) {
1960 default:
1961 case 1:
1962 val = cpu_inb(addr);
1963 suffix = 'b';
1964 break;
1965 case 2:
1966 val = cpu_inw(addr);
1967 suffix = 'w';
1968 break;
1969 case 4:
1970 val = cpu_inl(addr);
1971 suffix = 'l';
1972 break;
1973 }
1974 monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1975 suffix, addr, size * 2, val);
1976}
1977
1978static void hmp_ioport_write(Monitor *mon, const QDict *qdict)
1979{
1980 int size = qdict_get_int(qdict, "size");
1981 int addr = qdict_get_int(qdict, "addr");
1982 int val = qdict_get_int(qdict, "val");
1983
1984 addr &= IOPORTS_MASK;
1985
1986 switch (size) {
1987 default:
1988 case 1:
1989 cpu_outb(addr, val);
1990 break;
1991 case 2:
1992 cpu_outw(addr, val);
1993 break;
1994 case 4:
1995 cpu_outl(addr, val);
1996 break;
1997 }
1998}
1999
2000static void hmp_boot_set(Monitor *mon, const QDict *qdict)
2001{
2002 Error *local_err = NULL;
2003 const char *bootdevice = qdict_get_str(qdict, "bootdevice");
2004
2005 qemu_boot_set(bootdevice, &local_err);
2006 if (local_err) {
2007 error_report_err(local_err);
2008 } else {
2009 monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
2010 }
2011}
2012
2013static void hmp_info_mtree(Monitor *mon, const QDict *qdict)
2014{
2015 bool flatview = qdict_get_try_bool(qdict, "flatview", false);
2016 bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
2017 bool owner = qdict_get_try_bool(qdict, "owner", false);
2018
2019 mtree_info((fprintf_function)monitor_printf, mon, flatview, dispatch_tree,
2020 owner);
2021}
2022
2023static void hmp_info_numa(Monitor *mon, const QDict *qdict)
2024{
2025 int i;
2026 NumaNodeMem *node_mem;
2027 CpuInfoList *cpu_list, *cpu;
2028
2029 cpu_list = qmp_query_cpus(&error_abort);
2030 node_mem = g_new0(NumaNodeMem, nb_numa_nodes);
2031
2032 query_numa_node_mem(node_mem);
2033 monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
2034 for (i = 0; i < nb_numa_nodes; i++) {
2035 monitor_printf(mon, "node %d cpus:", i);
2036 for (cpu = cpu_list; cpu; cpu = cpu->next) {
2037 if (cpu->value->has_props && cpu->value->props->has_node_id &&
2038 cpu->value->props->node_id == i) {
2039 monitor_printf(mon, " %" PRIi64, cpu->value->CPU);
2040 }
2041 }
2042 monitor_printf(mon, "\n");
2043 monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
2044 node_mem[i].node_mem >> 20);
2045 monitor_printf(mon, "node %d plugged: %" PRId64 " MB\n", i,
2046 node_mem[i].node_plugged_mem >> 20);
2047 }
2048 qapi_free_CpuInfoList(cpu_list);
2049 g_free(node_mem);
2050}
2051
2052#ifdef CONFIG_PROFILER
2053
2054int64_t tcg_time;
2055int64_t dev_time;
2056
2057static void hmp_info_profile(Monitor *mon, const QDict *qdict)
2058{
2059 monitor_printf(mon, "async time %" PRId64 " (%0.3f)\n",
2060 dev_time, dev_time / (double)NANOSECONDS_PER_SECOND);
2061 monitor_printf(mon, "qemu time %" PRId64 " (%0.3f)\n",
2062 tcg_time, tcg_time / (double)NANOSECONDS_PER_SECOND);
2063 tcg_time = 0;
2064 dev_time = 0;
2065}
2066#else
2067static void hmp_info_profile(Monitor *mon, const QDict *qdict)
2068{
2069 monitor_printf(mon, "Internal profiler not compiled\n");
2070}
2071#endif
2072
2073
2074static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
2075
2076static void hmp_info_capture(Monitor *mon, const QDict *qdict)
2077{
2078 int i;
2079 CaptureState *s;
2080
2081 for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
2082 monitor_printf(mon, "[%d]: ", i);
2083 s->ops.info (s->opaque);
2084 }
2085}
2086
2087static void hmp_stopcapture(Monitor *mon, const QDict *qdict)
2088{
2089 int i;
2090 int n = qdict_get_int(qdict, "n");
2091 CaptureState *s;
2092
2093 for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
2094 if (i == n) {
2095 s->ops.destroy (s->opaque);
2096 QLIST_REMOVE (s, entries);
2097 g_free (s);
2098 return;
2099 }
2100 }
2101}
2102
2103static void hmp_wavcapture(Monitor *mon, const QDict *qdict)
2104{
2105 const char *path = qdict_get_str(qdict, "path");
2106 int has_freq = qdict_haskey(qdict, "freq");
2107 int freq = qdict_get_try_int(qdict, "freq", -1);
2108 int has_bits = qdict_haskey(qdict, "bits");
2109 int bits = qdict_get_try_int(qdict, "bits", -1);
2110 int has_channels = qdict_haskey(qdict, "nchannels");
2111 int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
2112 CaptureState *s;
2113
2114 s = g_malloc0 (sizeof (*s));
2115
2116 freq = has_freq ? freq : 44100;
2117 bits = has_bits ? bits : 16;
2118 nchannels = has_channels ? nchannels : 2;
2119
2120 if (wav_start_capture (s, path, freq, bits, nchannels)) {
2121 monitor_printf(mon, "Failed to add wave capture\n");
2122 g_free (s);
2123 return;
2124 }
2125 QLIST_INSERT_HEAD (&capture_head, s, entries);
2126}
2127
2128static qemu_acl *find_acl(Monitor *mon, const char *name)
2129{
2130 qemu_acl *acl = qemu_acl_find(name);
2131
2132 if (!acl) {
2133 monitor_printf(mon, "acl: unknown list '%s'\n", name);
2134 }
2135 return acl;
2136}
2137
2138static void hmp_acl_show(Monitor *mon, const QDict *qdict)
2139{
2140 const char *aclname = qdict_get_str(qdict, "aclname");
2141 qemu_acl *acl = find_acl(mon, aclname);
2142 qemu_acl_entry *entry;
2143 int i = 0;
2144
2145 if (acl) {
2146 monitor_printf(mon, "policy: %s\n",
2147 acl->defaultDeny ? "deny" : "allow");
2148 QTAILQ_FOREACH(entry, &acl->entries, next) {
2149 i++;
2150 monitor_printf(mon, "%d: %s %s\n", i,
2151 entry->deny ? "deny" : "allow", entry->match);
2152 }
2153 }
2154}
2155
2156static void hmp_acl_reset(Monitor *mon, const QDict *qdict)
2157{
2158 const char *aclname = qdict_get_str(qdict, "aclname");
2159 qemu_acl *acl = find_acl(mon, aclname);
2160
2161 if (acl) {
2162 qemu_acl_reset(acl);
2163 monitor_printf(mon, "acl: removed all rules\n");
2164 }
2165}
2166
2167static void hmp_acl_policy(Monitor *mon, const QDict *qdict)
2168{
2169 const char *aclname = qdict_get_str(qdict, "aclname");
2170 const char *policy = qdict_get_str(qdict, "policy");
2171 qemu_acl *acl = find_acl(mon, aclname);
2172
2173 if (acl) {
2174 if (strcmp(policy, "allow") == 0) {
2175 acl->defaultDeny = 0;
2176 monitor_printf(mon, "acl: policy set to 'allow'\n");
2177 } else if (strcmp(policy, "deny") == 0) {
2178 acl->defaultDeny = 1;
2179 monitor_printf(mon, "acl: policy set to 'deny'\n");
2180 } else {
2181 monitor_printf(mon, "acl: unknown policy '%s', "
2182 "expected 'deny' or 'allow'\n", policy);
2183 }
2184 }
2185}
2186
2187static void hmp_acl_add(Monitor *mon, const QDict *qdict)
2188{
2189 const char *aclname = qdict_get_str(qdict, "aclname");
2190 const char *match = qdict_get_str(qdict, "match");
2191 const char *policy = qdict_get_str(qdict, "policy");
2192 int has_index = qdict_haskey(qdict, "index");
2193 int index = qdict_get_try_int(qdict, "index", -1);
2194 qemu_acl *acl = find_acl(mon, aclname);
2195 int deny, ret;
2196
2197 if (acl) {
2198 if (strcmp(policy, "allow") == 0) {
2199 deny = 0;
2200 } else if (strcmp(policy, "deny") == 0) {
2201 deny = 1;
2202 } else {
2203 monitor_printf(mon, "acl: unknown policy '%s', "
2204 "expected 'deny' or 'allow'\n", policy);
2205 return;
2206 }
2207 if (has_index)
2208 ret = qemu_acl_insert(acl, deny, match, index);
2209 else
2210 ret = qemu_acl_append(acl, deny, match);
2211 if (ret < 0)
2212 monitor_printf(mon, "acl: unable to add acl entry\n");
2213 else
2214 monitor_printf(mon, "acl: added rule at position %d\n", ret);
2215 }
2216}
2217
2218static void hmp_acl_remove(Monitor *mon, const QDict *qdict)
2219{
2220 const char *aclname = qdict_get_str(qdict, "aclname");
2221 const char *match = qdict_get_str(qdict, "match");
2222 qemu_acl *acl = find_acl(mon, aclname);
2223 int ret;
2224
2225 if (acl) {
2226 ret = qemu_acl_remove(acl, match);
2227 if (ret < 0)
2228 monitor_printf(mon, "acl: no matching acl entry\n");
2229 else
2230 monitor_printf(mon, "acl: removed rule at position %d\n", ret);
2231 }
2232}
2233
2234void qmp_getfd(const char *fdname, Error **errp)
2235{
2236 mon_fd_t *monfd;
2237 int fd, tmp_fd;
2238
2239 fd = qemu_chr_fe_get_msgfd(&cur_mon->chr);
2240 if (fd == -1) {
2241 error_setg(errp, QERR_FD_NOT_SUPPLIED);
2242 return;
2243 }
2244
2245 if (qemu_isdigit(fdname[0])) {
2246 close(fd);
2247 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
2248 "a name not starting with a digit");
2249 return;
2250 }
2251
2252 qemu_mutex_lock(&cur_mon->mon_lock);
2253 QLIST_FOREACH(monfd, &cur_mon->fds, next) {
2254 if (strcmp(monfd->name, fdname) != 0) {
2255 continue;
2256 }
2257
2258 tmp_fd = monfd->fd;
2259 monfd->fd = fd;
2260 qemu_mutex_unlock(&cur_mon->mon_lock);
2261
2262 close(tmp_fd);
2263 return;
2264 }
2265
2266 monfd = g_malloc0(sizeof(mon_fd_t));
2267 monfd->name = g_strdup(fdname);
2268 monfd->fd = fd;
2269
2270 QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
2271 qemu_mutex_unlock(&cur_mon->mon_lock);
2272}
2273
2274void qmp_closefd(const char *fdname, Error **errp)
2275{
2276 mon_fd_t *monfd;
2277 int tmp_fd;
2278
2279 qemu_mutex_lock(&cur_mon->mon_lock);
2280 QLIST_FOREACH(monfd, &cur_mon->fds, next) {
2281 if (strcmp(monfd->name, fdname) != 0) {
2282 continue;
2283 }
2284
2285 QLIST_REMOVE(monfd, next);
2286 tmp_fd = monfd->fd;
2287 g_free(monfd->name);
2288 g_free(monfd);
2289 qemu_mutex_unlock(&cur_mon->mon_lock);
2290
2291 close(tmp_fd);
2292 return;
2293 }
2294
2295 qemu_mutex_unlock(&cur_mon->mon_lock);
2296 error_setg(errp, QERR_FD_NOT_FOUND, fdname);
2297}
2298
2299int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
2300{
2301 mon_fd_t *monfd;
2302
2303 qemu_mutex_lock(&mon->mon_lock);
2304 QLIST_FOREACH(monfd, &mon->fds, next) {
2305 int fd;
2306
2307 if (strcmp(monfd->name, fdname) != 0) {
2308 continue;
2309 }
2310
2311 fd = monfd->fd;
2312
2313
2314 QLIST_REMOVE(monfd, next);
2315 g_free(monfd->name);
2316 g_free(monfd);
2317 qemu_mutex_unlock(&mon->mon_lock);
2318
2319 return fd;
2320 }
2321
2322 qemu_mutex_unlock(&mon->mon_lock);
2323 error_setg(errp, "File descriptor named '%s' has not been found", fdname);
2324 return -1;
2325}
2326
2327static void monitor_fdset_cleanup(MonFdset *mon_fdset)
2328{
2329 MonFdsetFd *mon_fdset_fd;
2330 MonFdsetFd *mon_fdset_fd_next;
2331
2332 QLIST_FOREACH_SAFE(mon_fdset_fd, &mon_fdset->fds, next, mon_fdset_fd_next) {
2333 if ((mon_fdset_fd->removed ||
2334 (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) &&
2335 runstate_is_running()) {
2336 close(mon_fdset_fd->fd);
2337 g_free(mon_fdset_fd->opaque);
2338 QLIST_REMOVE(mon_fdset_fd, next);
2339 g_free(mon_fdset_fd);
2340 }
2341 }
2342
2343 if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) {
2344 QLIST_REMOVE(mon_fdset, next);
2345 g_free(mon_fdset);
2346 }
2347}
2348
2349static void monitor_fdsets_cleanup(void)
2350{
2351 MonFdset *mon_fdset;
2352 MonFdset *mon_fdset_next;
2353
2354 qemu_mutex_lock(&mon_fdsets_lock);
2355 QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
2356 monitor_fdset_cleanup(mon_fdset);
2357 }
2358 qemu_mutex_unlock(&mon_fdsets_lock);
2359}
2360
2361AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
2362 const char *opaque, Error **errp)
2363{
2364 int fd;
2365 Monitor *mon = cur_mon;
2366 AddfdInfo *fdinfo;
2367
2368 fd = qemu_chr_fe_get_msgfd(&mon->chr);
2369 if (fd == -1) {
2370 error_setg(errp, QERR_FD_NOT_SUPPLIED);
2371 goto error;
2372 }
2373
2374 fdinfo = monitor_fdset_add_fd(fd, has_fdset_id, fdset_id,
2375 has_opaque, opaque, errp);
2376 if (fdinfo) {
2377 return fdinfo;
2378 }
2379
2380error:
2381 if (fd != -1) {
2382 close(fd);
2383 }
2384 return NULL;
2385}
2386
2387void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
2388{
2389 MonFdset *mon_fdset;
2390 MonFdsetFd *mon_fdset_fd;
2391 char fd_str[60];
2392
2393 qemu_mutex_lock(&mon_fdsets_lock);
2394 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2395 if (mon_fdset->id != fdset_id) {
2396 continue;
2397 }
2398 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2399 if (has_fd) {
2400 if (mon_fdset_fd->fd != fd) {
2401 continue;
2402 }
2403 mon_fdset_fd->removed = true;
2404 break;
2405 } else {
2406 mon_fdset_fd->removed = true;
2407 }
2408 }
2409 if (has_fd && !mon_fdset_fd) {
2410 goto error;
2411 }
2412 monitor_fdset_cleanup(mon_fdset);
2413 qemu_mutex_unlock(&mon_fdsets_lock);
2414 return;
2415 }
2416
2417error:
2418 qemu_mutex_unlock(&mon_fdsets_lock);
2419 if (has_fd) {
2420 snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
2421 fdset_id, fd);
2422 } else {
2423 snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64, fdset_id);
2424 }
2425 error_setg(errp, QERR_FD_NOT_FOUND, fd_str);
2426}
2427
2428FdsetInfoList *qmp_query_fdsets(Error **errp)
2429{
2430 MonFdset *mon_fdset;
2431 MonFdsetFd *mon_fdset_fd;
2432 FdsetInfoList *fdset_list = NULL;
2433
2434 qemu_mutex_lock(&mon_fdsets_lock);
2435 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2436 FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
2437 FdsetFdInfoList *fdsetfd_list = NULL;
2438
2439 fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
2440 fdset_info->value->fdset_id = mon_fdset->id;
2441
2442 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2443 FdsetFdInfoList *fdsetfd_info;
2444
2445 fdsetfd_info = g_malloc0(sizeof(*fdsetfd_info));
2446 fdsetfd_info->value = g_malloc0(sizeof(*fdsetfd_info->value));
2447 fdsetfd_info->value->fd = mon_fdset_fd->fd;
2448 if (mon_fdset_fd->opaque) {
2449 fdsetfd_info->value->has_opaque = true;
2450 fdsetfd_info->value->opaque = g_strdup(mon_fdset_fd->opaque);
2451 } else {
2452 fdsetfd_info->value->has_opaque = false;
2453 }
2454
2455 fdsetfd_info->next = fdsetfd_list;
2456 fdsetfd_list = fdsetfd_info;
2457 }
2458
2459 fdset_info->value->fds = fdsetfd_list;
2460
2461 fdset_info->next = fdset_list;
2462 fdset_list = fdset_info;
2463 }
2464 qemu_mutex_unlock(&mon_fdsets_lock);
2465
2466 return fdset_list;
2467}
2468
2469AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
2470 bool has_opaque, const char *opaque,
2471 Error **errp)
2472{
2473 MonFdset *mon_fdset = NULL;
2474 MonFdsetFd *mon_fdset_fd;
2475 AddfdInfo *fdinfo;
2476
2477 qemu_mutex_lock(&mon_fdsets_lock);
2478 if (has_fdset_id) {
2479 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2480
2481 if (fdset_id <= mon_fdset->id) {
2482 if (fdset_id < mon_fdset->id) {
2483 mon_fdset = NULL;
2484 }
2485 break;
2486 }
2487 }
2488 }
2489
2490 if (mon_fdset == NULL) {
2491 int64_t fdset_id_prev = -1;
2492 MonFdset *mon_fdset_cur = QLIST_FIRST(&mon_fdsets);
2493
2494 if (has_fdset_id) {
2495 if (fdset_id < 0) {
2496 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdset-id",
2497 "a non-negative value");
2498 qemu_mutex_unlock(&mon_fdsets_lock);
2499 return NULL;
2500 }
2501
2502 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2503 mon_fdset_cur = mon_fdset;
2504 if (fdset_id < mon_fdset_cur->id) {
2505 break;
2506 }
2507 }
2508 } else {
2509
2510 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2511 mon_fdset_cur = mon_fdset;
2512 if (fdset_id_prev == mon_fdset_cur->id - 1) {
2513 fdset_id_prev = mon_fdset_cur->id;
2514 continue;
2515 }
2516 break;
2517 }
2518 }
2519
2520 mon_fdset = g_malloc0(sizeof(*mon_fdset));
2521 if (has_fdset_id) {
2522 mon_fdset->id = fdset_id;
2523 } else {
2524 mon_fdset->id = fdset_id_prev + 1;
2525 }
2526
2527
2528 if (!mon_fdset_cur) {
2529 QLIST_INSERT_HEAD(&mon_fdsets, mon_fdset, next);
2530 } else if (mon_fdset->id < mon_fdset_cur->id) {
2531 QLIST_INSERT_BEFORE(mon_fdset_cur, mon_fdset, next);
2532 } else {
2533 QLIST_INSERT_AFTER(mon_fdset_cur, mon_fdset, next);
2534 }
2535 }
2536
2537 mon_fdset_fd = g_malloc0(sizeof(*mon_fdset_fd));
2538 mon_fdset_fd->fd = fd;
2539 mon_fdset_fd->removed = false;
2540 if (has_opaque) {
2541 mon_fdset_fd->opaque = g_strdup(opaque);
2542 }
2543 QLIST_INSERT_HEAD(&mon_fdset->fds, mon_fdset_fd, next);
2544
2545 fdinfo = g_malloc0(sizeof(*fdinfo));
2546 fdinfo->fdset_id = mon_fdset->id;
2547 fdinfo->fd = mon_fdset_fd->fd;
2548
2549 qemu_mutex_unlock(&mon_fdsets_lock);
2550 return fdinfo;
2551}
2552
2553int monitor_fdset_get_fd(int64_t fdset_id, int flags)
2554{
2555#ifdef _WIN32
2556 return -ENOENT;
2557#else
2558 MonFdset *mon_fdset;
2559 MonFdsetFd *mon_fdset_fd;
2560 int mon_fd_flags;
2561 int ret;
2562
2563 qemu_mutex_lock(&mon_fdsets_lock);
2564 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2565 if (mon_fdset->id != fdset_id) {
2566 continue;
2567 }
2568 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2569 mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
2570 if (mon_fd_flags == -1) {
2571 ret = -errno;
2572 goto out;
2573 }
2574
2575 if ((flags & O_ACCMODE) == (mon_fd_flags & O_ACCMODE)) {
2576 ret = mon_fdset_fd->fd;
2577 goto out;
2578 }
2579 }
2580 ret = -EACCES;
2581 goto out;
2582 }
2583 ret = -ENOENT;
2584
2585out:
2586 qemu_mutex_unlock(&mon_fdsets_lock);
2587 return ret;
2588#endif
2589}
2590
2591int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
2592{
2593 MonFdset *mon_fdset;
2594 MonFdsetFd *mon_fdset_fd_dup;
2595
2596 qemu_mutex_lock(&mon_fdsets_lock);
2597 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2598 if (mon_fdset->id != fdset_id) {
2599 continue;
2600 }
2601 QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2602 if (mon_fdset_fd_dup->fd == dup_fd) {
2603 goto err;
2604 }
2605 }
2606 mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
2607 mon_fdset_fd_dup->fd = dup_fd;
2608 QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
2609 qemu_mutex_unlock(&mon_fdsets_lock);
2610 return 0;
2611 }
2612
2613err:
2614 qemu_mutex_unlock(&mon_fdsets_lock);
2615 return -1;
2616}
2617
2618static int monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
2619{
2620 MonFdset *mon_fdset;
2621 MonFdsetFd *mon_fdset_fd_dup;
2622
2623 qemu_mutex_lock(&mon_fdsets_lock);
2624 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2625 QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2626 if (mon_fdset_fd_dup->fd == dup_fd) {
2627 if (remove) {
2628 QLIST_REMOVE(mon_fdset_fd_dup, next);
2629 if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
2630 monitor_fdset_cleanup(mon_fdset);
2631 }
2632 goto err;
2633 } else {
2634 qemu_mutex_unlock(&mon_fdsets_lock);
2635 return mon_fdset->id;
2636 }
2637 }
2638 }
2639 }
2640
2641err:
2642 qemu_mutex_unlock(&mon_fdsets_lock);
2643 return -1;
2644}
2645
2646int monitor_fdset_dup_fd_find(int dup_fd)
2647{
2648 return monitor_fdset_dup_fd_find_remove(dup_fd, false);
2649}
2650
2651void monitor_fdset_dup_fd_remove(int dup_fd)
2652{
2653 monitor_fdset_dup_fd_find_remove(dup_fd, true);
2654}
2655
2656int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
2657{
2658 int fd;
2659 Error *local_err = NULL;
2660
2661 if (!qemu_isdigit(fdname[0]) && mon) {
2662 fd = monitor_get_fd(mon, fdname, &local_err);
2663 } else {
2664 fd = qemu_parse_fd(fdname);
2665 if (fd == -1) {
2666 error_setg(&local_err, "Invalid file descriptor number '%s'",
2667 fdname);
2668 }
2669 }
2670 if (local_err) {
2671 error_propagate(errp, local_err);
2672 assert(fd == -1);
2673 } else {
2674 assert(fd != -1);
2675 }
2676
2677 return fd;
2678}
2679
2680
2681static mon_cmd_t info_cmds[] = {
2682#include "hmp-commands-info.h"
2683 { NULL, NULL, },
2684};
2685
2686
2687static mon_cmd_t mon_cmds[] = {
2688#include "hmp-commands.h"
2689 { NULL, NULL, },
2690};
2691
2692
2693
2694static const char *pch;
2695static sigjmp_buf expr_env;
2696
2697
2698static void GCC_FMT_ATTR(2, 3) QEMU_NORETURN
2699expr_error(Monitor *mon, const char *fmt, ...)
2700{
2701 va_list ap;
2702 va_start(ap, fmt);
2703 monitor_vprintf(mon, fmt, ap);
2704 monitor_printf(mon, "\n");
2705 va_end(ap);
2706 siglongjmp(expr_env, 1);
2707}
2708
2709
2710static int get_monitor_def(target_long *pval, const char *name)
2711{
2712 const MonitorDef *md = target_monitor_defs();
2713 CPUState *cs = mon_get_cpu();
2714 void *ptr;
2715 uint64_t tmp = 0;
2716 int ret;
2717
2718 if (cs == NULL || md == NULL) {
2719 return -1;
2720 }
2721
2722 for(; md->name != NULL; md++) {
2723 if (compare_cmd(name, md->name)) {
2724 if (md->get_value) {
2725 *pval = md->get_value(md, md->offset);
2726 } else {
2727 CPUArchState *env = mon_get_cpu_env();
2728 ptr = (uint8_t *)env + md->offset;
2729 switch(md->type) {
2730 case MD_I32:
2731 *pval = *(int32_t *)ptr;
2732 break;
2733 case MD_TLONG:
2734 *pval = *(target_long *)ptr;
2735 break;
2736 default:
2737 *pval = 0;
2738 break;
2739 }
2740 }
2741 return 0;
2742 }
2743 }
2744
2745 ret = target_get_monitor_def(cs, name, &tmp);
2746 if (!ret) {
2747 *pval = (target_long) tmp;
2748 }
2749
2750 return ret;
2751}
2752
2753static void next(void)
2754{
2755 if (*pch != '\0') {
2756 pch++;
2757 while (qemu_isspace(*pch))
2758 pch++;
2759 }
2760}
2761
2762static int64_t expr_sum(Monitor *mon);
2763
2764static int64_t expr_unary(Monitor *mon)
2765{
2766 int64_t n;
2767 char *p;
2768 int ret;
2769
2770 switch(*pch) {
2771 case '+':
2772 next();
2773 n = expr_unary(mon);
2774 break;
2775 case '-':
2776 next();
2777 n = -expr_unary(mon);
2778 break;
2779 case '~':
2780 next();
2781 n = ~expr_unary(mon);
2782 break;
2783 case '(':
2784 next();
2785 n = expr_sum(mon);
2786 if (*pch != ')') {
2787 expr_error(mon, "')' expected");
2788 }
2789 next();
2790 break;
2791 case '\'':
2792 pch++;
2793 if (*pch == '\0')
2794 expr_error(mon, "character constant expected");
2795 n = *pch;
2796 pch++;
2797 if (*pch != '\'')
2798 expr_error(mon, "missing terminating \' character");
2799 next();
2800 break;
2801 case '$':
2802 {
2803 char buf[128], *q;
2804 target_long reg=0;
2805
2806 pch++;
2807 q = buf;
2808 while ((*pch >= 'a' && *pch <= 'z') ||
2809 (*pch >= 'A' && *pch <= 'Z') ||
2810 (*pch >= '0' && *pch <= '9') ||
2811 *pch == '_' || *pch == '.') {
2812 if ((q - buf) < sizeof(buf) - 1)
2813 *q++ = *pch;
2814 pch++;
2815 }
2816 while (qemu_isspace(*pch))
2817 pch++;
2818 *q = 0;
2819 ret = get_monitor_def(®, buf);
2820 if (ret < 0)
2821 expr_error(mon, "unknown register");
2822 n = reg;
2823 }
2824 break;
2825 case '\0':
2826 expr_error(mon, "unexpected end of expression");
2827 n = 0;
2828 break;
2829 default:
2830 errno = 0;
2831 n = strtoull(pch, &p, 0);
2832 if (errno == ERANGE) {
2833 expr_error(mon, "number too large");
2834 }
2835 if (pch == p) {
2836 expr_error(mon, "invalid char '%c' in expression", *p);
2837 }
2838 pch = p;
2839 while (qemu_isspace(*pch))
2840 pch++;
2841 break;
2842 }
2843 return n;
2844}
2845
2846
2847static int64_t expr_prod(Monitor *mon)
2848{
2849 int64_t val, val2;
2850 int op;
2851
2852 val = expr_unary(mon);
2853 for(;;) {
2854 op = *pch;
2855 if (op != '*' && op != '/' && op != '%')
2856 break;
2857 next();
2858 val2 = expr_unary(mon);
2859 switch(op) {
2860 default:
2861 case '*':
2862 val *= val2;
2863 break;
2864 case '/':
2865 case '%':
2866 if (val2 == 0)
2867 expr_error(mon, "division by zero");
2868 if (op == '/')
2869 val /= val2;
2870 else
2871 val %= val2;
2872 break;
2873 }
2874 }
2875 return val;
2876}
2877
2878static int64_t expr_logic(Monitor *mon)
2879{
2880 int64_t val, val2;
2881 int op;
2882
2883 val = expr_prod(mon);
2884 for(;;) {
2885 op = *pch;
2886 if (op != '&' && op != '|' && op != '^')
2887 break;
2888 next();
2889 val2 = expr_prod(mon);
2890 switch(op) {
2891 default:
2892 case '&':
2893 val &= val2;
2894 break;
2895 case '|':
2896 val |= val2;
2897 break;
2898 case '^':
2899 val ^= val2;
2900 break;
2901 }
2902 }
2903 return val;
2904}
2905
2906static int64_t expr_sum(Monitor *mon)
2907{
2908 int64_t val, val2;
2909 int op;
2910
2911 val = expr_logic(mon);
2912 for(;;) {
2913 op = *pch;
2914 if (op != '+' && op != '-')
2915 break;
2916 next();
2917 val2 = expr_logic(mon);
2918 if (op == '+')
2919 val += val2;
2920 else
2921 val -= val2;
2922 }
2923 return val;
2924}
2925
2926static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
2927{
2928 pch = *pp;
2929 if (sigsetjmp(expr_env, 0)) {
2930 *pp = pch;
2931 return -1;
2932 }
2933 while (qemu_isspace(*pch))
2934 pch++;
2935 *pval = expr_sum(mon);
2936 *pp = pch;
2937 return 0;
2938}
2939
2940static int get_double(Monitor *mon, double *pval, const char **pp)
2941{
2942 const char *p = *pp;
2943 char *tailp;
2944 double d;
2945
2946 d = strtod(p, &tailp);
2947 if (tailp == p) {
2948 monitor_printf(mon, "Number expected\n");
2949 return -1;
2950 }
2951 if (d != d || d - d != 0) {
2952
2953 monitor_printf(mon, "Bad number\n");
2954 return -1;
2955 }
2956 *pval = d;
2957 *pp = tailp;
2958 return 0;
2959}
2960
2961
2962
2963
2964
2965static const char *get_command_name(const char *cmdline,
2966 char *cmdname, size_t nlen)
2967{
2968 size_t len;
2969 const char *p, *pstart;
2970
2971 p = cmdline;
2972 while (qemu_isspace(*p))
2973 p++;
2974 if (*p == '\0')
2975 return NULL;
2976 pstart = p;
2977 while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2978 p++;
2979 len = p - pstart;
2980 if (len > nlen - 1)
2981 len = nlen - 1;
2982 memcpy(cmdname, pstart, len);
2983 cmdname[len] = '\0';
2984 return p;
2985}
2986
2987
2988
2989
2990
2991static char *key_get_info(const char *type, char **key)
2992{
2993 size_t len;
2994 char *p, *str;
2995
2996 if (*type == ',')
2997 type++;
2998
2999 p = strchr(type, ':');
3000 if (!p) {
3001 *key = NULL;
3002 return NULL;
3003 }
3004 len = p - type;
3005
3006 str = g_malloc(len + 1);
3007 memcpy(str, type, len);
3008 str[len] = '\0';
3009
3010 *key = str;
3011 return ++p;
3012}
3013
3014static int default_fmt_format = 'x';
3015static int default_fmt_size = 4;
3016
3017static int is_valid_option(const char *c, const char *typestr)
3018{
3019 char option[3];
3020
3021 option[0] = '-';
3022 option[1] = *c;
3023 option[2] = '\0';
3024
3025 typestr = strstr(typestr, option);
3026 return (typestr != NULL);
3027}
3028
3029static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
3030 const char *cmdname)
3031{
3032 const mon_cmd_t *cmd;
3033
3034 for (cmd = disp_table; cmd->name != NULL; cmd++) {
3035 if (compare_cmd(cmdname, cmd->name)) {
3036 return cmd;
3037 }
3038 }
3039
3040 return NULL;
3041}
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053static const mon_cmd_t *monitor_parse_command(Monitor *mon,
3054 const char *cmdp_start,
3055 const char **cmdp,
3056 mon_cmd_t *table)
3057{
3058 const char *p;
3059 const mon_cmd_t *cmd;
3060 char cmdname[256];
3061
3062
3063 p = get_command_name(*cmdp, cmdname, sizeof(cmdname));
3064 if (!p)
3065 return NULL;
3066
3067 cmd = search_dispatch_table(table, cmdname);
3068 if (!cmd) {
3069 monitor_printf(mon, "unknown command: '%.*s'\n",
3070 (int)(p - cmdp_start), cmdp_start);
3071 return NULL;
3072 }
3073 if (runstate_check(RUN_STATE_PRECONFIG) && !cmd_can_preconfig(cmd)) {
3074 monitor_printf(mon, "Command '%.*s' not available with -preconfig "
3075 "until after exit_preconfig.\n",
3076 (int)(p - cmdp_start), cmdp_start);
3077 return NULL;
3078 }
3079
3080
3081 while (qemu_isspace(*p)) {
3082 p++;
3083 }
3084
3085 *cmdp = p;
3086
3087 if (cmd->sub_table != NULL && *p != '\0') {
3088 return monitor_parse_command(mon, cmdp_start, cmdp, cmd->sub_table);
3089 }
3090
3091 return cmd;
3092}
3093
3094
3095
3096
3097
3098
3099
3100
3101static QDict *monitor_parse_arguments(Monitor *mon,
3102 const char **endp,
3103 const mon_cmd_t *cmd)
3104{
3105 const char *typestr;
3106 char *key;
3107 int c;
3108 const char *p = *endp;
3109 char buf[1024];
3110 QDict *qdict = qdict_new();
3111
3112
3113 typestr = cmd->args_type;
3114 for(;;) {
3115 typestr = key_get_info(typestr, &key);
3116 if (!typestr)
3117 break;
3118 c = *typestr;
3119 typestr++;
3120 switch(c) {
3121 case 'F':
3122 case 'B':
3123 case 's':
3124 {
3125 int ret;
3126
3127 while (qemu_isspace(*p))
3128 p++;
3129 if (*typestr == '?') {
3130 typestr++;
3131 if (*p == '\0') {
3132
3133 break;
3134 }
3135 }
3136 ret = get_str(buf, sizeof(buf), &p);
3137 if (ret < 0) {
3138 switch(c) {
3139 case 'F':
3140 monitor_printf(mon, "%s: filename expected\n",
3141 cmd->name);
3142 break;
3143 case 'B':
3144 monitor_printf(mon, "%s: block device name expected\n",
3145 cmd->name);
3146 break;
3147 default:
3148 monitor_printf(mon, "%s: string expected\n", cmd->name);
3149 break;
3150 }
3151 goto fail;
3152 }
3153 qdict_put_str(qdict, key, buf);
3154 }
3155 break;
3156 case 'O':
3157 {
3158 QemuOptsList *opts_list;
3159 QemuOpts *opts;
3160
3161 opts_list = qemu_find_opts(key);
3162 if (!opts_list || opts_list->desc->name) {
3163 goto bad_type;
3164 }
3165 while (qemu_isspace(*p)) {
3166 p++;
3167 }
3168 if (!*p)
3169 break;
3170 if (get_str(buf, sizeof(buf), &p) < 0) {
3171 goto fail;
3172 }
3173 opts = qemu_opts_parse_noisily(opts_list, buf, true);
3174 if (!opts) {
3175 goto fail;
3176 }
3177 qemu_opts_to_qdict(opts, qdict);
3178 qemu_opts_del(opts);
3179 }
3180 break;
3181 case '/':
3182 {
3183 int count, format, size;
3184
3185 while (qemu_isspace(*p))
3186 p++;
3187 if (*p == '/') {
3188
3189 p++;
3190 count = 1;
3191 if (qemu_isdigit(*p)) {
3192 count = 0;
3193 while (qemu_isdigit(*p)) {
3194 count = count * 10 + (*p - '0');
3195 p++;
3196 }
3197 }
3198 size = -1;
3199 format = -1;
3200 for(;;) {
3201 switch(*p) {
3202 case 'o':
3203 case 'd':
3204 case 'u':
3205 case 'x':
3206 case 'i':
3207 case 'c':
3208 format = *p++;
3209 break;
3210 case 'b':
3211 size = 1;
3212 p++;
3213 break;
3214 case 'h':
3215 size = 2;
3216 p++;
3217 break;
3218 case 'w':
3219 size = 4;
3220 p++;
3221 break;
3222 case 'g':
3223 case 'L':
3224 size = 8;
3225 p++;
3226 break;
3227 default:
3228 goto next;
3229 }
3230 }
3231 next:
3232 if (*p != '\0' && !qemu_isspace(*p)) {
3233 monitor_printf(mon, "invalid char in format: '%c'\n",
3234 *p);
3235 goto fail;
3236 }
3237 if (format < 0)
3238 format = default_fmt_format;
3239 if (format != 'i') {
3240
3241 if (size < 0)
3242 size = default_fmt_size;
3243 default_fmt_size = size;
3244 }
3245 default_fmt_format = format;
3246 } else {
3247 count = 1;
3248 format = default_fmt_format;
3249 if (format != 'i') {
3250 size = default_fmt_size;
3251 } else {
3252 size = -1;
3253 }
3254 }
3255 qdict_put_int(qdict, "count", count);
3256 qdict_put_int(qdict, "format", format);
3257 qdict_put_int(qdict, "size", size);
3258 }
3259 break;
3260 case 'i':
3261 case 'l':
3262 case 'M':
3263 {
3264 int64_t val;
3265
3266 while (qemu_isspace(*p))
3267 p++;
3268 if (*typestr == '?' || *typestr == '.') {
3269 if (*typestr == '?') {
3270 if (*p == '\0') {
3271 typestr++;
3272 break;
3273 }
3274 } else {
3275 if (*p == '.') {
3276 p++;
3277 while (qemu_isspace(*p))
3278 p++;
3279 } else {
3280 typestr++;
3281 break;
3282 }
3283 }
3284 typestr++;
3285 }
3286 if (get_expr(mon, &val, &p))
3287 goto fail;
3288
3289 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
3290 monitor_printf(mon, "\'%s\' has failed: ", cmd->name);
3291 monitor_printf(mon, "integer is for 32-bit values\n");
3292 goto fail;
3293 } else if (c == 'M') {
3294 if (val < 0) {
3295 monitor_printf(mon, "enter a positive value\n");
3296 goto fail;
3297 }
3298 val *= MiB;
3299 }
3300 qdict_put_int(qdict, key, val);
3301 }
3302 break;
3303 case 'o':
3304 {
3305 int ret;
3306 uint64_t val;
3307 char *end;
3308
3309 while (qemu_isspace(*p)) {
3310 p++;
3311 }
3312 if (*typestr == '?') {
3313 typestr++;
3314 if (*p == '\0') {
3315 break;
3316 }
3317 }
3318 ret = qemu_strtosz_MiB(p, &end, &val);
3319 if (ret < 0 || val > INT64_MAX) {
3320 monitor_printf(mon, "invalid size\n");
3321 goto fail;
3322 }
3323 qdict_put_int(qdict, key, val);
3324 p = end;
3325 }
3326 break;
3327 case 'T':
3328 {
3329 double val;
3330
3331 while (qemu_isspace(*p))
3332 p++;
3333 if (*typestr == '?') {
3334 typestr++;
3335 if (*p == '\0') {
3336 break;
3337 }
3338 }
3339 if (get_double(mon, &val, &p) < 0) {
3340 goto fail;
3341 }
3342 if (p[0] && p[1] == 's') {
3343 switch (*p) {
3344 case 'm':
3345 val /= 1e3; p += 2; break;
3346 case 'u':
3347 val /= 1e6; p += 2; break;
3348 case 'n':
3349 val /= 1e9; p += 2; break;
3350 }
3351 }
3352 if (*p && !qemu_isspace(*p)) {
3353 monitor_printf(mon, "Unknown unit suffix\n");
3354 goto fail;
3355 }
3356 qdict_put(qdict, key, qnum_from_double(val));
3357 }
3358 break;
3359 case 'b':
3360 {
3361 const char *beg;
3362 bool val;
3363
3364 while (qemu_isspace(*p)) {
3365 p++;
3366 }
3367 beg = p;
3368 while (qemu_isgraph(*p)) {
3369 p++;
3370 }
3371 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
3372 val = true;
3373 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
3374 val = false;
3375 } else {
3376 monitor_printf(mon, "Expected 'on' or 'off'\n");
3377 goto fail;
3378 }
3379 qdict_put_bool(qdict, key, val);
3380 }
3381 break;
3382 case '-':
3383 {
3384 const char *tmp = p;
3385 int skip_key = 0;
3386
3387
3388 c = *typestr++;
3389 if (c == '\0')
3390 goto bad_type;
3391 while (qemu_isspace(*p))
3392 p++;
3393 if (*p == '-') {
3394 p++;
3395 if(c != *p) {
3396 if(!is_valid_option(p, typestr)) {
3397
3398 monitor_printf(mon, "%s: unsupported option -%c\n",
3399 cmd->name, *p);
3400 goto fail;
3401 } else {
3402 skip_key = 1;
3403 }
3404 }
3405 if(skip_key) {
3406 p = tmp;
3407 } else {
3408
3409 p++;
3410 qdict_put_bool(qdict, key, true);
3411 }
3412 }
3413 }
3414 break;
3415 case 'S':
3416 {
3417
3418 int len;
3419
3420 while (qemu_isspace(*p)) {
3421 p++;
3422 }
3423 if (*typestr == '?') {
3424 typestr++;
3425 if (*p == '\0') {
3426
3427 break;
3428 }
3429 }
3430 len = strlen(p);
3431 if (len <= 0) {
3432 monitor_printf(mon, "%s: string expected\n",
3433 cmd->name);
3434 goto fail;
3435 }
3436 qdict_put_str(qdict, key, p);
3437 p += len;
3438 }
3439 break;
3440 default:
3441 bad_type:
3442 monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
3443 goto fail;
3444 }
3445 g_free(key);
3446 key = NULL;
3447 }
3448
3449 while (qemu_isspace(*p))
3450 p++;
3451 if (*p != '\0') {
3452 monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3453 cmd->name);
3454 goto fail;
3455 }
3456
3457 return qdict;
3458
3459fail:
3460 qobject_unref(qdict);
3461 g_free(key);
3462 return NULL;
3463}
3464
3465static void handle_hmp_command(Monitor *mon, const char *cmdline)
3466{
3467 QDict *qdict;
3468 const mon_cmd_t *cmd;
3469 const char *cmd_start = cmdline;
3470
3471 trace_handle_hmp_command(mon, cmdline);
3472
3473 cmd = monitor_parse_command(mon, cmdline, &cmdline, mon->cmd_table);
3474 if (!cmd) {
3475 return;
3476 }
3477
3478 qdict = monitor_parse_arguments(mon, &cmdline, cmd);
3479 if (!qdict) {
3480 while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
3481 cmdline--;
3482 }
3483 monitor_printf(mon, "Try \"help %.*s\" for more information\n",
3484 (int)(cmdline - cmd_start), cmd_start);
3485 return;
3486 }
3487
3488 cmd->cmd(mon, qdict);
3489 qobject_unref(qdict);
3490}
3491
3492static void cmd_completion(Monitor *mon, const char *name, const char *list)
3493{
3494 const char *p, *pstart;
3495 char cmd[128];
3496 int len;
3497
3498 p = list;
3499 for(;;) {
3500 pstart = p;
3501 p = qemu_strchrnul(p, '|');
3502 len = p - pstart;
3503 if (len > sizeof(cmd) - 2)
3504 len = sizeof(cmd) - 2;
3505 memcpy(cmd, pstart, len);
3506 cmd[len] = '\0';
3507 if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3508 readline_add_completion(mon->rs, cmd);
3509 }
3510 if (*p == '\0')
3511 break;
3512 p++;
3513 }
3514}
3515
3516static void file_completion(Monitor *mon, const char *input)
3517{
3518 DIR *ffs;
3519 struct dirent *d;
3520 char path[1024];
3521 char file[1024], file_prefix[1024];
3522 int input_path_len;
3523 const char *p;
3524
3525 p = strrchr(input, '/');
3526 if (!p) {
3527 input_path_len = 0;
3528 pstrcpy(file_prefix, sizeof(file_prefix), input);
3529 pstrcpy(path, sizeof(path), ".");
3530 } else {
3531 input_path_len = p - input + 1;
3532 memcpy(path, input, input_path_len);
3533 if (input_path_len > sizeof(path) - 1)
3534 input_path_len = sizeof(path) - 1;
3535 path[input_path_len] = '\0';
3536 pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3537 }
3538
3539 ffs = opendir(path);
3540 if (!ffs)
3541 return;
3542 for(;;) {
3543 struct stat sb;
3544 d = readdir(ffs);
3545 if (!d)
3546 break;
3547
3548 if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
3549 continue;
3550 }
3551
3552 if (strstart(d->d_name, file_prefix, NULL)) {
3553 memcpy(file, input, input_path_len);
3554 if (input_path_len < sizeof(file))
3555 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3556 d->d_name);
3557
3558
3559
3560 if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) {
3561 pstrcat(file, sizeof(file), "/");
3562 }
3563 readline_add_completion(mon->rs, file);
3564 }
3565 }
3566 closedir(ffs);
3567}
3568
3569static const char *next_arg_type(const char *typestr)
3570{
3571 const char *p = strchr(typestr, ':');
3572 return (p != NULL ? ++p : typestr);
3573}
3574
3575static void add_completion_option(ReadLineState *rs, const char *str,
3576 const char *option)
3577{
3578 if (!str || !option) {
3579 return;
3580 }
3581 if (!strncmp(option, str, strlen(str))) {
3582 readline_add_completion(rs, option);
3583 }
3584}
3585
3586void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str)
3587{
3588 size_t len;
3589 ChardevBackendInfoList *list, *start;
3590
3591 if (nb_args != 2) {
3592 return;
3593 }
3594 len = strlen(str);
3595 readline_set_completion_index(rs, len);
3596
3597 start = list = qmp_query_chardev_backends(NULL);
3598 while (list) {
3599 const char *chr_name = list->value->name;
3600
3601 if (!strncmp(chr_name, str, len)) {
3602 readline_add_completion(rs, chr_name);
3603 }
3604 list = list->next;
3605 }
3606 qapi_free_ChardevBackendInfoList(start);
3607}
3608
3609void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str)
3610{
3611 size_t len;
3612 int i;
3613
3614 if (nb_args != 2) {
3615 return;
3616 }
3617 len = strlen(str);
3618 readline_set_completion_index(rs, len);
3619 for (i = 0; i < NET_CLIENT_DRIVER__MAX; i++) {
3620 add_completion_option(rs, str, NetClientDriver_str(i));
3621 }
3622}
3623
3624void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
3625{
3626 GSList *list, *elt;
3627 size_t len;
3628
3629 if (nb_args != 2) {
3630 return;
3631 }
3632
3633 len = strlen(str);
3634 readline_set_completion_index(rs, len);
3635 list = elt = object_class_get_list(TYPE_DEVICE, false);
3636 while (elt) {
3637 const char *name;
3638 DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
3639 TYPE_DEVICE);
3640 name = object_class_get_name(OBJECT_CLASS(dc));
3641
3642 if (dc->user_creatable
3643 && !strncmp(name, str, len)) {
3644 readline_add_completion(rs, name);
3645 }
3646 elt = elt->next;
3647 }
3648 g_slist_free(list);
3649}
3650
3651void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
3652{
3653 GSList *list, *elt;
3654 size_t len;
3655
3656 if (nb_args != 2) {
3657 return;
3658 }
3659
3660 len = strlen(str);
3661 readline_set_completion_index(rs, len);
3662 list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
3663 while (elt) {
3664 const char *name;
3665
3666 name = object_class_get_name(OBJECT_CLASS(elt->data));
3667 if (!strncmp(name, str, len) && strcmp(name, TYPE_USER_CREATABLE)) {
3668 readline_add_completion(rs, name);
3669 }
3670 elt = elt->next;
3671 }
3672 g_slist_free(list);
3673}
3674
3675static void peripheral_device_del_completion(ReadLineState *rs,
3676 const char *str, size_t len)
3677{
3678 Object *peripheral = container_get(qdev_get_machine(), "/peripheral");
3679 GSList *list, *item;
3680
3681 list = qdev_build_hotpluggable_device_list(peripheral);
3682 if (!list) {
3683 return;
3684 }
3685
3686 for (item = list; item; item = g_slist_next(item)) {
3687 DeviceState *dev = item->data;
3688
3689 if (dev->id && !strncmp(str, dev->id, len)) {
3690 readline_add_completion(rs, dev->id);
3691 }
3692 }
3693
3694 g_slist_free(list);
3695}
3696
3697void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)
3698{
3699 size_t len;
3700 ChardevInfoList *list, *start;
3701
3702 if (nb_args != 2) {
3703 return;
3704 }
3705 len = strlen(str);
3706 readline_set_completion_index(rs, len);
3707
3708 start = list = qmp_query_chardev(NULL);
3709 while (list) {
3710 ChardevInfo *chr = list->value;
3711
3712 if (!strncmp(chr->label, str, len)) {
3713 readline_add_completion(rs, chr->label);
3714 }
3715 list = list->next;
3716 }
3717 qapi_free_ChardevInfoList(start);
3718}
3719
3720static void ringbuf_completion(ReadLineState *rs, const char *str)
3721{
3722 size_t len;
3723 ChardevInfoList *list, *start;
3724
3725 len = strlen(str);
3726 readline_set_completion_index(rs, len);
3727
3728 start = list = qmp_query_chardev(NULL);
3729 while (list) {
3730 ChardevInfo *chr_info = list->value;
3731
3732 if (!strncmp(chr_info->label, str, len)) {
3733 Chardev *chr = qemu_chr_find(chr_info->label);
3734 if (chr && CHARDEV_IS_RINGBUF(chr)) {
3735 readline_add_completion(rs, chr_info->label);
3736 }
3737 }
3738 list = list->next;
3739 }
3740 qapi_free_ChardevInfoList(start);
3741}
3742
3743void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str)
3744{
3745 if (nb_args != 2) {
3746 return;
3747 }
3748 ringbuf_completion(rs, str);
3749}
3750
3751void device_del_completion(ReadLineState *rs, int nb_args, const char *str)
3752{
3753 size_t len;
3754
3755 if (nb_args != 2) {
3756 return;
3757 }
3758
3759 len = strlen(str);
3760 readline_set_completion_index(rs, len);
3761 peripheral_device_del_completion(rs, str, len);
3762}
3763
3764void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
3765{
3766 ObjectPropertyInfoList *list, *start;
3767 size_t len;
3768
3769 if (nb_args != 2) {
3770 return;
3771 }
3772 len = strlen(str);
3773 readline_set_completion_index(rs, len);
3774
3775 start = list = qmp_qom_list("/objects", NULL);
3776 while (list) {
3777 ObjectPropertyInfo *info = list->value;
3778
3779 if (!strncmp(info->type, "child<", 5)
3780 && !strncmp(info->name, str, len)) {
3781 readline_add_completion(rs, info->name);
3782 }
3783 list = list->next;
3784 }
3785 qapi_free_ObjectPropertyInfoList(start);
3786}
3787
3788void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
3789{
3790 int i;
3791 char *sep;
3792 size_t len;
3793
3794 if (nb_args != 2) {
3795 return;
3796 }
3797 sep = strrchr(str, '-');
3798 if (sep) {
3799 str = sep + 1;
3800 }
3801 len = strlen(str);
3802 readline_set_completion_index(rs, len);
3803 for (i = 0; i < Q_KEY_CODE__MAX; i++) {
3804 if (!strncmp(str, QKeyCode_str(i), len)) {
3805 readline_add_completion(rs, QKeyCode_str(i));
3806 }
3807 }
3808}
3809
3810void set_link_completion(ReadLineState *rs, int nb_args, const char *str)
3811{
3812 size_t len;
3813
3814 len = strlen(str);
3815 readline_set_completion_index(rs, len);
3816 if (nb_args == 2) {
3817 NetClientState *ncs[MAX_QUEUE_NUM];
3818 int count, i;
3819 count = qemu_find_net_clients_except(NULL, ncs,
3820 NET_CLIENT_DRIVER_NONE,
3821 MAX_QUEUE_NUM);
3822 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3823 const char *name = ncs[i]->name;
3824 if (!strncmp(str, name, len)) {
3825 readline_add_completion(rs, name);
3826 }
3827 }
3828 } else if (nb_args == 3) {
3829 add_completion_option(rs, str, "on");
3830 add_completion_option(rs, str, "off");
3831 }
3832}
3833
3834void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str)
3835{
3836 int len, count, i;
3837 NetClientState *ncs[MAX_QUEUE_NUM];
3838
3839 if (nb_args != 2) {
3840 return;
3841 }
3842
3843 len = strlen(str);
3844 readline_set_completion_index(rs, len);
3845 count = qemu_find_net_clients_except(NULL, ncs, NET_CLIENT_DRIVER_NIC,
3846 MAX_QUEUE_NUM);
3847 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3848 QemuOpts *opts;
3849 const char *name = ncs[i]->name;
3850 if (strncmp(str, name, len)) {
3851 continue;
3852 }
3853 opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), name);
3854 if (opts) {
3855 readline_add_completion(rs, name);
3856 }
3857 }
3858}
3859
3860void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *str)
3861{
3862 size_t len;
3863
3864 len = strlen(str);
3865 readline_set_completion_index(rs, len);
3866 if (nb_args == 2) {
3867 TraceEventIter iter;
3868 TraceEvent *ev;
3869 char *pattern = g_strdup_printf("%s*", str);
3870 trace_event_iter_init(&iter, pattern);
3871 while ((ev = trace_event_iter_next(&iter)) != NULL) {
3872 readline_add_completion(rs, trace_event_get_name(ev));
3873 }
3874 g_free(pattern);
3875 }
3876}
3877
3878void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
3879{
3880 size_t len;
3881
3882 len = strlen(str);
3883 readline_set_completion_index(rs, len);
3884 if (nb_args == 2) {
3885 TraceEventIter iter;
3886 TraceEvent *ev;
3887 char *pattern = g_strdup_printf("%s*", str);
3888 trace_event_iter_init(&iter, pattern);
3889 while ((ev = trace_event_iter_next(&iter)) != NULL) {
3890 readline_add_completion(rs, trace_event_get_name(ev));
3891 }
3892 g_free(pattern);
3893 } else if (nb_args == 3) {
3894 add_completion_option(rs, str, "on");
3895 add_completion_option(rs, str, "off");
3896 }
3897}
3898
3899void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
3900{
3901 int i;
3902
3903 if (nb_args != 2) {
3904 return;
3905 }
3906 readline_set_completion_index(rs, strlen(str));
3907 for (i = 0; i < WATCHDOG_ACTION__MAX; i++) {
3908 add_completion_option(rs, str, WatchdogAction_str(i));
3909 }
3910}
3911
3912void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
3913 const char *str)
3914{
3915 size_t len;
3916
3917 len = strlen(str);
3918 readline_set_completion_index(rs, len);
3919 if (nb_args == 2) {
3920 int i;
3921 for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
3922 const char *name = MigrationCapability_str(i);
3923 if (!strncmp(str, name, len)) {
3924 readline_add_completion(rs, name);
3925 }
3926 }
3927 } else if (nb_args == 3) {
3928 add_completion_option(rs, str, "on");
3929 add_completion_option(rs, str, "off");
3930 }
3931}
3932
3933void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
3934 const char *str)
3935{
3936 size_t len;
3937
3938 len = strlen(str);
3939 readline_set_completion_index(rs, len);
3940 if (nb_args == 2) {
3941 int i;
3942 for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
3943 const char *name = MigrationParameter_str(i);
3944 if (!strncmp(str, name, len)) {
3945 readline_add_completion(rs, name);
3946 }
3947 }
3948 }
3949}
3950
3951static void vm_completion(ReadLineState *rs, const char *str)
3952{
3953 size_t len;
3954 BlockDriverState *bs;
3955 BdrvNextIterator it;
3956
3957 len = strlen(str);
3958 readline_set_completion_index(rs, len);
3959
3960 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
3961 SnapshotInfoList *snapshots, *snapshot;
3962 AioContext *ctx = bdrv_get_aio_context(bs);
3963 bool ok = false;
3964
3965 aio_context_acquire(ctx);
3966 if (bdrv_can_snapshot(bs)) {
3967 ok = bdrv_query_snapshot_info_list(bs, &snapshots, NULL) == 0;
3968 }
3969 aio_context_release(ctx);
3970 if (!ok) {
3971 continue;
3972 }
3973
3974 snapshot = snapshots;
3975 while (snapshot) {
3976 char *completion = snapshot->value->name;
3977 if (!strncmp(str, completion, len)) {
3978 readline_add_completion(rs, completion);
3979 }
3980 completion = snapshot->value->id;
3981 if (!strncmp(str, completion, len)) {
3982 readline_add_completion(rs, completion);
3983 }
3984 snapshot = snapshot->next;
3985 }
3986 qapi_free_SnapshotInfoList(snapshots);
3987 }
3988
3989}
3990
3991void delvm_completion(ReadLineState *rs, int nb_args, const char *str)
3992{
3993 if (nb_args == 2) {
3994 vm_completion(rs, str);
3995 }
3996}
3997
3998void loadvm_completion(ReadLineState *rs, int nb_args, const char *str)
3999{
4000 if (nb_args == 2) {
4001 vm_completion(rs, str);
4002 }
4003}
4004
4005static void monitor_find_completion_by_table(Monitor *mon,
4006 const mon_cmd_t *cmd_table,
4007 char **args,
4008 int nb_args)
4009{
4010 const char *cmdname;
4011 int i;
4012 const char *ptype, *old_ptype, *str, *name;
4013 const mon_cmd_t *cmd;
4014 BlockBackend *blk = NULL;
4015
4016 if (nb_args <= 1) {
4017
4018 if (nb_args == 0)
4019 cmdname = "";
4020 else
4021 cmdname = args[0];
4022 readline_set_completion_index(mon->rs, strlen(cmdname));
4023 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
4024 if (!runstate_check(RUN_STATE_PRECONFIG) ||
4025 cmd_can_preconfig(cmd)) {
4026 cmd_completion(mon, cmdname, cmd->name);
4027 }
4028 }
4029 } else {
4030
4031 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
4032 if (compare_cmd(args[0], cmd->name) &&
4033 (!runstate_check(RUN_STATE_PRECONFIG) ||
4034 cmd_can_preconfig(cmd))) {
4035 break;
4036 }
4037 }
4038 if (!cmd->name) {
4039 return;
4040 }
4041
4042 if (cmd->sub_table) {
4043
4044 monitor_find_completion_by_table(mon, cmd->sub_table,
4045 &args[1], nb_args - 1);
4046 return;
4047 }
4048 if (cmd->command_completion) {
4049 cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
4050 return;
4051 }
4052
4053 ptype = next_arg_type(cmd->args_type);
4054 for(i = 0; i < nb_args - 2; i++) {
4055 if (*ptype != '\0') {
4056 ptype = next_arg_type(ptype);
4057 while (*ptype == '?')
4058 ptype = next_arg_type(ptype);
4059 }
4060 }
4061 str = args[nb_args - 1];
4062 old_ptype = NULL;
4063 while (*ptype == '-' && old_ptype != ptype) {
4064 old_ptype = ptype;
4065 ptype = next_arg_type(ptype);
4066 }
4067 switch(*ptype) {
4068 case 'F':
4069
4070 readline_set_completion_index(mon->rs, strlen(str));
4071 file_completion(mon, str);
4072 break;
4073 case 'B':
4074
4075 readline_set_completion_index(mon->rs, strlen(str));
4076 while ((blk = blk_next(blk)) != NULL) {
4077 name = blk_name(blk);
4078 if (str[0] == '\0' ||
4079 !strncmp(name, str, strlen(str))) {
4080 readline_add_completion(mon->rs, name);
4081 }
4082 }
4083 break;
4084 case 's':
4085 case 'S':
4086 if (!strcmp(cmd->name, "help|?")) {
4087 monitor_find_completion_by_table(mon, cmd_table,
4088 &args[1], nb_args - 1);
4089 }
4090 break;
4091 default:
4092 break;
4093 }
4094 }
4095}
4096
4097static void monitor_find_completion(void *opaque,
4098 const char *cmdline)
4099{
4100 Monitor *mon = opaque;
4101 char *args[MAX_ARGS];
4102 int nb_args, len;
4103
4104
4105 if (parse_cmdline(cmdline, &nb_args, args) < 0) {
4106 return;
4107 }
4108
4109
4110
4111 len = strlen(cmdline);
4112 if (len > 0 && qemu_isspace(cmdline[len - 1])) {
4113 if (nb_args >= MAX_ARGS) {
4114 goto cleanup;
4115 }
4116 args[nb_args++] = g_strdup("");
4117 }
4118
4119
4120 monitor_find_completion_by_table(mon, mon->cmd_table, args, nb_args);
4121
4122cleanup:
4123 free_cmdline_args(args, nb_args);
4124}
4125
4126static int monitor_can_read(void *opaque)
4127{
4128 Monitor *mon = opaque;
4129
4130 return !atomic_mb_read(&mon->suspend_cnt);
4131}
4132
4133
4134
4135
4136
4137
4138static void monitor_qmp_respond(Monitor *mon, QDict *rsp, QObject *id)
4139{
4140 if (rsp) {
4141 if (id) {
4142 qdict_put_obj(rsp, "id", qobject_ref(id));
4143 }
4144
4145 qmp_queue_response(mon, rsp);
4146 }
4147}
4148
4149static void monitor_qmp_dispatch(Monitor *mon, QObject *req, QObject *id)
4150{
4151 Monitor *old_mon;
4152 QDict *rsp;
4153 QDict *error;
4154
4155 old_mon = cur_mon;
4156 cur_mon = mon;
4157
4158 rsp = qmp_dispatch(mon->qmp.commands, req, qmp_oob_enabled(mon));
4159
4160 cur_mon = old_mon;
4161
4162 if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
4163 error = qdict_get_qdict(rsp, "error");
4164 if (error
4165 && !g_strcmp0(qdict_get_try_str(error, "class"),
4166 QapiErrorClass_str(ERROR_CLASS_COMMAND_NOT_FOUND))) {
4167
4168 qdict_del(error, "desc");
4169 qdict_put_str(error, "desc", "Expecting capabilities negotiation"
4170 " with 'qmp_capabilities'");
4171 }
4172 }
4173
4174 monitor_qmp_respond(mon, rsp, id);
4175 qobject_unref(rsp);
4176}
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186static QMPRequest *monitor_qmp_requests_pop_any(void)
4187{
4188 QMPRequest *req_obj = NULL;
4189 Monitor *mon;
4190
4191 qemu_mutex_lock(&monitor_lock);
4192
4193 QTAILQ_FOREACH(mon, &mon_list, entry) {
4194 qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
4195 req_obj = g_queue_pop_head(mon->qmp.qmp_requests);
4196 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
4197 if (req_obj) {
4198 break;
4199 }
4200 }
4201
4202 if (req_obj) {
4203
4204
4205
4206
4207 QTAILQ_REMOVE(&mon_list, mon, entry);
4208 QTAILQ_INSERT_TAIL(&mon_list, mon, entry);
4209 }
4210
4211 qemu_mutex_unlock(&monitor_lock);
4212
4213 return req_obj;
4214}
4215
4216static void monitor_qmp_bh_dispatcher(void *data)
4217{
4218 QMPRequest *req_obj = monitor_qmp_requests_pop_any();
4219 QDict *rsp;
4220
4221 if (!req_obj) {
4222 return;
4223 }
4224
4225 if (req_obj->req) {
4226 trace_monitor_qmp_cmd_in_band(qobject_get_try_str(req_obj->id) ?: "");
4227 monitor_qmp_dispatch(req_obj->mon, req_obj->req, req_obj->id);
4228 } else {
4229 assert(req_obj->err);
4230 rsp = qmp_error_response(req_obj->err);
4231 req_obj->err = NULL;
4232 monitor_qmp_respond(req_obj->mon, rsp, NULL);
4233 qobject_unref(rsp);
4234 }
4235
4236 if (req_obj->need_resume) {
4237
4238 monitor_resume(req_obj->mon);
4239 }
4240 qmp_request_free(req_obj);
4241
4242
4243 qemu_bh_schedule(qmp_dispatcher_bh);
4244}
4245
4246#define QMP_REQ_QUEUE_LEN_MAX (8)
4247
4248static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
4249{
4250 QObject *req, *id = NULL;
4251 QDict *qdict;
4252 MonitorQMP *mon_qmp = container_of(parser, MonitorQMP, parser);
4253 Monitor *mon = container_of(mon_qmp, Monitor, qmp);
4254 Error *err = NULL;
4255 QMPRequest *req_obj;
4256
4257 req = json_parser_parse_err(tokens, NULL, &err);
4258 if (!req && !err) {
4259
4260 error_setg(&err, QERR_JSON_PARSING);
4261 }
4262
4263 qdict = qobject_to(QDict, req);
4264 if (qdict) {
4265 id = qobject_ref(qdict_get(qdict, "id"));
4266 qdict_del(qdict, "id");
4267 }
4268
4269 if (req && trace_event_get_state_backends(TRACE_HANDLE_QMP_COMMAND)) {
4270 QString *req_json = qobject_to_json(req);
4271 trace_handle_qmp_command(mon, qstring_get_str(req_json));
4272 qobject_unref(req_json);
4273 }
4274
4275 if (qdict && qmp_is_oob(qdict)) {
4276
4277 trace_monitor_qmp_cmd_out_of_band(qobject_get_try_str(id)
4278 ?: "");
4279 monitor_qmp_dispatch(mon, req, id);
4280 qobject_unref(req);
4281 qobject_unref(id);
4282 return;
4283 }
4284
4285 req_obj = g_new0(QMPRequest, 1);
4286 req_obj->mon = mon;
4287 req_obj->id = id;
4288 req_obj->req = req;
4289 req_obj->err = err;
4290 req_obj->need_resume = false;
4291
4292
4293 qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
4294
4295
4296
4297
4298
4299
4300
4301 if (!qmp_oob_enabled(mon)) {
4302 monitor_suspend(mon);
4303 req_obj->need_resume = true;
4304 } else {
4305
4306 if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX) {
4307 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
4308
4309
4310
4311
4312
4313
4314 qapi_event_send_command_dropped(id,
4315 COMMAND_DROP_REASON_QUEUE_FULL,
4316 &error_abort);
4317 qmp_request_free(req_obj);
4318 return;
4319 }
4320 }
4321
4322
4323
4324
4325
4326
4327 g_queue_push_tail(mon->qmp.qmp_requests, req_obj);
4328 qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
4329
4330
4331 qemu_bh_schedule(qmp_dispatcher_bh);
4332}
4333
4334static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size)
4335{
4336 Monitor *mon = opaque;
4337
4338 json_message_parser_feed(&mon->qmp.parser, (const char *) buf, size);
4339}
4340
4341static void monitor_read(void *opaque, const uint8_t *buf, int size)
4342{
4343 Monitor *old_mon = cur_mon;
4344 int i;
4345
4346 cur_mon = opaque;
4347
4348 if (cur_mon->rs) {
4349 for (i = 0; i < size; i++)
4350 readline_handle_byte(cur_mon->rs, buf[i]);
4351 } else {
4352 if (size == 0 || buf[size - 1] != 0)
4353 monitor_printf(cur_mon, "corrupted command\n");
4354 else
4355 handle_hmp_command(cur_mon, (char *)buf);
4356 }
4357
4358 cur_mon = old_mon;
4359}
4360
4361static void monitor_command_cb(void *opaque, const char *cmdline,
4362 void *readline_opaque)
4363{
4364 Monitor *mon = opaque;
4365
4366 monitor_suspend(mon);
4367 handle_hmp_command(mon, cmdline);
4368 monitor_resume(mon);
4369}
4370
4371int monitor_suspend(Monitor *mon)
4372{
4373 if (monitor_is_hmp_non_interactive(mon)) {
4374 return -ENOTTY;
4375 }
4376
4377 atomic_inc(&mon->suspend_cnt);
4378
4379 if (monitor_is_qmp(mon)) {
4380
4381
4382
4383
4384 aio_notify(iothread_get_aio_context(mon_iothread));
4385 }
4386
4387 trace_monitor_suspend(mon, 1);
4388 return 0;
4389}
4390
4391void monitor_resume(Monitor *mon)
4392{
4393 if (monitor_is_hmp_non_interactive(mon)) {
4394 return;
4395 }
4396
4397 if (atomic_dec_fetch(&mon->suspend_cnt) == 0) {
4398 if (monitor_is_qmp(mon)) {
4399
4400
4401
4402
4403 if (mon->use_io_thread) {
4404 aio_notify(iothread_get_aio_context(mon_iothread));
4405 }
4406 } else {
4407 assert(mon->rs);
4408 readline_show_prompt(mon->rs);
4409 }
4410 }
4411 trace_monitor_suspend(mon, -1);
4412}
4413
4414static QDict *qmp_greeting(Monitor *mon)
4415{
4416 QList *cap_list = qlist_new();
4417 QObject *ver = NULL;
4418 QMPCapability cap;
4419
4420 qmp_marshal_query_version(NULL, &ver, NULL);
4421
4422 for (cap = 0; cap < QMP_CAPABILITY__MAX; cap++) {
4423 if (mon->qmp.capab_offered[cap]) {
4424 qlist_append_str(cap_list, QMPCapability_str(cap));
4425 }
4426 }
4427
4428 return qdict_from_jsonf_nofail(
4429 "{'QMP': {'version': %p, 'capabilities': %p}}",
4430 ver, cap_list);
4431}
4432
4433static void monitor_qmp_event(void *opaque, int event)
4434{
4435 QDict *data;
4436 Monitor *mon = opaque;
4437
4438 switch (event) {
4439 case CHR_EVENT_OPENED:
4440 mon->qmp.commands = &qmp_cap_negotiation_commands;
4441 monitor_qmp_caps_reset(mon);
4442 data = qmp_greeting(mon);
4443 qmp_queue_response(mon, data);
4444 qobject_unref(data);
4445 mon_refcount++;
4446 break;
4447 case CHR_EVENT_CLOSED:
4448
4449
4450
4451
4452
4453
4454 monitor_qmp_response_flush(mon);
4455 monitor_qmp_cleanup_queues(mon);
4456 json_message_parser_destroy(&mon->qmp.parser);
4457 json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
4458 mon_refcount--;
4459 monitor_fdsets_cleanup();
4460 break;
4461 }
4462}
4463
4464static void monitor_event(void *opaque, int event)
4465{
4466 Monitor *mon = opaque;
4467
4468 switch (event) {
4469 case CHR_EVENT_MUX_IN:
4470 qemu_mutex_lock(&mon->mon_lock);
4471 mon->mux_out = 0;
4472 qemu_mutex_unlock(&mon->mon_lock);
4473 if (mon->reset_seen) {
4474 readline_restart(mon->rs);
4475 monitor_resume(mon);
4476 monitor_flush(mon);
4477 } else {
4478 atomic_mb_set(&mon->suspend_cnt, 0);
4479 }
4480 break;
4481
4482 case CHR_EVENT_MUX_OUT:
4483 if (mon->reset_seen) {
4484 if (atomic_mb_read(&mon->suspend_cnt) == 0) {
4485 monitor_printf(mon, "\n");
4486 }
4487 monitor_flush(mon);
4488 monitor_suspend(mon);
4489 } else {
4490 atomic_inc(&mon->suspend_cnt);
4491 }
4492 qemu_mutex_lock(&mon->mon_lock);
4493 mon->mux_out = 1;
4494 qemu_mutex_unlock(&mon->mon_lock);
4495 break;
4496
4497 case CHR_EVENT_OPENED:
4498 monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4499 "information\n", QEMU_VERSION);
4500 if (!mon->mux_out) {
4501 readline_restart(mon->rs);
4502 readline_show_prompt(mon->rs);
4503 }
4504 mon->reset_seen = 1;
4505 mon_refcount++;
4506 break;
4507
4508 case CHR_EVENT_CLOSED:
4509 mon_refcount--;
4510 monitor_fdsets_cleanup();
4511 break;
4512 }
4513}
4514
4515static int
4516compare_mon_cmd(const void *a, const void *b)
4517{
4518 return strcmp(((const mon_cmd_t *)a)->name,
4519 ((const mon_cmd_t *)b)->name);
4520}
4521
4522static void sortcmdlist(void)
4523{
4524 int array_num;
4525 int elem_size = sizeof(mon_cmd_t);
4526
4527 array_num = sizeof(mon_cmds)/elem_size-1;
4528 qsort((void *)mon_cmds, array_num, elem_size, compare_mon_cmd);
4529
4530 array_num = sizeof(info_cmds)/elem_size-1;
4531 qsort((void *)info_cmds, array_num, elem_size, compare_mon_cmd);
4532}
4533
4534static GMainContext *monitor_get_io_context(void)
4535{
4536 return iothread_get_g_main_context(mon_iothread);
4537}
4538
4539static AioContext *monitor_get_aio_context(void)
4540{
4541 return iothread_get_aio_context(mon_iothread);
4542}
4543
4544static void monitor_iothread_init(void)
4545{
4546 mon_iothread = iothread_create("mon_iothread", &error_abort);
4547
4548
4549
4550
4551
4552
4553 qmp_dispatcher_bh = aio_bh_new(iohandler_get_aio_context(),
4554 monitor_qmp_bh_dispatcher,
4555 NULL);
4556
4557
4558
4559
4560
4561
4562 qmp_respond_bh = aio_bh_new(monitor_get_aio_context(),
4563 monitor_qmp_bh_responder,
4564 NULL);
4565}
4566
4567void monitor_init_globals(void)
4568{
4569 monitor_init_qmp_commands();
4570 monitor_qapi_event_init();
4571 sortcmdlist();
4572 qemu_mutex_init(&monitor_lock);
4573 qemu_mutex_init(&mon_fdsets_lock);
4574 monitor_iothread_init();
4575}
4576
4577
4578
4579
4580static void GCC_FMT_ATTR(2, 3) monitor_readline_printf(void *opaque,
4581 const char *fmt, ...)
4582{
4583 va_list ap;
4584 va_start(ap, fmt);
4585 monitor_vprintf(opaque, fmt, ap);
4586 va_end(ap);
4587}
4588
4589static void monitor_readline_flush(void *opaque)
4590{
4591 monitor_flush(opaque);
4592}
4593
4594
4595
4596
4597
4598
4599void error_vprintf(const char *fmt, va_list ap)
4600{
4601 if (cur_mon && !monitor_cur_is_qmp()) {
4602 monitor_vprintf(cur_mon, fmt, ap);
4603 } else {
4604 vfprintf(stderr, fmt, ap);
4605 }
4606}
4607
4608void error_vprintf_unless_qmp(const char *fmt, va_list ap)
4609{
4610 if (cur_mon && !monitor_cur_is_qmp()) {
4611 monitor_vprintf(cur_mon, fmt, ap);
4612 } else if (!cur_mon) {
4613 vfprintf(stderr, fmt, ap);
4614 }
4615}
4616
4617static void monitor_list_append(Monitor *mon)
4618{
4619 qemu_mutex_lock(&monitor_lock);
4620 QTAILQ_INSERT_HEAD(&mon_list, mon, entry);
4621 qemu_mutex_unlock(&monitor_lock);
4622}
4623
4624static void monitor_qmp_setup_handlers_bh(void *opaque)
4625{
4626 Monitor *mon = opaque;
4627 GMainContext *context;
4628
4629 if (mon->use_io_thread) {
4630
4631 context = monitor_get_io_context();
4632 assert(context);
4633 } else {
4634
4635 context = NULL;
4636 }
4637
4638 qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_read,
4639 monitor_qmp_event, NULL, mon, context, true);
4640 monitor_list_append(mon);
4641}
4642
4643void monitor_init(Chardev *chr, int flags)
4644{
4645 Monitor *mon = g_malloc(sizeof(*mon));
4646 bool use_readline = flags & MONITOR_USE_READLINE;
4647 bool use_oob = flags & MONITOR_USE_OOB;
4648
4649 if (use_oob) {
4650 if (CHARDEV_IS_MUX(chr)) {
4651 error_report("Monitor out-of-band is not supported with "
4652 "MUX typed chardev backend");
4653 exit(1);
4654 }
4655 if (use_readline) {
4656 error_report("Monitor out-of-band is only supported by QMP");
4657 exit(1);
4658 }
4659 }
4660
4661 monitor_data_init(mon, false, use_oob);
4662
4663 qemu_chr_fe_init(&mon->chr, chr, &error_abort);
4664 mon->flags = flags;
4665 if (use_readline) {
4666 mon->rs = readline_init(monitor_readline_printf,
4667 monitor_readline_flush,
4668 mon,
4669 monitor_find_completion);
4670 monitor_read_command(mon, 0);
4671 }
4672
4673 if (monitor_is_qmp(mon)) {
4674 qemu_chr_fe_set_echo(&mon->chr, true);
4675 json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
4676 if (mon->use_io_thread) {
4677
4678
4679
4680
4681 remove_fd_in_watch(chr);
4682
4683
4684
4685
4686
4687 aio_bh_schedule_oneshot(monitor_get_aio_context(),
4688 monitor_qmp_setup_handlers_bh, mon);
4689
4690 return;
4691 } else {
4692 qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read,
4693 monitor_qmp_read, monitor_qmp_event,
4694 NULL, mon, NULL, true);
4695 }
4696 } else {
4697 qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read,
4698 monitor_event, NULL, mon, NULL, true);
4699 }
4700
4701 monitor_list_append(mon);
4702}
4703
4704void monitor_cleanup(void)
4705{
4706 Monitor *mon, *next;
4707
4708
4709
4710
4711
4712
4713
4714 iothread_stop(mon_iothread);
4715
4716
4717
4718
4719
4720 monitor_qmp_bh_responder(NULL);
4721
4722
4723 qemu_mutex_lock(&monitor_lock);
4724 QTAILQ_FOREACH_SAFE(mon, &mon_list, entry, next) {
4725 QTAILQ_REMOVE(&mon_list, mon, entry);
4726 monitor_flush(mon);
4727 monitor_data_destroy(mon);
4728 g_free(mon);
4729 }
4730 qemu_mutex_unlock(&monitor_lock);
4731
4732
4733 qemu_bh_delete(qmp_dispatcher_bh);
4734 qmp_dispatcher_bh = NULL;
4735 qemu_bh_delete(qmp_respond_bh);
4736 qmp_respond_bh = NULL;
4737
4738 iothread_destroy(mon_iothread);
4739 mon_iothread = NULL;
4740}
4741
4742QemuOptsList qemu_mon_opts = {
4743 .name = "mon",
4744 .implied_opt_name = "chardev",
4745 .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
4746 .desc = {
4747 {
4748 .name = "mode",
4749 .type = QEMU_OPT_STRING,
4750 },{
4751 .name = "chardev",
4752 .type = QEMU_OPT_STRING,
4753 },{
4754 .name = "pretty",
4755 .type = QEMU_OPT_BOOL,
4756 },{
4757 .name = "x-oob",
4758 .type = QEMU_OPT_BOOL,
4759 },
4760 { }
4761 },
4762};
4763
4764#ifndef TARGET_I386
4765void qmp_rtc_reset_reinjection(Error **errp)
4766{
4767 error_setg(errp, QERR_FEATURE_DISABLED, "rtc-reset-reinjection");
4768}
4769
4770SevInfo *qmp_query_sev(Error **errp)
4771{
4772 error_setg(errp, QERR_FEATURE_DISABLED, "query-sev");
4773 return NULL;
4774}
4775
4776SevLaunchMeasureInfo *qmp_query_sev_launch_measure(Error **errp)
4777{
4778 error_setg(errp, QERR_FEATURE_DISABLED, "query-sev-launch-measure");
4779 return NULL;
4780}
4781
4782SevCapability *qmp_query_sev_capabilities(Error **errp)
4783{
4784 error_setg(errp, QERR_FEATURE_DISABLED, "query-sev-capabilities");
4785 return NULL;
4786}
4787#endif
4788
4789#ifndef TARGET_S390X
4790void qmp_dump_skeys(const char *filename, Error **errp)
4791{
4792 error_setg(errp, QERR_FEATURE_DISABLED, "dump-skeys");
4793}
4794#endif
4795
4796#ifndef TARGET_ARM
4797GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
4798{
4799 error_setg(errp, QERR_FEATURE_DISABLED, "query-gic-capabilities");
4800 return NULL;
4801}
4802#endif
4803
4804HotpluggableCPUList *qmp_query_hotpluggable_cpus(Error **errp)
4805{
4806 MachineState *ms = MACHINE(qdev_get_machine());
4807 MachineClass *mc = MACHINE_GET_CLASS(ms);
4808
4809 if (!mc->has_hotpluggable_cpus) {
4810 error_setg(errp, QERR_FEATURE_DISABLED, "query-hotpluggable-cpus");
4811 return NULL;
4812 }
4813
4814 return machine_query_hotpluggable_cpus(ms);
4815}
4816