]> git.proxmox.com Git - mirror_qemu.git/blame - monitor.c
monitor: implement 'qmp_query_commands' without qmp_cmds
[mirror_qemu.git] / monitor.c
CommitLineData
9dc39cba
FB
1/*
2 * QEMU monitor
5fafdf24 3 *
9dc39cba 4 * Copyright (c) 2003-2004 Fabrice Bellard
5fafdf24 5 *
9dc39cba
FB
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
d38ea87a 24#include "qemu/osdep.h"
511d2b14 25#include <dirent.h>
33c11879
PB
26#include "qemu-common.h"
27#include "cpu.h"
87ecb68b 28#include "hw/hw.h"
b4a42f81 29#include "monitor/qdev.h"
87ecb68b 30#include "hw/usb.h"
0d09e41a 31#include "hw/i386/pc.h"
a2cb15b0 32#include "hw/pci/pci.h"
0d09e41a 33#include "sysemu/watchdog.h"
45a50b16 34#include "hw/loader.h"
022c62cb 35#include "exec/gdbstub.h"
1422e32d 36#include "net/net.h"
68ac40d2 37#include "net/slirp.h"
dccfcd0e 38#include "sysemu/char.h"
7572150c 39#include "ui/qemu-spice.h"
9c17d615 40#include "sysemu/sysemu.h"
e35704ba 41#include "sysemu/numa.h"
83c9089e 42#include "monitor/monitor.h"
0150cd81 43#include "qemu/readline.h"
28ecbaee 44#include "ui/console.h"
c751a74a 45#include "ui/input.h"
9c17d615 46#include "sysemu/blockdev.h"
da27a00e 47#include "sysemu/block-backend.h"
87ecb68b 48#include "audio/audio.h"
76cad711 49#include "disas/disas.h"
9c17d615 50#include "sysemu/balloon.h"
1de7afc9 51#include "qemu/timer.h"
caf71f86 52#include "migration/migration.h"
9c17d615 53#include "sysemu/kvm.h"
1de7afc9 54#include "qemu/acl.h"
bdee56f5 55#include "sysemu/tpm.h"
cc7a8ea7 56#include "qapi/qmp/qerror.h"
c7eb39cb 57#include "qapi/qmp/types.h"
7b1b5d19
PB
58#include "qapi/qmp/qjson.h"
59#include "qapi/qmp/json-streamer.h"
60#include "qapi/qmp/json-parser.h"
a9c94277 61#include "qom/object_interfaces.h"
2b41f10e 62#include "cpu.h"
89bd820a 63#include "trace.h"
31965ae2 64#include "trace/control.h"
bf957284 65#include "monitor/hmp-target.h"
6d8a764e 66#ifdef CONFIG_TRACE_SIMPLE
31965ae2 67#include "trace/simple.h"
22890ab5 68#endif
022c62cb 69#include "exec/memory.h"
63c91552 70#include "exec/exec-all.h"
03dd024f 71#include "qemu/log.h"
48a32bed
AL
72#include "qmp-commands.h"
73#include "hmp.h"
1de7afc9 74#include "qemu/thread.h"
b21631f3 75#include "block/qapi.h"
43a14cfc
WX
76#include "qapi/qmp-event.h"
77#include "qapi-event.h"
39a18158 78#include "qmp-introspect.h"
5560625b 79#include "sysemu/block-backend.h"
dc599978 80#include "sysemu/qtest.h"
f348b6d1 81#include "qemu/cutils.h"
edcfaefe 82#include "qapi/qmp/dispatch.h"
6a5bd307 83
1ce6be24 84/* for hmp_info_irq/pic */
661f1929 85#if defined(TARGET_SPARC)
0d09e41a 86#include "hw/sparc/sun4m.h"
661f1929 87#endif
0d09e41a 88#include "hw/lm32/lm32_pic.h"
661f1929 89
a4538a5c
JH
90#if defined(TARGET_S390X)
91#include "hw/s390x/storage-keys.h"
92#endif
93
9307c4c1
FB
94/*
95 * Supported types:
5fafdf24 96 *
9307c4c1 97 * 'F' filename
81d0912d 98 * 'B' block device name
9307c4c1 99 * 's' string (accept optional quote)
129be006 100 * 'S' it just appends the rest of the string (accept optional quote)
361127df
MA
101 * 'O' option string of the form NAME=VALUE,...
102 * parsed according to QemuOptsList given by its name
103 * Example: 'device:O' uses qemu_device_opts.
104 * Restriction: only lists with empty desc are supported
105 * TODO lift the restriction
92a31b1f
FB
106 * 'i' 32 bit integer
107 * 'l' target long (32 or 64 bit)
91162849
LC
108 * 'M' Non-negative target long (32 or 64 bit), in user mode the
109 * value is multiplied by 2^20 (think Mebibyte)
dbc0c67f 110 * 'o' octets (aka bytes)
5e00984a
KW
111 * user mode accepts an optional E, e, P, p, T, t, G, g, M, m,
112 * K, k suffix, which multiplies the value by 2^60 for suffixes E
113 * and e, 2^50 for suffixes P and p, 2^40 for suffixes T and t,
114 * 2^30 for suffixes G and g, 2^20 for M and m, 2^10 for K and k
fccfb11e
MA
115 * 'T' double
116 * user mode accepts an optional ms, us, ns suffix,
117 * which divides the value by 1e3, 1e6, 1e9, respectively
9307c4c1
FB
118 * '/' optional gdb-like print format (like "/10x")
119 *
fb46660e
LC
120 * '?' optional type (for all types, except '/')
121 * '.' other form of optional type (for 'i' and 'l')
942cd1f2
MA
122 * 'b' boolean
123 * user mode accepts "on" or "off"
fb46660e 124 * '-' optional parameter (eg. '-f')
9307c4c1
FB
125 *
126 */
127
c227f099 128typedef struct mon_cmd_t {
9dc39cba 129 const char *name;
9307c4c1 130 const char *args_type;
9dc39cba
FB
131 const char *params;
132 const char *help;
910df89d 133 union {
af4ce882 134 void (*cmd)(Monitor *mon, const QDict *qdict);
485febc6 135 void (*cmd_new)(QDict *params, QObject **ret_data, Error **errp);
910df89d 136 } mhandler;
5f3d335f
WX
137 /* @sub_table is a list of 2nd level of commands. If it do not exist,
138 * mhandler should be used. If it exist, sub_table[?].mhandler should be
139 * used, and mhandler of 1st level plays the role of help function.
140 */
141 struct mon_cmd_t *sub_table;
bfa40f77 142 void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
c227f099 143} mon_cmd_t;
9dc39cba 144
f07918fd 145/* file descriptors passed via SCM_RIGHTS */
c227f099
AL
146typedef struct mon_fd_t mon_fd_t;
147struct mon_fd_t {
f07918fd
MM
148 char *name;
149 int fd;
c227f099 150 QLIST_ENTRY(mon_fd_t) next;
f07918fd
MM
151};
152
ba1c048a
CB
153/* file descriptor associated with a file descriptor set */
154typedef struct MonFdsetFd MonFdsetFd;
155struct MonFdsetFd {
156 int fd;
157 bool removed;
158 char *opaque;
159 QLIST_ENTRY(MonFdsetFd) next;
160};
161
162/* file descriptor set containing fds passed via SCM_RIGHTS */
163typedef struct MonFdset MonFdset;
164struct MonFdset {
165 int64_t id;
166 QLIST_HEAD(, MonFdsetFd) fds;
adb696f3 167 QLIST_HEAD(, MonFdsetFd) dup_fds;
ba1c048a
CB
168 QLIST_ENTRY(MonFdset) next;
169};
170
74358f2a 171typedef struct {
5fa737a4
LC
172 QObject *id;
173 JSONMessageParser parser;
f994b258
MA
174 /*
175 * When a client connects, we're in capabilities negotiation mode.
176 * When command qmp_capabilities succeeds, we go into command
177 * mode.
178 */
179 bool in_command_mode; /* are we in command mode? */
74358f2a 180} MonitorQMP;
5fa737a4 181
afeecec2
DB
182/*
183 * To prevent flooding clients, events can be throttled. The
184 * throttling is calculated globally, rather than per-Monitor
185 * instance.
186 */
43a14cfc 187typedef struct MonitorQAPIEventState {
7de0be65
MA
188 QAPIEvent event; /* Throttling state for this event type and... */
189 QDict *data; /* ... data, see qapi_event_throttle_equal() */
afeecec2 190 QEMUTimer *timer; /* Timer for handling delayed events */
688b4b7d 191 QDict *qdict; /* Delayed event (if any) */
43a14cfc 192} MonitorQAPIEventState;
afeecec2 193
b9b03ab0
MA
194typedef struct {
195 int64_t rate; /* Minimum time (in ns) between two events */
196} MonitorQAPIEventConf;
197
87127161
AL
198struct Monitor {
199 CharDriverState *chr;
a7aec5da 200 int reset_seen;
731b0364
AL
201 int flags;
202 int suspend_cnt;
48c043d0 203 bool skip_flush;
6cff3e85
PB
204
205 QemuMutex out_lock;
e1f2641b 206 QString *outbuf;
6cff3e85
PB
207 guint out_watch;
208
209 /* Read under either BQL or out_lock, written with BQL+out_lock. */
210 int mux_out;
211
731b0364 212 ReadLineState *rs;
74358f2a 213 MonitorQMP qmp;
cb446eca 214 CPUState *mon_cpu;
097310b5 215 BlockCompletionFunc *password_completion_cb;
731b0364 216 void *password_opaque;
7717239d 217 mon_cmd_t *cmd_table;
c227f099 218 QLIST_HEAD(,mon_fd_t) fds;
72cf2d4f 219 QLIST_ENTRY(Monitor) entry;
87127161
AL
220};
221
2dbc8db0
LC
222/* QMP checker flags */
223#define QMP_ACCEPT_UNKNOWNS 1
224
d622cb58
PB
225/* Protects mon_list, monitor_event_state. */
226static QemuMutex monitor_lock;
227
72cf2d4f 228static QLIST_HEAD(mon_list, Monitor) mon_list;
ba1c048a 229static QLIST_HEAD(mon_fdsets, MonFdset) mon_fdsets;
efb87c16 230static int mon_refcount;
7e2515e8 231
816f8925
WX
232static mon_cmd_t mon_cmds[];
233static mon_cmd_t info_cmds[];
9dc39cba 234
f36b4afb
LC
235static const mon_cmd_t qmp_cmds[];
236
8631b608 237Monitor *cur_mon;
376253ec 238
dc599978
AG
239static QEMUClockType event_clock_type = QEMU_CLOCK_REALTIME;
240
c60bf339
SH
241static void monitor_command_cb(void *opaque, const char *cmdline,
242 void *readline_opaque);
83ab7950 243
9f3982f2
MA
244/**
245 * Is @mon a QMP monitor?
246 */
247static inline bool monitor_is_qmp(const Monitor *mon)
418173c7
LC
248{
249 return (mon->flags & MONITOR_USE_CONTROL);
250}
251
489653b5
MA
252/**
253 * Is the current monitor, if any, a QMP monitor?
254 */
255bool monitor_cur_is_qmp(void)
6620d3ce 256{
9f3982f2 257 return cur_mon && monitor_is_qmp(cur_mon);
6620d3ce
MA
258}
259
7060b478 260void monitor_read_command(Monitor *mon, int show_prompt)
731b0364 261{
183e6e52
LC
262 if (!mon->rs)
263 return;
264
731b0364
AL
265 readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
266 if (show_prompt)
267 readline_show_prompt(mon->rs);
268}
6a00d601 269
7060b478
AL
270int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
271 void *opaque)
bb5fc20f 272{
bcf5d19c 273 if (mon->rs) {
cde76ee1
AL
274 readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
275 /* prompt is printed on return from the command handler */
276 return 0;
277 } else {
278 monitor_printf(mon, "terminal does not support password prompting\n");
279 return -ENOTTY;
280 }
bb5fc20f
AL
281}
282
6cff3e85
PB
283static void monitor_flush_locked(Monitor *mon);
284
f628926b
GH
285static gboolean monitor_unblocked(GIOChannel *chan, GIOCondition cond,
286 void *opaque)
287{
293d2a00
LE
288 Monitor *mon = opaque;
289
6cff3e85
PB
290 qemu_mutex_lock(&mon->out_lock);
291 mon->out_watch = 0;
292 monitor_flush_locked(mon);
293 qemu_mutex_unlock(&mon->out_lock);
f628926b
GH
294 return FALSE;
295}
296
6cff3e85
PB
297/* Called with mon->out_lock held. */
298static void monitor_flush_locked(Monitor *mon)
7e2515e8 299{
f628926b 300 int rc;
e1f2641b
LC
301 size_t len;
302 const char *buf;
303
48c043d0
LC
304 if (mon->skip_flush) {
305 return;
306 }
307
e1f2641b
LC
308 buf = qstring_get_str(mon->outbuf);
309 len = qstring_get_length(mon->outbuf);
f628926b 310
a4cc73d6 311 if (len && !mon->mux_out) {
e1f2641b 312 rc = qemu_chr_fe_write(mon->chr, (const uint8_t *) buf, len);
056f49ff
SP
313 if ((rc < 0 && errno != EAGAIN) || (rc == len)) {
314 /* all flushed or error */
e1f2641b
LC
315 QDECREF(mon->outbuf);
316 mon->outbuf = qstring_new();
f628926b
GH
317 return;
318 }
319 if (rc > 0) {
3b7c78c8 320 /* partial write */
e1f2641b
LC
321 QString *tmp = qstring_from_str(buf + rc);
322 QDECREF(mon->outbuf);
323 mon->outbuf = tmp;
f628926b 324 }
6cff3e85 325 if (mon->out_watch == 0) {
e02bc6de 326 mon->out_watch = qemu_chr_fe_add_watch(mon->chr, G_IO_OUT|G_IO_HUP,
6cff3e85 327 monitor_unblocked, mon);
293d2a00 328 }
7e2515e8
FB
329 }
330}
331
6cff3e85
PB
332void monitor_flush(Monitor *mon)
333{
334 qemu_mutex_lock(&mon->out_lock);
335 monitor_flush_locked(mon);
336 qemu_mutex_unlock(&mon->out_lock);
337}
338
e1f2641b 339/* flush at every end of line */
376253ec 340static void monitor_puts(Monitor *mon, const char *str)
7e2515e8 341{
60fe76f3 342 char c;
731b0364 343
6cff3e85 344 qemu_mutex_lock(&mon->out_lock);
7e2515e8
FB
345 for(;;) {
346 c = *str++;
347 if (c == '\0')
348 break;
e1f2641b
LC
349 if (c == '\n') {
350 qstring_append_chr(mon->outbuf, '\r');
351 }
352 qstring_append_chr(mon->outbuf, c);
353 if (c == '\n') {
6cff3e85 354 monitor_flush_locked(mon);
e1f2641b 355 }
7e2515e8 356 }
6cff3e85 357 qemu_mutex_unlock(&mon->out_lock);
7e2515e8
FB
358}
359
376253ec 360void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
9dc39cba 361{
e1f2641b 362 char *buf;
b8b08266 363
2daa1191
LC
364 if (!mon)
365 return;
366
9f3982f2 367 if (monitor_is_qmp(mon)) {
b8b08266 368 return;
4a29a85d 369 }
b8b08266 370
e1f2641b 371 buf = g_strdup_vprintf(fmt, ap);
b8b08266 372 monitor_puts(mon, buf);
e1f2641b 373 g_free(buf);
9dc39cba
FB
374}
375
376253ec 376void monitor_printf(Monitor *mon, const char *fmt, ...)
9dc39cba 377{
7e2515e8
FB
378 va_list ap;
379 va_start(ap, fmt);
376253ec 380 monitor_vprintf(mon, fmt, ap);
7e2515e8 381 va_end(ap);
9dc39cba
FB
382}
383
caf15319 384int monitor_fprintf(FILE *stream, const char *fmt, ...)
7fe48483
FB
385{
386 va_list ap;
387 va_start(ap, fmt);
376253ec 388 monitor_vprintf((Monitor *)stream, fmt, ap);
7fe48483
FB
389 va_end(ap);
390 return 0;
391}
392
9b57c02e
LC
393static void monitor_json_emitter(Monitor *mon, const QObject *data)
394{
395 QString *json;
396
83a27d4d
LC
397 json = mon->flags & MONITOR_USE_PRETTY ? qobject_to_json_pretty(data) :
398 qobject_to_json(data);
9b57c02e
LC
399 assert(json != NULL);
400
b8b08266
LC
401 qstring_append_chr(json, '\n');
402 monitor_puts(mon, qstring_get_str(json));
4a29a85d 403
9b57c02e
LC
404 QDECREF(json);
405}
406
710aec91 407static QDict *build_qmp_error_dict(Error *err)
de253f14
LC
408{
409 QObject *obj;
410
710aec91 411 obj = qobject_from_jsonf("{ 'error': { 'class': %s, 'desc': %s } }",
f22a28b8 412 QapiErrorClass_lookup[error_get_class(err)],
710aec91 413 error_get_pretty(err));
de253f14
LC
414
415 return qobject_to_qdict(obj);
416}
417
70ea0c58 418static void monitor_protocol_emitter(Monitor *mon, QObject *data,
710aec91 419 Error *err)
25b422eb
LC
420{
421 QDict *qmp;
422
89bd820a
SH
423 trace_monitor_protocol_emitter(mon);
424
70ea0c58 425 if (!err) {
25b422eb 426 /* success response */
de253f14 427 qmp = qdict_new();
25b422eb
LC
428 if (data) {
429 qobject_incref(data);
430 qdict_put_obj(qmp, "return", data);
431 } else {
0abc6579
LC
432 /* return an empty QDict by default */
433 qdict_put(qmp, "return", qdict_new());
25b422eb
LC
434 }
435 } else {
436 /* error response */
70ea0c58 437 qmp = build_qmp_error_dict(err);
25b422eb
LC
438 }
439
74358f2a
MA
440 if (mon->qmp.id) {
441 qdict_put_obj(qmp, "id", mon->qmp.id);
442 mon->qmp.id = NULL;
5fa737a4
LC
443 }
444
25b422eb
LC
445 monitor_json_emitter(mon, QOBJECT(qmp));
446 QDECREF(qmp);
447}
448
0d1ea871 449
7fb1cf16 450static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT__MAX] = {
b9b03ab0
MA
451 /* Limit guest-triggerable events to 1 per second */
452 [QAPI_EVENT_RTC_CHANGE] = { 1000 * SCALE_MS },
453 [QAPI_EVENT_WATCHDOG] = { 1000 * SCALE_MS },
454 [QAPI_EVENT_BALLOON_CHANGE] = { 1000 * SCALE_MS },
455 [QAPI_EVENT_QUORUM_REPORT_BAD] = { 1000 * SCALE_MS },
456 [QAPI_EVENT_QUORUM_FAILURE] = { 1000 * SCALE_MS },
457 [QAPI_EVENT_VSERPORT_CHANGE] = { 1000 * SCALE_MS },
458};
459
a24712af 460GHashTable *monitor_qapi_event_state;
afeecec2
DB
461
462/*
43a14cfc 463 * Emits the event to every monitor instance, @event is only used for trace
d622cb58 464 * Called with monitor_lock held.
afeecec2 465 */
688b4b7d 466static void monitor_qapi_event_emit(QAPIEvent event, QDict *qdict)
afeecec2
DB
467{
468 Monitor *mon;
469
688b4b7d 470 trace_monitor_protocol_event_emit(event, qdict);
afeecec2 471 QLIST_FOREACH(mon, &mon_list, entry) {
9f3982f2 472 if (monitor_is_qmp(mon) && mon->qmp.in_command_mode) {
688b4b7d 473 monitor_json_emitter(mon, QOBJECT(qdict));
afeecec2
DB
474 }
475 }
476}
477
a24712af
MA
478static void monitor_qapi_event_handler(void *opaque);
479
afeecec2
DB
480/*
481 * Queue a new event for emission to Monitor instances,
482 * applying any rate limiting if required.
483 */
484static void
688b4b7d 485monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
afeecec2 486{
b9b03ab0 487 MonitorQAPIEventConf *evconf;
43a14cfc 488 MonitorQAPIEventState *evstate;
afeecec2 489
7fb1cf16 490 assert(event < QAPI_EVENT__MAX);
b9b03ab0 491 evconf = &monitor_qapi_event_conf[event];
b9b03ab0 492 trace_monitor_protocol_event_queue(event, qdict, evconf->rate);
afeecec2 493
d622cb58 494 qemu_mutex_lock(&monitor_lock);
93f8f982 495
b9b03ab0 496 if (!evconf->rate) {
93f8f982 497 /* Unthrottled event */
688b4b7d 498 monitor_qapi_event_emit(event, qdict);
afeecec2 499 } else {
7de0be65
MA
500 QDict *data = qobject_to_qdict(qdict_get(qdict, "data"));
501 MonitorQAPIEventState key = { .event = event, .data = data };
a24712af
MA
502
503 evstate = g_hash_table_lookup(monitor_qapi_event_state, &key);
504 assert(!evstate || timer_pending(evstate->timer));
505
506 if (evstate) {
93f8f982 507 /*
b9b03ab0 508 * Timer is pending for (at least) evconf->rate ns after
93f8f982
MA
509 * last send. Store event for sending when timer fires,
510 * replacing a prior stored event if any.
afeecec2 511 */
93f8f982 512 QDECREF(evstate->qdict);
688b4b7d
MA
513 evstate->qdict = qdict;
514 QINCREF(evstate->qdict);
afeecec2 515 } else {
93f8f982 516 /*
b9b03ab0 517 * Last send was (at least) evconf->rate ns ago.
93f8f982 518 * Send immediately, and arm the timer to call
b9b03ab0 519 * monitor_qapi_event_handler() in evconf->rate ns. Any
93f8f982
MA
520 * events arriving before then will be delayed until then.
521 */
dc599978 522 int64_t now = qemu_clock_get_ns(event_clock_type);
93f8f982 523
688b4b7d 524 monitor_qapi_event_emit(event, qdict);
a24712af
MA
525
526 evstate = g_new(MonitorQAPIEventState, 1);
527 evstate->event = event;
7de0be65
MA
528 evstate->data = data;
529 QINCREF(evstate->data);
a24712af 530 evstate->qdict = NULL;
dc599978 531 evstate->timer = timer_new_ns(event_clock_type,
a24712af
MA
532 monitor_qapi_event_handler,
533 evstate);
534 g_hash_table_add(monitor_qapi_event_state, evstate);
b9b03ab0 535 timer_mod_ns(evstate->timer, now + evconf->rate);
afeecec2
DB
536 }
537 }
93f8f982 538
d622cb58 539 qemu_mutex_unlock(&monitor_lock);
afeecec2
DB
540}
541
afeecec2 542/*
b9b03ab0 543 * This function runs evconf->rate ns after sending a throttled
93f8f982
MA
544 * event.
545 * If another event has since been stored, send it.
afeecec2 546 */
43a14cfc 547static void monitor_qapi_event_handler(void *opaque)
afeecec2 548{
43a14cfc 549 MonitorQAPIEventState *evstate = opaque;
b9b03ab0 550 MonitorQAPIEventConf *evconf = &monitor_qapi_event_conf[evstate->event];
afeecec2 551
93f8f982 552 trace_monitor_protocol_event_handler(evstate->event, evstate->qdict);
d622cb58 553 qemu_mutex_lock(&monitor_lock);
93f8f982 554
688b4b7d 555 if (evstate->qdict) {
dc599978 556 int64_t now = qemu_clock_get_ns(event_clock_type);
93f8f982 557
688b4b7d
MA
558 monitor_qapi_event_emit(evstate->event, evstate->qdict);
559 QDECREF(evstate->qdict);
560 evstate->qdict = NULL;
b9b03ab0 561 timer_mod_ns(evstate->timer, now + evconf->rate);
a24712af
MA
562 } else {
563 g_hash_table_remove(monitor_qapi_event_state, evstate);
7de0be65 564 QDECREF(evstate->data);
a24712af
MA
565 timer_free(evstate->timer);
566 g_free(evstate);
afeecec2 567 }
93f8f982 568
d622cb58 569 qemu_mutex_unlock(&monitor_lock);
afeecec2
DB
570}
571
a24712af 572static unsigned int qapi_event_throttle_hash(const void *key)
afeecec2 573{
a24712af 574 const MonitorQAPIEventState *evstate = key;
7de0be65 575 unsigned int hash = evstate->event * 255;
afeecec2 576
7de0be65
MA
577 if (evstate->event == QAPI_EVENT_VSERPORT_CHANGE) {
578 hash += g_str_hash(qdict_get_str(evstate->data, "id"));
579 }
580
6d425eb9
AG
581 if (evstate->event == QAPI_EVENT_QUORUM_REPORT_BAD) {
582 hash += g_str_hash(qdict_get_str(evstate->data, "node-name"));
583 }
584
7de0be65 585 return hash;
a24712af 586}
0d1ea871 587
a24712af
MA
588static gboolean qapi_event_throttle_equal(const void *a, const void *b)
589{
590 const MonitorQAPIEventState *eva = a;
591 const MonitorQAPIEventState *evb = b;
592
7de0be65
MA
593 if (eva->event != evb->event) {
594 return FALSE;
595 }
596
597 if (eva->event == QAPI_EVENT_VSERPORT_CHANGE) {
598 return !strcmp(qdict_get_str(eva->data, "id"),
599 qdict_get_str(evb->data, "id"));
600 }
601
6d425eb9
AG
602 if (eva->event == QAPI_EVENT_QUORUM_REPORT_BAD) {
603 return !strcmp(qdict_get_str(eva->data, "node-name"),
604 qdict_get_str(evb->data, "node-name"));
605 }
606
7de0be65 607 return TRUE;
a24712af
MA
608}
609
610static void monitor_qapi_event_init(void)
611{
dc599978
AG
612 if (qtest_enabled()) {
613 event_clock_type = QEMU_CLOCK_VIRTUAL;
614 }
615
a24712af
MA
616 monitor_qapi_event_state = g_hash_table_new(qapi_event_throttle_hash,
617 qapi_event_throttle_equal);
43a14cfc 618 qmp_event_set_func_emit(monitor_qapi_event_queue);
0d1ea871
LC
619}
620
119ebac1 621void qmp_qmp_capabilities(Error **errp)
4a7e1190 622{
485febc6 623 cur_mon->qmp.in_command_mode = true;
4a7e1190
LC
624}
625
7ef6cf63 626static void handle_hmp_command(Monitor *mon, const char *cmdline);
0268d97c 627
b01fe89e
WX
628static void monitor_data_init(Monitor *mon)
629{
630 memset(mon, 0, sizeof(Monitor));
6cff3e85 631 qemu_mutex_init(&mon->out_lock);
b01fe89e 632 mon->outbuf = qstring_new();
7717239d
WX
633 /* Use *mon_cmds by default. */
634 mon->cmd_table = mon_cmds;
b01fe89e
WX
635}
636
637static void monitor_data_destroy(Monitor *mon)
638{
2ef45716
MAL
639 if (mon->chr) {
640 qemu_chr_add_handlers(mon->chr, NULL, NULL, NULL, NULL);
641 }
642 if (monitor_is_qmp(mon)) {
643 json_message_parser_destroy(&mon->qmp.parser);
644 }
645 g_free(mon->rs);
b01fe89e 646 QDECREF(mon->outbuf);
6cff3e85 647 qemu_mutex_destroy(&mon->out_lock);
b01fe89e
WX
648}
649
d51a67b4
LC
650char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
651 int64_t cpu_index, Error **errp)
0268d97c 652{
d51a67b4 653 char *output = NULL;
0268d97c 654 Monitor *old_mon, hmp;
0268d97c 655
b01fe89e 656 monitor_data_init(&hmp);
48c043d0 657 hmp.skip_flush = true;
0268d97c
LC
658
659 old_mon = cur_mon;
660 cur_mon = &hmp;
661
d51a67b4
LC
662 if (has_cpu_index) {
663 int ret = monitor_set_cpu(cpu_index);
0268d97c
LC
664 if (ret < 0) {
665 cur_mon = old_mon;
c6bd8c70
MA
666 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
667 "a CPU number");
0268d97c
LC
668 goto out;
669 }
670 }
671
7ef6cf63 672 handle_hmp_command(&hmp, command_line);
0268d97c
LC
673 cur_mon = old_mon;
674
6cff3e85 675 qemu_mutex_lock(&hmp.out_lock);
48c043d0
LC
676 if (qstring_get_length(hmp.outbuf) > 0) {
677 output = g_strdup(qstring_get_str(hmp.outbuf));
d51a67b4
LC
678 } else {
679 output = g_strdup("");
0268d97c 680 }
6cff3e85 681 qemu_mutex_unlock(&hmp.out_lock);
0268d97c
LC
682
683out:
b01fe89e 684 monitor_data_destroy(&hmp);
d51a67b4 685 return output;
0268d97c
LC
686}
687
9dc39cba
FB
688static int compare_cmd(const char *name, const char *list)
689{
690 const char *p, *pstart;
691 int len;
692 len = strlen(name);
693 p = list;
694 for(;;) {
695 pstart = p;
696 p = strchr(p, '|');
697 if (!p)
698 p = pstart + strlen(pstart);
699 if ((p - pstart) == len && !memcmp(pstart, name, len))
700 return 1;
701 if (*p == '\0')
702 break;
703 p++;
704 }
705 return 0;
706}
707
f5438c05
WX
708static int get_str(char *buf, int buf_size, const char **pp)
709{
710 const char *p;
711 char *q;
712 int c;
713
714 q = buf;
715 p = *pp;
716 while (qemu_isspace(*p)) {
717 p++;
718 }
719 if (*p == '\0') {
720 fail:
721 *q = '\0';
722 *pp = p;
723 return -1;
724 }
725 if (*p == '\"') {
726 p++;
727 while (*p != '\0' && *p != '\"') {
728 if (*p == '\\') {
729 p++;
730 c = *p++;
731 switch (c) {
732 case 'n':
733 c = '\n';
734 break;
735 case 'r':
736 c = '\r';
737 break;
738 case '\\':
739 case '\'':
740 case '\"':
741 break;
742 default:
71baf787 743 printf("unsupported escape code: '\\%c'\n", c);
f5438c05
WX
744 goto fail;
745 }
746 if ((q - buf) < buf_size - 1) {
747 *q++ = c;
748 }
749 } else {
750 if ((q - buf) < buf_size - 1) {
751 *q++ = *p;
752 }
753 p++;
754 }
755 }
756 if (*p != '\"') {
71baf787 757 printf("unterminated string\n");
f5438c05
WX
758 goto fail;
759 }
760 p++;
761 } else {
762 while (*p != '\0' && !qemu_isspace(*p)) {
763 if ((q - buf) < buf_size - 1) {
764 *q++ = *p;
765 }
766 p++;
767 }
768 }
769 *q = '\0';
770 *pp = p;
771 return 0;
772}
773
774#define MAX_ARGS 16
775
dcc70cdf
WX
776static void free_cmdline_args(char **args, int nb_args)
777{
778 int i;
779
780 assert(nb_args <= MAX_ARGS);
781
782 for (i = 0; i < nb_args; i++) {
783 g_free(args[i]);
784 }
785
786}
787
788/*
789 * Parse the command line to get valid args.
790 * @cmdline: command line to be parsed.
791 * @pnb_args: location to store the number of args, must NOT be NULL.
792 * @args: location to store the args, which should be freed by caller, must
793 * NOT be NULL.
794 *
795 * Returns 0 on success, negative on failure.
796 *
797 * NOTE: this parser is an approximate form of the real command parser. Number
798 * of args have a limit of MAX_ARGS. If cmdline contains more, it will
799 * return with failure.
800 */
801static int parse_cmdline(const char *cmdline,
802 int *pnb_args, char **args)
f5438c05
WX
803{
804 const char *p;
805 int nb_args, ret;
806 char buf[1024];
807
808 p = cmdline;
809 nb_args = 0;
810 for (;;) {
811 while (qemu_isspace(*p)) {
812 p++;
813 }
814 if (*p == '\0') {
815 break;
816 }
817 if (nb_args >= MAX_ARGS) {
dcc70cdf 818 goto fail;
f5438c05
WX
819 }
820 ret = get_str(buf, sizeof(buf), &p);
f5438c05 821 if (ret < 0) {
dcc70cdf 822 goto fail;
f5438c05 823 }
dcc70cdf
WX
824 args[nb_args] = g_strdup(buf);
825 nb_args++;
f5438c05
WX
826 }
827 *pnb_args = nb_args;
dcc70cdf
WX
828 return 0;
829
830 fail:
831 free_cmdline_args(args, nb_args);
832 return -1;
f5438c05
WX
833}
834
66855495
WX
835static void help_cmd_dump_one(Monitor *mon,
836 const mon_cmd_t *cmd,
837 char **prefix_args,
838 int prefix_args_nb)
839{
840 int i;
841
842 for (i = 0; i < prefix_args_nb; i++) {
843 monitor_printf(mon, "%s ", prefix_args[i]);
844 }
845 monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
846}
847
848/* @args[@arg_index] is the valid command need to find in @cmds */
c227f099 849static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
66855495 850 char **args, int nb_args, int arg_index)
9dc39cba 851{
c227f099 852 const mon_cmd_t *cmd;
9dc39cba 853
66855495
WX
854 /* No valid arg need to compare with, dump all in *cmds */
855 if (arg_index >= nb_args) {
856 for (cmd = cmds; cmd->name != NULL; cmd++) {
857 help_cmd_dump_one(mon, cmd, args, arg_index);
858 }
859 return;
860 }
861
862 /* Find one entry to dump */
863 for (cmd = cmds; cmd->name != NULL; cmd++) {
864 if (compare_cmd(args[arg_index], cmd->name)) {
865 if (cmd->sub_table) {
866 /* continue with next arg */
867 help_cmd_dump(mon, cmd->sub_table,
868 args, nb_args, arg_index + 1);
869 } else {
870 help_cmd_dump_one(mon, cmd, args, arg_index);
871 }
872 break;
873 }
9dc39cba
FB
874 }
875}
876
376253ec 877static void help_cmd(Monitor *mon, const char *name)
9dc39cba 878{
66855495
WX
879 char *args[MAX_ARGS];
880 int nb_args = 0;
881
882 /* 1. parse user input */
883 if (name) {
884 /* special case for log, directly dump and return */
885 if (!strcmp(name, "log")) {
38dad9e5 886 const QEMULogItem *item;
376253ec
AL
887 monitor_printf(mon, "Log items (comma separated):\n");
888 monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
38dad9e5 889 for (item = qemu_log_items; item->mask != 0; item++) {
376253ec 890 monitor_printf(mon, "%-10s %s\n", item->name, item->help);
f193c797 891 }
66855495
WX
892 return;
893 }
894
895 if (parse_cmdline(name, &nb_args, args) < 0) {
896 return;
f193c797 897 }
9dc39cba 898 }
66855495
WX
899
900 /* 2. dump the contents according to parsed args */
901 help_cmd_dump(mon, mon->cmd_table, args, nb_args, 0);
902
903 free_cmdline_args(args, nb_args);
9dc39cba
FB
904}
905
d54908a5 906static void do_help_cmd(Monitor *mon, const QDict *qdict)
38183186 907{
d54908a5 908 help_cmd(mon, qdict_get_try_str(qdict, "name"));
38183186
LC
909}
910
3e5a50d6 911static void hmp_trace_event(Monitor *mon, const QDict *qdict)
22890ab5
PS
912{
913 const char *tp_name = qdict_get_str(qdict, "name");
914 bool new_state = qdict_get_bool(qdict, "option");
77e2b172
LV
915 bool has_vcpu = qdict_haskey(qdict, "vcpu");
916 int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
14101d02 917 Error *local_err = NULL;
f871d689 918
77e2b172
LV
919 if (vcpu < 0) {
920 monitor_printf(mon, "argument vcpu must be positive");
921 return;
922 }
923
924 qmp_trace_event_set_state(tp_name, new_state, true, true, has_vcpu, vcpu, &local_err);
14101d02 925 if (local_err) {
091e38b7 926 error_report_err(local_err);
f871d689 927 }
22890ab5 928}
c5ceb523 929
c45a8168 930#ifdef CONFIG_TRACE_SIMPLE
3e5a50d6 931static void hmp_trace_file(Monitor *mon, const QDict *qdict)
c5ceb523
SH
932{
933 const char *op = qdict_get_try_str(qdict, "op");
934 const char *arg = qdict_get_try_str(qdict, "arg");
935
936 if (!op) {
937 st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
938 } else if (!strcmp(op, "on")) {
939 st_set_trace_file_enabled(true);
940 } else if (!strcmp(op, "off")) {
941 st_set_trace_file_enabled(false);
942 } else if (!strcmp(op, "flush")) {
943 st_flush_trace_buffer();
944 } else if (!strcmp(op, "set")) {
945 if (arg) {
946 st_set_trace_file(arg);
947 }
948 } else {
949 monitor_printf(mon, "unexpected argument \"%s\"\n", op);
950 help_cmd(mon, "trace-file");
951 }
952}
22890ab5
PS
953#endif
954
3e5a50d6 955static void hmp_info_help(Monitor *mon, const QDict *qdict)
9dc39cba 956{
13c7425e 957 help_cmd(mon, "info");
9dc39cba
FB
958}
959
9e812b6a 960static void query_commands_cb(QmpCommand *cmd, void *opaque)
e3bba9d0 961{
9e812b6a 962 CommandInfoList *info, **list = opaque;
e3bba9d0 963
9e812b6a
MAL
964 if (!cmd->enabled) {
965 return;
e3bba9d0
LC
966 }
967
9e812b6a
MAL
968 info = g_malloc0(sizeof(*info));
969 info->value = g_malloc0(sizeof(*info->value));
970 info->value->name = g_strdup(cmd->name);
971 info->next = *list;
972 *list = info;
973}
974
975CommandInfoList *qmp_query_commands(Error **errp)
976{
977 CommandInfoList *list = NULL;
978
979 qmp_for_each_command(query_commands_cb, &list);
980
981 return list;
a36e69dd
TS
982}
983
4860853d
DB
984EventInfoList *qmp_query_events(Error **errp)
985{
986 EventInfoList *info, *ev_list = NULL;
75175173 987 QAPIEvent e;
4860853d 988
7fb1cf16 989 for (e = 0 ; e < QAPI_EVENT__MAX ; e++) {
75175173 990 const char *event_name = QAPIEvent_lookup[e];
4860853d
DB
991 assert(event_name != NULL);
992 info = g_malloc0(sizeof(*info));
993 info->value = g_malloc0(sizeof(*info->value));
994 info->value->name = g_strdup(event_name);
995
996 info->next = ev_list;
997 ev_list = info;
998 }
999
1000 return ev_list;
1001}
1002
39a18158
MA
1003/*
1004 * Minor hack: generated marshalling suppressed for this command
1005 * ('gen': false in the schema) so we can parse the JSON string
1006 * directly into QObject instead of first parsing it with
1007 * visit_type_SchemaInfoList() into a SchemaInfoList, then marshal it
1008 * to QObject with generated output marshallers, every time. Instead,
1009 * we do it in test-qmp-input-visitor.c, just to make sure
1010 * qapi-introspect.py's output actually conforms to the schema.
1011 */
1012static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data,
1013 Error **errp)
1014{
1015 *ret_data = qobject_from_json(qmp_schema_json);
1016}
1017
5032a16d 1018/*
5032a16d
MAL
1019 * We used to define commands in qmp-commands.hx in addition to the
1020 * QAPI schema. This permitted defining some of them only in certain
1021 * configurations. query-commands has always reflected that (good,
1022 * because it lets QMP clients figure out what's actually available),
1023 * while query-qmp-schema never did (not so good). This function is a
1024 * hack to keep the configuration-specific commands defined exactly as
1025 * before, even though qmp-commands.hx is gone.
1026 *
1027 * FIXME Educate the QAPI schema on configuration-specific commands,
1028 * and drop this hack.
1029 */
1030static void qmp_unregister_commands_hack(void)
1031{
1032#ifndef CONFIG_SPICE
1033 qmp_unregister_command("query-spice");
1034#endif
1035#ifndef TARGET_I386
1036 qmp_unregister_command("rtc-reset-reinjection");
1037#endif
1038#ifndef TARGET_S390X
1039 qmp_unregister_command("dump-skeys");
1040#endif
1041#ifndef TARGET_ARM
1042 qmp_unregister_command("query-gic-capabilities");
1043#endif
1044}
1045
edcfaefe
MAL
1046static void qmp_init_marshal(void)
1047{
1048 qmp_register_command("query-qmp-schema", qmp_query_qmp_schema,
1049 QCO_NO_OPTIONS);
1050 qmp_register_command("device_add", qmp_device_add,
1051 QCO_NO_OPTIONS);
1052 qmp_register_command("netdev_add", qmp_netdev_add,
1053 QCO_NO_OPTIONS);
5032a16d
MAL
1054
1055 /* call it after the rest of qapi_init() */
1056 register_module_init(qmp_unregister_commands_hack, MODULE_INIT_QAPI);
edcfaefe
MAL
1057}
1058
1059qapi_init(qmp_init_marshal);
1060
b025c8b4
LC
1061/* set the current CPU defined by the user */
1062int monitor_set_cpu(int cpu_index)
6a00d601 1063{
55e5c285 1064 CPUState *cpu;
6a00d601 1065
1c8bb3cc
AF
1066 cpu = qemu_get_cpu(cpu_index);
1067 if (cpu == NULL) {
1068 return -1;
6a00d601 1069 }
cb446eca 1070 cur_mon->mon_cpu = cpu;
1c8bb3cc 1071 return 0;
6a00d601
FB
1072}
1073
caf15319 1074CPUState *mon_get_cpu(void)
6a00d601 1075{
731b0364 1076 if (!cur_mon->mon_cpu) {
b025c8b4 1077 monitor_set_cpu(0);
6a00d601 1078 }
4c0960c0 1079 cpu_synchronize_state(cur_mon->mon_cpu);
5bcda5f7
PC
1080 return cur_mon->mon_cpu;
1081}
1082
bf957284 1083CPUArchState *mon_get_cpu_env(void)
5bcda5f7
PC
1084{
1085 return mon_get_cpu()->env_ptr;
6a00d601
FB
1086}
1087
99b7796f
LC
1088int monitor_get_cpu_index(void)
1089{
5bcda5f7 1090 return mon_get_cpu()->cpu_index;
99b7796f
LC
1091}
1092
1ce6be24 1093static void hmp_info_registers(Monitor *mon, const QDict *qdict)
9307c4c1 1094{
5bcda5f7 1095 cpu_dump_state(mon_get_cpu(), (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
9307c4c1
FB
1096}
1097
1ce6be24 1098static void hmp_info_jit(Monitor *mon, const QDict *qdict)
e3db7226 1099{
376253ec 1100 dump_exec_info((FILE *)mon, monitor_fprintf);
27498bef 1101 dump_drift_info((FILE *)mon, monitor_fprintf);
e3db7226
FB
1102}
1103
1ce6be24 1104static void hmp_info_opcount(Monitor *mon, const QDict *qdict)
246ae24d
MF
1105{
1106 dump_opcount_info((FILE *)mon, monitor_fprintf);
1107}
1108
1ce6be24 1109static void hmp_info_history(Monitor *mon, const QDict *qdict)
aa455485
FB
1110{
1111 int i;
7e2515e8 1112 const char *str;
3b46e624 1113
cde76ee1
AL
1114 if (!mon->rs)
1115 return;
7e2515e8
FB
1116 i = 0;
1117 for(;;) {
731b0364 1118 str = readline_get_history(mon->rs, i);
7e2515e8
FB
1119 if (!str)
1120 break;
376253ec 1121 monitor_printf(mon, "%d: '%s'\n", i, str);
8e3a9fd2 1122 i++;
aa455485
FB
1123 }
1124}
1125
1ce6be24 1126static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
76a66253 1127{
5bcda5f7 1128 cpu_dump_statistics(mon_get_cpu(), (FILE *)mon, &monitor_fprintf, 0);
76a66253 1129}
76a66253 1130
1ce6be24 1131static void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
22890ab5 1132{
bd71211d 1133 const char *name = qdict_get_try_str(qdict, "name");
77e2b172
LV
1134 bool has_vcpu = qdict_haskey(qdict, "vcpu");
1135 int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
bd71211d 1136 TraceEventInfoList *events;
14101d02 1137 TraceEventInfoList *elem;
bd71211d
LV
1138 Error *local_err = NULL;
1139
1140 if (name == NULL) {
1141 name = "*";
1142 }
77e2b172
LV
1143 if (vcpu < 0) {
1144 monitor_printf(mon, "argument vcpu must be positive");
1145 return;
1146 }
bd71211d 1147
77e2b172 1148 events = qmp_trace_event_get_state(name, has_vcpu, vcpu, &local_err);
bd71211d
LV
1149 if (local_err) {
1150 error_report_err(local_err);
1151 return;
1152 }
14101d02
LV
1153
1154 for (elem = events; elem != NULL; elem = elem->next) {
1155 monitor_printf(mon, "%s : state %u\n",
1156 elem->value->name,
1157 elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
1158 }
1159 qapi_free_TraceEventInfoList(events);
22890ab5 1160}
22890ab5 1161
b8a185bc
MA
1162void qmp_client_migrate_info(const char *protocol, const char *hostname,
1163 bool has_port, int64_t port,
1164 bool has_tls_port, int64_t tls_port,
1165 bool has_cert_subject, const char *cert_subject,
1166 Error **errp)
e866e239 1167{
e866e239 1168 if (strcmp(protocol, "spice") == 0) {
b8a185bc
MA
1169 if (!qemu_using_spice(errp)) {
1170 return;
e866e239
GH
1171 }
1172
b8a185bc 1173 if (!has_port && !has_tls_port) {
c6bd8c70 1174 error_setg(errp, QERR_MISSING_PARAMETER, "port/tls-port");
b8a185bc 1175 return;
6ec5dae5
YH
1176 }
1177
b8a185bc
MA
1178 if (qemu_spice_migrate_info(hostname,
1179 has_port ? port : -1,
1180 has_tls_port ? tls_port : -1,
1181 cert_subject)) {
c6bd8c70 1182 error_setg(errp, QERR_UNDEFINED_ERROR);
b8a185bc 1183 return;
e866e239 1184 }
b8a185bc 1185 return;
e866e239
GH
1186 }
1187
c6bd8c70 1188 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", "spice");
e866e239
GH
1189}
1190
3e5a50d6 1191static void hmp_logfile(Monitor *mon, const QDict *qdict)
e735b91c 1192{
daa76aa4
MA
1193 Error *err = NULL;
1194
1195 qemu_set_log_filename(qdict_get_str(qdict, "filename"), &err);
1196 if (err) {
1197 error_report_err(err);
1198 }
e735b91c
PB
1199}
1200
3e5a50d6 1201static void hmp_log(Monitor *mon, const QDict *qdict)
f193c797
FB
1202{
1203 int mask;
d54908a5 1204 const char *items = qdict_get_str(qdict, "items");
3b46e624 1205
9307c4c1 1206 if (!strcmp(items, "none")) {
f193c797
FB
1207 mask = 0;
1208 } else {
4fde1eba 1209 mask = qemu_str_to_log_mask(items);
f193c797 1210 if (!mask) {
376253ec 1211 help_cmd(mon, "log");
f193c797
FB
1212 return;
1213 }
1214 }
24537a01 1215 qemu_set_log(mask);
f193c797
FB
1216}
1217
3e5a50d6 1218static void hmp_singlestep(Monitor *mon, const QDict *qdict)
1b530a6d 1219{
d54908a5 1220 const char *option = qdict_get_try_str(qdict, "option");
1b530a6d
AJ
1221 if (!option || !strcmp(option, "on")) {
1222 singlestep = 1;
1223 } else if (!strcmp(option, "off")) {
1224 singlestep = 0;
1225 } else {
1226 monitor_printf(mon, "unexpected option %s\n", option);
1227 }
1228}
1229
3e5a50d6 1230static void hmp_gdbserver(Monitor *mon, const QDict *qdict)
59030a8c 1231{
d54908a5 1232 const char *device = qdict_get_try_str(qdict, "device");
59030a8c
AL
1233 if (!device)
1234 device = "tcp::" DEFAULT_GDBSTUB_PORT;
1235 if (gdbserver_start(device) < 0) {
1236 monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1237 device);
1238 } else if (strcmp(device, "none") == 0) {
36556b20 1239 monitor_printf(mon, "Disabled gdbserver\n");
8a7ddc38 1240 } else {
59030a8c
AL
1241 monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1242 device);
8a7ddc38
FB
1243 }
1244}
1245
3e5a50d6 1246static void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
9dd986cc 1247{
d54908a5 1248 const char *action = qdict_get_str(qdict, "action");
9dd986cc
RJ
1249 if (select_watchdog_action(action) == -1) {
1250 monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1251 }
1252}
1253
376253ec 1254static void monitor_printc(Monitor *mon, int c)
9307c4c1 1255{
376253ec 1256 monitor_printf(mon, "'");
9307c4c1
FB
1257 switch(c) {
1258 case '\'':
376253ec 1259 monitor_printf(mon, "\\'");
9307c4c1
FB
1260 break;
1261 case '\\':
376253ec 1262 monitor_printf(mon, "\\\\");
9307c4c1
FB
1263 break;
1264 case '\n':
376253ec 1265 monitor_printf(mon, "\\n");
9307c4c1
FB
1266 break;
1267 case '\r':
376253ec 1268 monitor_printf(mon, "\\r");
9307c4c1
FB
1269 break;
1270 default:
1271 if (c >= 32 && c <= 126) {
376253ec 1272 monitor_printf(mon, "%c", c);
9307c4c1 1273 } else {
376253ec 1274 monitor_printf(mon, "\\x%02x", c);
9307c4c1
FB
1275 }
1276 break;
1277 }
376253ec 1278 monitor_printf(mon, "'");
9307c4c1
FB
1279}
1280
376253ec 1281static void memory_dump(Monitor *mon, int count, int format, int wsize,
a8170e5e 1282 hwaddr addr, int is_physical)
9307c4c1 1283{
23842aab 1284 int l, line_size, i, max_digits, len;
9307c4c1
FB
1285 uint8_t buf[16];
1286 uint64_t v;
1287
1288 if (format == 'i') {
5bcda5f7 1289 int flags = 0;
9307c4c1 1290#ifdef TARGET_I386
5bcda5f7 1291 CPUArchState *env = mon_get_cpu_env();
4c27ba27 1292 if (wsize == 2) {
9307c4c1 1293 flags = 1;
4c27ba27
FB
1294 } else if (wsize == 4) {
1295 flags = 0;
1296 } else {
6a15fd12 1297 /* as default we use the current CS size */
4c27ba27 1298 flags = 0;
6a15fd12
FB
1299 if (env) {
1300#ifdef TARGET_X86_64
5fafdf24 1301 if ((env->efer & MSR_EFER_LMA) &&
6a15fd12
FB
1302 (env->segs[R_CS].flags & DESC_L_MASK))
1303 flags = 2;
1304 else
1305#endif
1306 if (!(env->segs[R_CS].flags & DESC_B_MASK))
1307 flags = 1;
1308 }
4c27ba27 1309 }
1c38f843
TM
1310#endif
1311#ifdef TARGET_PPC
5bcda5f7 1312 CPUArchState *env = mon_get_cpu_env();
1c38f843
TM
1313 flags = msr_le << 16;
1314 flags |= env->bfd_mach;
4c27ba27 1315#endif
d49190c4 1316 monitor_disas(mon, mon_get_cpu(), addr, count, is_physical, flags);
9307c4c1
FB
1317 return;
1318 }
1319
1320 len = wsize * count;
1321 if (wsize == 1)
1322 line_size = 8;
1323 else
1324 line_size = 16;
9307c4c1
FB
1325 max_digits = 0;
1326
1327 switch(format) {
1328 case 'o':
1329 max_digits = (wsize * 8 + 2) / 3;
1330 break;
1331 default:
1332 case 'x':
1333 max_digits = (wsize * 8) / 4;
1334 break;
1335 case 'u':
1336 case 'd':
1337 max_digits = (wsize * 8 * 10 + 32) / 33;
1338 break;
1339 case 'c':
1340 wsize = 1;
1341 break;
1342 }
1343
1344 while (len > 0) {
7743e588 1345 if (is_physical)
376253ec 1346 monitor_printf(mon, TARGET_FMT_plx ":", addr);
7743e588 1347 else
376253ec 1348 monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
9307c4c1
FB
1349 l = len;
1350 if (l > line_size)
1351 l = line_size;
1352 if (is_physical) {
54f7b4a3 1353 cpu_physical_memory_read(addr, buf, l);
9307c4c1 1354 } else {
5bcda5f7 1355 if (cpu_memory_rw_debug(mon_get_cpu(), addr, buf, l, 0) < 0) {
376253ec 1356 monitor_printf(mon, " Cannot access memory\n");
c8f79b67
AL
1357 break;
1358 }
9307c4c1 1359 }
5fafdf24 1360 i = 0;
9307c4c1
FB
1361 while (i < l) {
1362 switch(wsize) {
1363 default:
1364 case 1:
24e60305 1365 v = ldub_p(buf + i);
9307c4c1
FB
1366 break;
1367 case 2:
24e60305 1368 v = lduw_p(buf + i);
9307c4c1
FB
1369 break;
1370 case 4:
24e60305 1371 v = (uint32_t)ldl_p(buf + i);
9307c4c1
FB
1372 break;
1373 case 8:
24e60305 1374 v = ldq_p(buf + i);
9307c4c1
FB
1375 break;
1376 }
376253ec 1377 monitor_printf(mon, " ");
9307c4c1
FB
1378 switch(format) {
1379 case 'o':
376253ec 1380 monitor_printf(mon, "%#*" PRIo64, max_digits, v);
9307c4c1
FB
1381 break;
1382 case 'x':
376253ec 1383 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
9307c4c1
FB
1384 break;
1385 case 'u':
376253ec 1386 monitor_printf(mon, "%*" PRIu64, max_digits, v);
9307c4c1
FB
1387 break;
1388 case 'd':
376253ec 1389 monitor_printf(mon, "%*" PRId64, max_digits, v);
9307c4c1
FB
1390 break;
1391 case 'c':
376253ec 1392 monitor_printc(mon, v);
9307c4c1
FB
1393 break;
1394 }
1395 i += wsize;
1396 }
376253ec 1397 monitor_printf(mon, "\n");
9307c4c1
FB
1398 addr += l;
1399 len -= l;
1400 }
1401}
1402
3e5a50d6 1403static void hmp_memory_dump(Monitor *mon, const QDict *qdict)
9307c4c1 1404{
1bd1442e
LC
1405 int count = qdict_get_int(qdict, "count");
1406 int format = qdict_get_int(qdict, "format");
1407 int size = qdict_get_int(qdict, "size");
1408 target_long addr = qdict_get_int(qdict, "addr");
1409
376253ec 1410 memory_dump(mon, count, format, size, addr, 0);
9307c4c1
FB
1411}
1412
3e5a50d6 1413static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
9307c4c1 1414{
1bd1442e
LC
1415 int count = qdict_get_int(qdict, "count");
1416 int format = qdict_get_int(qdict, "format");
1417 int size = qdict_get_int(qdict, "size");
a8170e5e 1418 hwaddr addr = qdict_get_int(qdict, "addr");
1bd1442e 1419
376253ec 1420 memory_dump(mon, count, format, size, addr, 1);
9307c4c1
FB
1421}
1422
1bd1442e 1423static void do_print(Monitor *mon, const QDict *qdict)
9307c4c1 1424{
1bd1442e 1425 int format = qdict_get_int(qdict, "format");
a8170e5e 1426 hwaddr val = qdict_get_int(qdict, "val");
1bd1442e 1427
9307c4c1
FB
1428 switch(format) {
1429 case 'o':
a8170e5e 1430 monitor_printf(mon, "%#" HWADDR_PRIo, val);
9307c4c1
FB
1431 break;
1432 case 'x':
a8170e5e 1433 monitor_printf(mon, "%#" HWADDR_PRIx, val);
9307c4c1
FB
1434 break;
1435 case 'u':
a8170e5e 1436 monitor_printf(mon, "%" HWADDR_PRIu, val);
9307c4c1
FB
1437 break;
1438 default:
1439 case 'd':
a8170e5e 1440 monitor_printf(mon, "%" HWADDR_PRId, val);
9307c4c1
FB
1441 break;
1442 case 'c':
376253ec 1443 monitor_printc(mon, val);
9307c4c1
FB
1444 break;
1445 }
376253ec 1446 monitor_printf(mon, "\n");
9307c4c1
FB
1447}
1448
3e5a50d6 1449static void hmp_sum(Monitor *mon, const QDict *qdict)
e4cf1adc
FB
1450{
1451 uint32_t addr;
e4cf1adc 1452 uint16_t sum;
f18c16de
LC
1453 uint32_t start = qdict_get_int(qdict, "start");
1454 uint32_t size = qdict_get_int(qdict, "size");
e4cf1adc
FB
1455
1456 sum = 0;
1457 for(addr = start; addr < (start + size); addr++) {
42874d3a
PM
1458 uint8_t val = address_space_ldub(&address_space_memory, addr,
1459 MEMTXATTRS_UNSPECIFIED, NULL);
e4cf1adc
FB
1460 /* BSD sum algorithm ('sum' Unix command) */
1461 sum = (sum >> 1) | (sum << 15);
54f7b4a3 1462 sum += val;
e4cf1adc 1463 }
376253ec 1464 monitor_printf(mon, "%05d\n", sum);
e4cf1adc
FB
1465}
1466
13224a87
FB
1467static int mouse_button_state;
1468
3e5a50d6 1469static void hmp_mouse_move(Monitor *mon, const QDict *qdict)
13224a87 1470{
c751a74a 1471 int dx, dy, dz, button;
1d4daa91
LC
1472 const char *dx_str = qdict_get_str(qdict, "dx_str");
1473 const char *dy_str = qdict_get_str(qdict, "dy_str");
1474 const char *dz_str = qdict_get_try_str(qdict, "dz_str");
c751a74a 1475
13224a87
FB
1476 dx = strtol(dx_str, NULL, 0);
1477 dy = strtol(dy_str, NULL, 0);
c751a74a
GH
1478 qemu_input_queue_rel(NULL, INPUT_AXIS_X, dx);
1479 qemu_input_queue_rel(NULL, INPUT_AXIS_Y, dy);
1480
1481 if (dz_str) {
13224a87 1482 dz = strtol(dz_str, NULL, 0);
c751a74a 1483 if (dz != 0) {
f22d0af0 1484 button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
c751a74a
GH
1485 qemu_input_queue_btn(NULL, button, true);
1486 qemu_input_event_sync();
1487 qemu_input_queue_btn(NULL, button, false);
1488 }
1489 }
1490 qemu_input_event_sync();
13224a87
FB
1491}
1492
3e5a50d6 1493static void hmp_mouse_button(Monitor *mon, const QDict *qdict)
13224a87 1494{
7fb1cf16 1495 static uint32_t bmap[INPUT_BUTTON__MAX] = {
c751a74a
GH
1496 [INPUT_BUTTON_LEFT] = MOUSE_EVENT_LBUTTON,
1497 [INPUT_BUTTON_MIDDLE] = MOUSE_EVENT_MBUTTON,
1498 [INPUT_BUTTON_RIGHT] = MOUSE_EVENT_RBUTTON,
1499 };
d54908a5 1500 int button_state = qdict_get_int(qdict, "button_state");
c751a74a
GH
1501
1502 if (mouse_button_state == button_state) {
1503 return;
1504 }
1505 qemu_input_update_buttons(NULL, bmap, mouse_button_state, button_state);
1506 qemu_input_event_sync();
13224a87 1507 mouse_button_state = button_state;
13224a87
FB
1508}
1509
3e5a50d6 1510static void hmp_ioport_read(Monitor *mon, const QDict *qdict)
3440557b 1511{
aa93e39c
LC
1512 int size = qdict_get_int(qdict, "size");
1513 int addr = qdict_get_int(qdict, "addr");
1514 int has_index = qdict_haskey(qdict, "index");
3440557b
FB
1515 uint32_t val;
1516 int suffix;
1517
1518 if (has_index) {
aa93e39c 1519 int index = qdict_get_int(qdict, "index");
afcea8cb 1520 cpu_outb(addr & IOPORTS_MASK, index & 0xff);
3440557b
FB
1521 addr++;
1522 }
1523 addr &= 0xffff;
1524
1525 switch(size) {
1526 default:
1527 case 1:
afcea8cb 1528 val = cpu_inb(addr);
3440557b
FB
1529 suffix = 'b';
1530 break;
1531 case 2:
afcea8cb 1532 val = cpu_inw(addr);
3440557b
FB
1533 suffix = 'w';
1534 break;
1535 case 4:
afcea8cb 1536 val = cpu_inl(addr);
3440557b
FB
1537 suffix = 'l';
1538 break;
1539 }
376253ec
AL
1540 monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1541 suffix, addr, size * 2, val);
3440557b 1542}
a3a91a35 1543
3e5a50d6 1544static void hmp_ioport_write(Monitor *mon, const QDict *qdict)
f114784f 1545{
1bd1442e
LC
1546 int size = qdict_get_int(qdict, "size");
1547 int addr = qdict_get_int(qdict, "addr");
1548 int val = qdict_get_int(qdict, "val");
1549
f114784f
JK
1550 addr &= IOPORTS_MASK;
1551
1552 switch (size) {
1553 default:
1554 case 1:
afcea8cb 1555 cpu_outb(addr, val);
f114784f
JK
1556 break;
1557 case 2:
afcea8cb 1558 cpu_outw(addr, val);
f114784f
JK
1559 break;
1560 case 4:
afcea8cb 1561 cpu_outl(addr, val);
f114784f
JK
1562 break;
1563 }
1564}
1565
3e5a50d6 1566static void hmp_boot_set(Monitor *mon, const QDict *qdict)
0ecdffbb 1567{
f1839938 1568 Error *local_err = NULL;
d54908a5 1569 const char *bootdevice = qdict_get_str(qdict, "bootdevice");
0ecdffbb 1570
f1839938
GA
1571 qemu_boot_set(bootdevice, &local_err);
1572 if (local_err) {
193227f9 1573 error_report_err(local_err);
0ecdffbb 1574 } else {
f1839938 1575 monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
0ecdffbb
AJ
1576 }
1577}
1578
1ce6be24 1579static void hmp_info_mtree(Monitor *mon, const QDict *qdict)
314e2987
BS
1580{
1581 mtree_info((fprintf_function)monitor_printf, mon);
1582}
1583
1ce6be24 1584static void hmp_info_numa(Monitor *mon, const QDict *qdict)
030ea37b 1585{
b28b6230 1586 int i;
1b1ed8dc 1587 CPUState *cpu;
5b009e40 1588 uint64_t *node_mem;
030ea37b 1589
5b009e40
HZ
1590 node_mem = g_new0(uint64_t, nb_numa_nodes);
1591 query_numa_node_mem(node_mem);
030ea37b
AL
1592 monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1593 for (i = 0; i < nb_numa_nodes; i++) {
1594 monitor_printf(mon, "node %d cpus:", i);
bdc44640 1595 CPU_FOREACH(cpu) {
1b1ed8dc 1596 if (cpu->numa_node == i) {
55e5c285 1597 monitor_printf(mon, " %d", cpu->cpu_index);
030ea37b
AL
1598 }
1599 }
1600 monitor_printf(mon, "\n");
1601 monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
5b009e40 1602 node_mem[i] >> 20);
030ea37b 1603 }
5b009e40 1604 g_free(node_mem);
030ea37b
AL
1605}
1606
5f1ce948
FB
1607#ifdef CONFIG_PROFILER
1608
89d5cbdd 1609int64_t tcg_time;
e9a6625e
AJ
1610int64_t dev_time;
1611
1ce6be24 1612static void hmp_info_profile(Monitor *mon, const QDict *qdict)
5f1ce948 1613{
376253ec 1614 monitor_printf(mon, "async time %" PRId64 " (%0.3f)\n",
73bcb24d 1615 dev_time, dev_time / (double)NANOSECONDS_PER_SECOND);
376253ec 1616 monitor_printf(mon, "qemu time %" PRId64 " (%0.3f)\n",
73bcb24d 1617 tcg_time, tcg_time / (double)NANOSECONDS_PER_SECOND);
89d5cbdd 1618 tcg_time = 0;
5f1ce948 1619 dev_time = 0;
5f1ce948
FB
1620}
1621#else
1ce6be24 1622static void hmp_info_profile(Monitor *mon, const QDict *qdict)
5f1ce948 1623{
376253ec 1624 monitor_printf(mon, "Internal profiler not compiled\n");
5f1ce948
FB
1625}
1626#endif
1627
ec36b695 1628/* Capture support */
72cf2d4f 1629static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
ec36b695 1630
1ce6be24 1631static void hmp_info_capture(Monitor *mon, const QDict *qdict)
ec36b695
FB
1632{
1633 int i;
1634 CaptureState *s;
1635
1636 for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
376253ec 1637 monitor_printf(mon, "[%d]: ", i);
ec36b695
FB
1638 s->ops.info (s->opaque);
1639 }
1640}
1641
3e5a50d6 1642static void hmp_stopcapture(Monitor *mon, const QDict *qdict)
ec36b695
FB
1643{
1644 int i;
d54908a5 1645 int n = qdict_get_int(qdict, "n");
ec36b695
FB
1646 CaptureState *s;
1647
1648 for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1649 if (i == n) {
1650 s->ops.destroy (s->opaque);
72cf2d4f 1651 QLIST_REMOVE (s, entries);
7267c094 1652 g_free (s);
ec36b695
FB
1653 return;
1654 }
1655 }
1656}
1657
3e5a50d6 1658static void hmp_wavcapture(Monitor *mon, const QDict *qdict)
c1925484
LC
1659{
1660 const char *path = qdict_get_str(qdict, "path");
1661 int has_freq = qdict_haskey(qdict, "freq");
1662 int freq = qdict_get_try_int(qdict, "freq", -1);
1663 int has_bits = qdict_haskey(qdict, "bits");
1664 int bits = qdict_get_try_int(qdict, "bits", -1);
1665 int has_channels = qdict_haskey(qdict, "nchannels");
1666 int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
ec36b695
FB
1667 CaptureState *s;
1668
7267c094 1669 s = g_malloc0 (sizeof (*s));
ec36b695
FB
1670
1671 freq = has_freq ? freq : 44100;
1672 bits = has_bits ? bits : 16;
1673 nchannels = has_channels ? nchannels : 2;
1674
1675 if (wav_start_capture (s, path, freq, bits, nchannels)) {
d00b2618 1676 monitor_printf(mon, "Failed to add wave capture\n");
7267c094 1677 g_free (s);
d00b2618 1678 return;
ec36b695 1679 }
72cf2d4f 1680 QLIST_INSERT_HEAD (&capture_head, s, entries);
ec36b695 1681}
ec36b695 1682
15dfcd45 1683static qemu_acl *find_acl(Monitor *mon, const char *name)
76655d6d 1684{
15dfcd45 1685 qemu_acl *acl = qemu_acl_find(name);
76655d6d 1686
76655d6d 1687 if (!acl) {
15dfcd45 1688 monitor_printf(mon, "acl: unknown list '%s'\n", name);
76655d6d 1689 }
15dfcd45
JK
1690 return acl;
1691}
1692
3e5a50d6 1693static void hmp_acl_show(Monitor *mon, const QDict *qdict)
15dfcd45 1694{
d54908a5 1695 const char *aclname = qdict_get_str(qdict, "aclname");
15dfcd45
JK
1696 qemu_acl *acl = find_acl(mon, aclname);
1697 qemu_acl_entry *entry;
1698 int i = 0;
76655d6d 1699
15dfcd45 1700 if (acl) {
28a76be8 1701 monitor_printf(mon, "policy: %s\n",
76655d6d 1702 acl->defaultDeny ? "deny" : "allow");
72cf2d4f 1703 QTAILQ_FOREACH(entry, &acl->entries, next) {
28a76be8
AL
1704 i++;
1705 monitor_printf(mon, "%d: %s %s\n", i,
15dfcd45 1706 entry->deny ? "deny" : "allow", entry->match);
28a76be8 1707 }
15dfcd45
JK
1708 }
1709}
1710
3e5a50d6 1711static void hmp_acl_reset(Monitor *mon, const QDict *qdict)
15dfcd45 1712{
d54908a5 1713 const char *aclname = qdict_get_str(qdict, "aclname");
15dfcd45
JK
1714 qemu_acl *acl = find_acl(mon, aclname);
1715
1716 if (acl) {
28a76be8
AL
1717 qemu_acl_reset(acl);
1718 monitor_printf(mon, "acl: removed all rules\n");
15dfcd45
JK
1719 }
1720}
1721
3e5a50d6 1722static void hmp_acl_policy(Monitor *mon, const QDict *qdict)
15dfcd45 1723{
f18c16de
LC
1724 const char *aclname = qdict_get_str(qdict, "aclname");
1725 const char *policy = qdict_get_str(qdict, "policy");
15dfcd45 1726 qemu_acl *acl = find_acl(mon, aclname);
28a76be8 1727
15dfcd45
JK
1728 if (acl) {
1729 if (strcmp(policy, "allow") == 0) {
28a76be8
AL
1730 acl->defaultDeny = 0;
1731 monitor_printf(mon, "acl: policy set to 'allow'\n");
15dfcd45 1732 } else if (strcmp(policy, "deny") == 0) {
28a76be8
AL
1733 acl->defaultDeny = 1;
1734 monitor_printf(mon, "acl: policy set to 'deny'\n");
1735 } else {
15dfcd45
JK
1736 monitor_printf(mon, "acl: unknown policy '%s', "
1737 "expected 'deny' or 'allow'\n", policy);
28a76be8 1738 }
15dfcd45
JK
1739 }
1740}
28a76be8 1741
3e5a50d6 1742static void hmp_acl_add(Monitor *mon, const QDict *qdict)
15dfcd45 1743{
1bd1442e
LC
1744 const char *aclname = qdict_get_str(qdict, "aclname");
1745 const char *match = qdict_get_str(qdict, "match");
1746 const char *policy = qdict_get_str(qdict, "policy");
1747 int has_index = qdict_haskey(qdict, "index");
1748 int index = qdict_get_try_int(qdict, "index", -1);
15dfcd45
JK
1749 qemu_acl *acl = find_acl(mon, aclname);
1750 int deny, ret;
1751
1752 if (acl) {
1753 if (strcmp(policy, "allow") == 0) {
1754 deny = 0;
1755 } else if (strcmp(policy, "deny") == 0) {
1756 deny = 1;
1757 } else {
1758 monitor_printf(mon, "acl: unknown policy '%s', "
1759 "expected 'deny' or 'allow'\n", policy);
28a76be8
AL
1760 return;
1761 }
28a76be8
AL
1762 if (has_index)
1763 ret = qemu_acl_insert(acl, deny, match, index);
1764 else
1765 ret = qemu_acl_append(acl, deny, match);
1766 if (ret < 0)
1767 monitor_printf(mon, "acl: unable to add acl entry\n");
1768 else
1769 monitor_printf(mon, "acl: added rule at position %d\n", ret);
15dfcd45
JK
1770 }
1771}
28a76be8 1772
3e5a50d6 1773static void hmp_acl_remove(Monitor *mon, const QDict *qdict)
15dfcd45 1774{
f18c16de
LC
1775 const char *aclname = qdict_get_str(qdict, "aclname");
1776 const char *match = qdict_get_str(qdict, "match");
15dfcd45
JK
1777 qemu_acl *acl = find_acl(mon, aclname);
1778 int ret;
28a76be8 1779
15dfcd45 1780 if (acl) {
28a76be8
AL
1781 ret = qemu_acl_remove(acl, match);
1782 if (ret < 0)
1783 monitor_printf(mon, "acl: no matching acl entry\n");
1784 else
1785 monitor_printf(mon, "acl: removed rule at position %d\n", ret);
76655d6d
AL
1786 }
1787}
1788
208c9d1b 1789void qmp_getfd(const char *fdname, Error **errp)
f07918fd 1790{
c227f099 1791 mon_fd_t *monfd;
f07918fd
MM
1792 int fd;
1793
208c9d1b 1794 fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
f07918fd 1795 if (fd == -1) {
c6bd8c70 1796 error_setg(errp, QERR_FD_NOT_SUPPLIED);
208c9d1b 1797 return;
f07918fd
MM
1798 }
1799
1800 if (qemu_isdigit(fdname[0])) {
0b9f0e2f 1801 close(fd);
c6bd8c70
MA
1802 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
1803 "a name not starting with a digit");
208c9d1b 1804 return;
f07918fd
MM
1805 }
1806
208c9d1b 1807 QLIST_FOREACH(monfd, &cur_mon->fds, next) {
f07918fd
MM
1808 if (strcmp(monfd->name, fdname) != 0) {
1809 continue;
1810 }
1811
1812 close(monfd->fd);
1813 monfd->fd = fd;
208c9d1b 1814 return;
f07918fd
MM
1815 }
1816
7267c094
AL
1817 monfd = g_malloc0(sizeof(mon_fd_t));
1818 monfd->name = g_strdup(fdname);
f07918fd
MM
1819 monfd->fd = fd;
1820
208c9d1b 1821 QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
f07918fd
MM
1822}
1823
208c9d1b 1824void qmp_closefd(const char *fdname, Error **errp)
f07918fd 1825{
c227f099 1826 mon_fd_t *monfd;
f07918fd 1827
208c9d1b 1828 QLIST_FOREACH(monfd, &cur_mon->fds, next) {
f07918fd
MM
1829 if (strcmp(monfd->name, fdname) != 0) {
1830 continue;
1831 }
1832
72cf2d4f 1833 QLIST_REMOVE(monfd, next);
f07918fd 1834 close(monfd->fd);
7267c094
AL
1835 g_free(monfd->name);
1836 g_free(monfd);
208c9d1b 1837 return;
f07918fd
MM
1838 }
1839
c6bd8c70 1840 error_setg(errp, QERR_FD_NOT_FOUND, fdname);
f07918fd
MM
1841}
1842
3e5a50d6 1843static void hmp_loadvm(Monitor *mon, const QDict *qdict)
c8d41b2c 1844{
1354869c 1845 int saved_vm_running = runstate_is_running();
d54908a5 1846 const char *name = qdict_get_str(qdict, "name");
c8d41b2c 1847
0461d5a6 1848 vm_stop(RUN_STATE_RESTORE_VM);
c8d41b2c 1849
f0aa7a8b 1850 if (load_vmstate(name) == 0 && saved_vm_running) {
c8d41b2c 1851 vm_start();
f0aa7a8b 1852 }
c8d41b2c
JQ
1853}
1854
a9940fc4 1855int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
7768e04c 1856{
c227f099 1857 mon_fd_t *monfd;
7768e04c 1858
72cf2d4f 1859 QLIST_FOREACH(monfd, &mon->fds, next) {
7768e04c
MM
1860 int fd;
1861
1862 if (strcmp(monfd->name, fdname) != 0) {
1863 continue;
1864 }
1865
1866 fd = monfd->fd;
1867
1868 /* caller takes ownership of fd */
72cf2d4f 1869 QLIST_REMOVE(monfd, next);
7267c094
AL
1870 g_free(monfd->name);
1871 g_free(monfd);
7768e04c
MM
1872
1873 return fd;
1874 }
1875
a9940fc4 1876 error_setg(errp, "File descriptor named '%s' has not been found", fdname);
7768e04c
MM
1877 return -1;
1878}
1879
ba1c048a
CB
1880static void monitor_fdset_cleanup(MonFdset *mon_fdset)
1881{
1882 MonFdsetFd *mon_fdset_fd;
1883 MonFdsetFd *mon_fdset_fd_next;
1884
1885 QLIST_FOREACH_SAFE(mon_fdset_fd, &mon_fdset->fds, next, mon_fdset_fd_next) {
ebe52b59
CB
1886 if ((mon_fdset_fd->removed ||
1887 (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) &&
1888 runstate_is_running()) {
ba1c048a
CB
1889 close(mon_fdset_fd->fd);
1890 g_free(mon_fdset_fd->opaque);
1891 QLIST_REMOVE(mon_fdset_fd, next);
1892 g_free(mon_fdset_fd);
1893 }
1894 }
1895
adb696f3 1896 if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) {
ba1c048a
CB
1897 QLIST_REMOVE(mon_fdset, next);
1898 g_free(mon_fdset);
1899 }
1900}
1901
efb87c16
CB
1902static void monitor_fdsets_cleanup(void)
1903{
1904 MonFdset *mon_fdset;
1905 MonFdset *mon_fdset_next;
1906
1907 QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
1908 monitor_fdset_cleanup(mon_fdset);
1909 }
1910}
1911
ba1c048a
CB
1912AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
1913 const char *opaque, Error **errp)
1914{
1915 int fd;
1916 Monitor *mon = cur_mon;
ba1c048a
CB
1917 AddfdInfo *fdinfo;
1918
1919 fd = qemu_chr_fe_get_msgfd(mon->chr);
1920 if (fd == -1) {
c6bd8c70 1921 error_setg(errp, QERR_FD_NOT_SUPPLIED);
ba1c048a
CB
1922 goto error;
1923 }
1924
e446f70d
CB
1925 fdinfo = monitor_fdset_add_fd(fd, has_fdset_id, fdset_id,
1926 has_opaque, opaque, errp);
1927 if (fdinfo) {
1928 return fdinfo;
ba1c048a 1929 }
ba1c048a
CB
1930
1931error:
1932 if (fd != -1) {
1933 close(fd);
1934 }
1935 return NULL;
1936}
1937
1938void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
1939{
1940 MonFdset *mon_fdset;
1941 MonFdsetFd *mon_fdset_fd;
1942 char fd_str[60];
1943
1944 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1945 if (mon_fdset->id != fdset_id) {
1946 continue;
1947 }
1948 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1949 if (has_fd) {
1950 if (mon_fdset_fd->fd != fd) {
1951 continue;
1952 }
1953 mon_fdset_fd->removed = true;
1954 break;
1955 } else {
1956 mon_fdset_fd->removed = true;
1957 }
1958 }
1959 if (has_fd && !mon_fdset_fd) {
1960 goto error;
1961 }
1962 monitor_fdset_cleanup(mon_fdset);
1963 return;
1964 }
1965
1966error:
1967 if (has_fd) {
1968 snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
1969 fdset_id, fd);
1970 } else {
1971 snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64, fdset_id);
1972 }
c6bd8c70 1973 error_setg(errp, QERR_FD_NOT_FOUND, fd_str);
ba1c048a
CB
1974}
1975
1976FdsetInfoList *qmp_query_fdsets(Error **errp)
1977{
1978 MonFdset *mon_fdset;
1979 MonFdsetFd *mon_fdset_fd;
1980 FdsetInfoList *fdset_list = NULL;
1981
1982 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1983 FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
1984 FdsetFdInfoList *fdsetfd_list = NULL;
1985
1986 fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
1987 fdset_info->value->fdset_id = mon_fdset->id;
1988
1989 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1990 FdsetFdInfoList *fdsetfd_info;
1991
1992 fdsetfd_info = g_malloc0(sizeof(*fdsetfd_info));
1993 fdsetfd_info->value = g_malloc0(sizeof(*fdsetfd_info->value));
1994 fdsetfd_info->value->fd = mon_fdset_fd->fd;
1995 if (mon_fdset_fd->opaque) {
1996 fdsetfd_info->value->has_opaque = true;
1997 fdsetfd_info->value->opaque = g_strdup(mon_fdset_fd->opaque);
1998 } else {
1999 fdsetfd_info->value->has_opaque = false;
2000 }
2001
2002 fdsetfd_info->next = fdsetfd_list;
2003 fdsetfd_list = fdsetfd_info;
2004 }
2005
2006 fdset_info->value->fds = fdsetfd_list;
2007
2008 fdset_info->next = fdset_list;
2009 fdset_list = fdset_info;
2010 }
2011
2012 return fdset_list;
2013}
2014
e446f70d
CB
2015AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
2016 bool has_opaque, const char *opaque,
2017 Error **errp)
2018{
2019 MonFdset *mon_fdset = NULL;
2020 MonFdsetFd *mon_fdset_fd;
2021 AddfdInfo *fdinfo;
2022
2023 if (has_fdset_id) {
2024 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2025 /* Break if match found or match impossible due to ordering by ID */
2026 if (fdset_id <= mon_fdset->id) {
2027 if (fdset_id < mon_fdset->id) {
2028 mon_fdset = NULL;
2029 }
2030 break;
2031 }
2032 }
2033 }
2034
2035 if (mon_fdset == NULL) {
2036 int64_t fdset_id_prev = -1;
2037 MonFdset *mon_fdset_cur = QLIST_FIRST(&mon_fdsets);
2038
2039 if (has_fdset_id) {
2040 if (fdset_id < 0) {
c6bd8c70
MA
2041 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdset-id",
2042 "a non-negative value");
e446f70d
CB
2043 return NULL;
2044 }
2045 /* Use specified fdset ID */
2046 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2047 mon_fdset_cur = mon_fdset;
2048 if (fdset_id < mon_fdset_cur->id) {
2049 break;
2050 }
2051 }
2052 } else {
2053 /* Use first available fdset ID */
2054 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2055 mon_fdset_cur = mon_fdset;
2056 if (fdset_id_prev == mon_fdset_cur->id - 1) {
2057 fdset_id_prev = mon_fdset_cur->id;
2058 continue;
2059 }
2060 break;
2061 }
2062 }
2063
2064 mon_fdset = g_malloc0(sizeof(*mon_fdset));
2065 if (has_fdset_id) {
2066 mon_fdset->id = fdset_id;
2067 } else {
2068 mon_fdset->id = fdset_id_prev + 1;
2069 }
2070
2071 /* The fdset list is ordered by fdset ID */
2072 if (!mon_fdset_cur) {
2073 QLIST_INSERT_HEAD(&mon_fdsets, mon_fdset, next);
2074 } else if (mon_fdset->id < mon_fdset_cur->id) {
2075 QLIST_INSERT_BEFORE(mon_fdset_cur, mon_fdset, next);
2076 } else {
2077 QLIST_INSERT_AFTER(mon_fdset_cur, mon_fdset, next);
2078 }
2079 }
2080
2081 mon_fdset_fd = g_malloc0(sizeof(*mon_fdset_fd));
2082 mon_fdset_fd->fd = fd;
2083 mon_fdset_fd->removed = false;
2084 if (has_opaque) {
2085 mon_fdset_fd->opaque = g_strdup(opaque);
2086 }
2087 QLIST_INSERT_HEAD(&mon_fdset->fds, mon_fdset_fd, next);
2088
2089 fdinfo = g_malloc0(sizeof(*fdinfo));
2090 fdinfo->fdset_id = mon_fdset->id;
2091 fdinfo->fd = mon_fdset_fd->fd;
2092
2093 return fdinfo;
2094}
2095
adb696f3
CB
2096int monitor_fdset_get_fd(int64_t fdset_id, int flags)
2097{
b2dc64c3 2098#ifndef _WIN32
adb696f3
CB
2099 MonFdset *mon_fdset;
2100 MonFdsetFd *mon_fdset_fd;
2101 int mon_fd_flags;
2102
adb696f3
CB
2103 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2104 if (mon_fdset->id != fdset_id) {
2105 continue;
2106 }
2107 QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2108 mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
2109 if (mon_fd_flags == -1) {
2110 return -1;
2111 }
2112
2113 if ((flags & O_ACCMODE) == (mon_fd_flags & O_ACCMODE)) {
2114 return mon_fdset_fd->fd;
2115 }
2116 }
2117 errno = EACCES;
2118 return -1;
2119 }
2120#endif
2121
2122 errno = ENOENT;
2123 return -1;
2124}
2125
2126int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
2127{
2128 MonFdset *mon_fdset;
2129 MonFdsetFd *mon_fdset_fd_dup;
2130
2131 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2132 if (mon_fdset->id != fdset_id) {
2133 continue;
2134 }
2135 QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2136 if (mon_fdset_fd_dup->fd == dup_fd) {
2137 return -1;
2138 }
2139 }
2140 mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
2141 mon_fdset_fd_dup->fd = dup_fd;
2142 QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
2143 return 0;
2144 }
2145 return -1;
2146}
2147
2148static int monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
2149{
2150 MonFdset *mon_fdset;
2151 MonFdsetFd *mon_fdset_fd_dup;
2152
2153 QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2154 QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2155 if (mon_fdset_fd_dup->fd == dup_fd) {
2156 if (remove) {
2157 QLIST_REMOVE(mon_fdset_fd_dup, next);
2158 if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
2159 monitor_fdset_cleanup(mon_fdset);
2160 }
b3dd1b8c
MT
2161 return -1;
2162 } else {
2163 return mon_fdset->id;
adb696f3 2164 }
adb696f3
CB
2165 }
2166 }
2167 }
2168 return -1;
2169}
2170
2171int monitor_fdset_dup_fd_find(int dup_fd)
2172{
2173 return monitor_fdset_dup_fd_find_remove(dup_fd, false);
2174}
2175
b3dd1b8c 2176void monitor_fdset_dup_fd_remove(int dup_fd)
adb696f3 2177{
b3dd1b8c 2178 monitor_fdset_dup_fd_find_remove(dup_fd, true);
adb696f3
CB
2179}
2180
1677f4c6 2181int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
5906366e
LE
2182{
2183 int fd;
2184 Error *local_err = NULL;
a96ed02f 2185
5906366e 2186 if (!qemu_isdigit(fdname[0]) && mon) {
a9940fc4 2187 fd = monitor_get_fd(mon, fdname, &local_err);
5906366e
LE
2188 } else {
2189 fd = qemu_parse_fd(fdname);
a96ed02f 2190 if (fd == -1) {
5906366e
LE
2191 error_setg(&local_err, "Invalid file descriptor number '%s'",
2192 fdname);
a96ed02f 2193 }
5906366e
LE
2194 }
2195 if (local_err) {
2196 error_propagate(errp, local_err);
2197 assert(fd == -1);
a96ed02f 2198 } else {
5906366e 2199 assert(fd != -1);
a96ed02f
NB
2200 }
2201
2202 return fd;
2203}
2204
acd0a093 2205/* Please update hmp-commands.hx when adding or changing commands */
816f8925 2206static mon_cmd_t info_cmds[] = {
da76ee76
PB
2207#include "hmp-commands-info.h"
2208 { NULL, NULL, },
9dc39cba
FB
2209};
2210
a13ced59
WX
2211/* mon_cmds and info_cmds would be sorted at runtime */
2212static mon_cmd_t mon_cmds[] = {
2213#include "hmp-commands.h"
2214 { NULL, NULL, },
2215};
2216
f36b4afb 2217static const mon_cmd_t qmp_cmds[] = {
e3193601 2218#include "qmp-commands-old.h"
f36b4afb
LC
2219 { /* NULL */ },
2220};
2221
9307c4c1
FB
2222/*******************************************************************/
2223
2224static const char *pch;
6ab7e546 2225static sigjmp_buf expr_env;
9307c4c1 2226
9307c4c1 2227
9c3175cc
SW
2228static void GCC_FMT_ATTR(2, 3) QEMU_NORETURN
2229expr_error(Monitor *mon, const char *fmt, ...)
9dc39cba 2230{
277acfe8
FZ
2231 va_list ap;
2232 va_start(ap, fmt);
2233 monitor_vprintf(mon, fmt, ap);
2234 monitor_printf(mon, "\n");
2235 va_end(ap);
6ab7e546 2236 siglongjmp(expr_env, 1);
9307c4c1
FB
2237}
2238
09b9418c 2239/* return 0 if OK, -1 if not found */
92a31b1f 2240static int get_monitor_def(target_long *pval, const char *name)
9307c4c1 2241{
bf957284 2242 const MonitorDef *md = target_monitor_defs();
92a31b1f 2243 void *ptr;
0a9516c2
AK
2244 uint64_t tmp = 0;
2245 int ret;
92a31b1f 2246
bf957284
PB
2247 if (md == NULL) {
2248 return -1;
2249 }
2250
2251 for(; md->name != NULL; md++) {
9307c4c1
FB
2252 if (compare_cmd(name, md->name)) {
2253 if (md->get_value) {
e95c8d51 2254 *pval = md->get_value(md, md->offset);
9307c4c1 2255 } else {
5bcda5f7 2256 CPUArchState *env = mon_get_cpu_env();
6a00d601 2257 ptr = (uint8_t *)env + md->offset;
92a31b1f
FB
2258 switch(md->type) {
2259 case MD_I32:
2260 *pval = *(int32_t *)ptr;
2261 break;
2262 case MD_TLONG:
2263 *pval = *(target_long *)ptr;
2264 break;
2265 default:
2266 *pval = 0;
2267 break;
2268 }
9307c4c1
FB
2269 }
2270 return 0;
2271 }
2272 }
0a9516c2
AK
2273
2274 ret = target_get_monitor_def(mon_get_cpu(), name, &tmp);
2275 if (!ret) {
2276 *pval = (target_long) tmp;
2277 }
2278
2279 return ret;
9307c4c1
FB
2280}
2281
2282static void next(void)
2283{
660f11be 2284 if (*pch != '\0') {
9307c4c1 2285 pch++;
cd390083 2286 while (qemu_isspace(*pch))
9307c4c1
FB
2287 pch++;
2288 }
2289}
2290
376253ec 2291static int64_t expr_sum(Monitor *mon);
9307c4c1 2292
376253ec 2293static int64_t expr_unary(Monitor *mon)
9307c4c1 2294{
c2efc95d 2295 int64_t n;
9307c4c1 2296 char *p;
6a00d601 2297 int ret;
9307c4c1
FB
2298
2299 switch(*pch) {
2300 case '+':
2301 next();
376253ec 2302 n = expr_unary(mon);
9307c4c1
FB
2303 break;
2304 case '-':
2305 next();
376253ec 2306 n = -expr_unary(mon);
9307c4c1
FB
2307 break;
2308 case '~':
2309 next();
376253ec 2310 n = ~expr_unary(mon);
9307c4c1
FB
2311 break;
2312 case '(':
2313 next();
376253ec 2314 n = expr_sum(mon);
9307c4c1 2315 if (*pch != ')') {
376253ec 2316 expr_error(mon, "')' expected");
9307c4c1
FB
2317 }
2318 next();
2319 break;
81d0912d
FB
2320 case '\'':
2321 pch++;
2322 if (*pch == '\0')
376253ec 2323 expr_error(mon, "character constant expected");
81d0912d
FB
2324 n = *pch;
2325 pch++;
2326 if (*pch != '\'')
376253ec 2327 expr_error(mon, "missing terminating \' character");
81d0912d
FB
2328 next();
2329 break;
9307c4c1
FB
2330 case '$':
2331 {
2332 char buf[128], *q;
69b34976 2333 target_long reg=0;
3b46e624 2334
9307c4c1
FB
2335 pch++;
2336 q = buf;
2337 while ((*pch >= 'a' && *pch <= 'z') ||
2338 (*pch >= 'A' && *pch <= 'Z') ||
2339 (*pch >= '0' && *pch <= '9') ||
57206fd4 2340 *pch == '_' || *pch == '.') {
9307c4c1
FB
2341 if ((q - buf) < sizeof(buf) - 1)
2342 *q++ = *pch;
2343 pch++;
2344 }
cd390083 2345 while (qemu_isspace(*pch))
9307c4c1
FB
2346 pch++;
2347 *q = 0;
7743e588 2348 ret = get_monitor_def(&reg, buf);
09b9418c 2349 if (ret < 0)
376253ec 2350 expr_error(mon, "unknown register");
7743e588 2351 n = reg;
9307c4c1
FB
2352 }
2353 break;
2354 case '\0':
376253ec 2355 expr_error(mon, "unexpected end of expression");
9307c4c1
FB
2356 n = 0;
2357 break;
2358 default:
6b0e33be 2359 errno = 0;
4f4fbf77 2360 n = strtoull(pch, &p, 0);
6b0e33be
LC
2361 if (errno == ERANGE) {
2362 expr_error(mon, "number too large");
2363 }
9307c4c1 2364 if (pch == p) {
277acfe8 2365 expr_error(mon, "invalid char '%c' in expression", *p);
9307c4c1
FB
2366 }
2367 pch = p;
cd390083 2368 while (qemu_isspace(*pch))
9307c4c1
FB
2369 pch++;
2370 break;
2371 }
2372 return n;
2373}
2374
2375
376253ec 2376static int64_t expr_prod(Monitor *mon)
9307c4c1 2377{
c2efc95d 2378 int64_t val, val2;
92a31b1f 2379 int op;
3b46e624 2380
376253ec 2381 val = expr_unary(mon);
9307c4c1
FB
2382 for(;;) {
2383 op = *pch;
2384 if (op != '*' && op != '/' && op != '%')
2385 break;
2386 next();
376253ec 2387 val2 = expr_unary(mon);
9307c4c1
FB
2388 switch(op) {
2389 default:
2390 case '*':
2391 val *= val2;
2392 break;
2393 case '/':
2394 case '%':
5fafdf24 2395 if (val2 == 0)
376253ec 2396 expr_error(mon, "division by zero");
9307c4c1
FB
2397 if (op == '/')
2398 val /= val2;
2399 else
2400 val %= val2;
2401 break;
2402 }
2403 }
2404 return val;
2405}
2406
376253ec 2407static int64_t expr_logic(Monitor *mon)
9307c4c1 2408{
c2efc95d 2409 int64_t val, val2;
92a31b1f 2410 int op;
9307c4c1 2411
376253ec 2412 val = expr_prod(mon);
9307c4c1
FB
2413 for(;;) {
2414 op = *pch;
2415 if (op != '&' && op != '|' && op != '^')
2416 break;
2417 next();
376253ec 2418 val2 = expr_prod(mon);
9307c4c1
FB
2419 switch(op) {
2420 default:
2421 case '&':
2422 val &= val2;
2423 break;
2424 case '|':
2425 val |= val2;
2426 break;
2427 case '^':
2428 val ^= val2;
2429 break;
2430 }
2431 }
2432 return val;
2433}
2434
376253ec 2435static int64_t expr_sum(Monitor *mon)
9307c4c1 2436{
c2efc95d 2437 int64_t val, val2;
92a31b1f 2438 int op;
9307c4c1 2439
376253ec 2440 val = expr_logic(mon);
9307c4c1
FB
2441 for(;;) {
2442 op = *pch;
2443 if (op != '+' && op != '-')
2444 break;
2445 next();
376253ec 2446 val2 = expr_logic(mon);
9307c4c1
FB
2447 if (op == '+')
2448 val += val2;
2449 else
2450 val -= val2;
2451 }
2452 return val;
2453}
2454
376253ec 2455static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
9307c4c1
FB
2456{
2457 pch = *pp;
6ab7e546 2458 if (sigsetjmp(expr_env, 0)) {
9307c4c1
FB
2459 *pp = pch;
2460 return -1;
2461 }
cd390083 2462 while (qemu_isspace(*pch))
9307c4c1 2463 pch++;
376253ec 2464 *pval = expr_sum(mon);
9307c4c1
FB
2465 *pp = pch;
2466 return 0;
2467}
2468
3350a4dd
MA
2469static int get_double(Monitor *mon, double *pval, const char **pp)
2470{
2471 const char *p = *pp;
2472 char *tailp;
2473 double d;
2474
2475 d = strtod(p, &tailp);
2476 if (tailp == p) {
2477 monitor_printf(mon, "Number expected\n");
2478 return -1;
2479 }
2480 if (d != d || d - d != 0) {
2481 /* NaN or infinity */
2482 monitor_printf(mon, "Bad number\n");
2483 return -1;
2484 }
2485 *pval = d;
2486 *pp = tailp;
2487 return 0;
2488}
2489
4590fd80
LC
2490/*
2491 * Store the command-name in cmdname, and return a pointer to
2492 * the remaining of the command string.
2493 */
2494static const char *get_command_name(const char *cmdline,
2495 char *cmdname, size_t nlen)
2496{
2497 size_t len;
2498 const char *p, *pstart;
2499
2500 p = cmdline;
2501 while (qemu_isspace(*p))
2502 p++;
2503 if (*p == '\0')
2504 return NULL;
2505 pstart = p;
2506 while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2507 p++;
2508 len = p - pstart;
2509 if (len > nlen - 1)
2510 len = nlen - 1;
2511 memcpy(cmdname, pstart, len);
2512 cmdname[len] = '\0';
2513 return p;
2514}
2515
4d76d2ba
LC
2516/**
2517 * Read key of 'type' into 'key' and return the current
2518 * 'type' pointer.
2519 */
2520static char *key_get_info(const char *type, char **key)
2521{
2522 size_t len;
2523 char *p, *str;
2524
2525 if (*type == ',')
2526 type++;
2527
2528 p = strchr(type, ':');
2529 if (!p) {
2530 *key = NULL;
2531 return NULL;
2532 }
2533 len = p - type;
2534
7267c094 2535 str = g_malloc(len + 1);
4d76d2ba
LC
2536 memcpy(str, type, len);
2537 str[len] = '\0';
2538
2539 *key = str;
2540 return ++p;
2541}
2542
9307c4c1
FB
2543static int default_fmt_format = 'x';
2544static int default_fmt_size = 4;
2545
fbc3d96c
LS
2546static int is_valid_option(const char *c, const char *typestr)
2547{
2548 char option[3];
2549
2550 option[0] = '-';
2551 option[1] = *c;
2552 option[2] = '\0';
2553
2554 typestr = strstr(typestr, option);
2555 return (typestr != NULL);
2556}
2557
945c5ac8
LC
2558static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
2559 const char *cmdname)
7fd669a1
LC
2560{
2561 const mon_cmd_t *cmd;
2562
945c5ac8 2563 for (cmd = disp_table; cmd->name != NULL; cmd++) {
7fd669a1
LC
2564 if (compare_cmd(cmdname, cmd->name)) {
2565 return cmd;
2566 }
2567 }
2568
2569 return NULL;
2570}
2571
bead3ce1
LC
2572static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
2573{
f36b4afb 2574 return search_dispatch_table(qmp_cmds, cmdname);
bead3ce1
LC
2575}
2576
5f3d335f 2577/*
ae50212f
BD
2578 * Parse command name from @cmdp according to command table @table.
2579 * If blank, return NULL.
2580 * Else, if no valid command can be found, report to @mon, and return
2581 * NULL.
2582 * Else, change @cmdp to point right behind the name, and return its
2583 * command table entry.
2584 * Do not assume the return value points into @table! It doesn't when
2585 * the command is found in a sub-command table.
5f3d335f 2586 */
c227f099 2587static const mon_cmd_t *monitor_parse_command(Monitor *mon,
ae50212f
BD
2588 const char **cmdp,
2589 mon_cmd_t *table)
9307c4c1 2590{
ae50212f 2591 const char *p;
c227f099 2592 const mon_cmd_t *cmd;
9307c4c1 2593 char cmdname[256];
9dc39cba 2594
9307c4c1 2595 /* extract the command name */
ae50212f 2596 p = get_command_name(*cmdp, cmdname, sizeof(cmdname));
4590fd80 2597 if (!p)
55f81d96 2598 return NULL;
3b46e624 2599
5f3d335f 2600 cmd = search_dispatch_table(table, cmdname);
7fd669a1 2601 if (!cmd) {
5f3d335f 2602 monitor_printf(mon, "unknown command: '%.*s'\n",
ae50212f 2603 (int)(p - *cmdp), *cmdp);
55f81d96 2604 return NULL;
9307c4c1 2605 }
9307c4c1 2606
5f3d335f
WX
2607 /* filter out following useless space */
2608 while (qemu_isspace(*p)) {
2609 p++;
2610 }
ae50212f
BD
2611
2612 *cmdp = p;
5f3d335f 2613 /* search sub command */
ae50212f
BD
2614 if (cmd->sub_table != NULL && *p != '\0') {
2615 return monitor_parse_command(mon, cmdp, cmd->sub_table);
5f3d335f
WX
2616 }
2617
ae50212f
BD
2618 return cmd;
2619}
2620
2621/*
2622 * Parse arguments for @cmd.
2623 * If it can't be parsed, report to @mon, and return NULL.
2624 * Else, insert command arguments into a QDict, and return it.
2625 * Note: On success, caller has to free the QDict structure.
2626 */
2627
2628static QDict *monitor_parse_arguments(Monitor *mon,
2629 const char **endp,
2630 const mon_cmd_t *cmd)
2631{
2632 const char *typestr;
2633 char *key;
2634 int c;
2635 const char *p = *endp;
2636 char buf[1024];
2637 QDict *qdict = qdict_new();
2638
9307c4c1
FB
2639 /* parse the parameters */
2640 typestr = cmd->args_type;
9dc39cba 2641 for(;;) {
4d76d2ba
LC
2642 typestr = key_get_info(typestr, &key);
2643 if (!typestr)
9dc39cba 2644 break;
4d76d2ba 2645 c = *typestr;
9307c4c1
FB
2646 typestr++;
2647 switch(c) {
2648 case 'F':
81d0912d 2649 case 'B':
9307c4c1
FB
2650 case 's':
2651 {
2652 int ret;
3b46e624 2653
cd390083 2654 while (qemu_isspace(*p))
9307c4c1
FB
2655 p++;
2656 if (*typestr == '?') {
2657 typestr++;
2658 if (*p == '\0') {
2659 /* no optional string: NULL argument */
53773581 2660 break;
9307c4c1
FB
2661 }
2662 }
2663 ret = get_str(buf, sizeof(buf), &p);
2664 if (ret < 0) {
81d0912d
FB
2665 switch(c) {
2666 case 'F':
376253ec 2667 monitor_printf(mon, "%s: filename expected\n",
ae50212f 2668 cmd->name);
81d0912d
FB
2669 break;
2670 case 'B':
376253ec 2671 monitor_printf(mon, "%s: block device name expected\n",
ae50212f 2672 cmd->name);
81d0912d
FB
2673 break;
2674 default:
ae50212f 2675 monitor_printf(mon, "%s: string expected\n", cmd->name);
81d0912d
FB
2676 break;
2677 }
9307c4c1
FB
2678 goto fail;
2679 }
53773581 2680 qdict_put(qdict, key, qstring_from_str(buf));
9307c4c1 2681 }
9dc39cba 2682 break;
361127df
MA
2683 case 'O':
2684 {
2685 QemuOptsList *opts_list;
2686 QemuOpts *opts;
2687
2688 opts_list = qemu_find_opts(key);
2689 if (!opts_list || opts_list->desc->name) {
2690 goto bad_type;
2691 }
2692 while (qemu_isspace(*p)) {
2693 p++;
2694 }
2695 if (!*p)
2696 break;
2697 if (get_str(buf, sizeof(buf), &p) < 0) {
2698 goto fail;
2699 }
70b94331 2700 opts = qemu_opts_parse_noisily(opts_list, buf, true);
361127df
MA
2701 if (!opts) {
2702 goto fail;
2703 }
2704 qemu_opts_to_qdict(opts, qdict);
2705 qemu_opts_del(opts);
2706 }
2707 break;
9307c4c1
FB
2708 case '/':
2709 {
2710 int count, format, size;
3b46e624 2711
cd390083 2712 while (qemu_isspace(*p))
9307c4c1
FB
2713 p++;
2714 if (*p == '/') {
2715 /* format found */
2716 p++;
2717 count = 1;
cd390083 2718 if (qemu_isdigit(*p)) {
9307c4c1 2719 count = 0;
cd390083 2720 while (qemu_isdigit(*p)) {
9307c4c1
FB
2721 count = count * 10 + (*p - '0');
2722 p++;
2723 }
2724 }
2725 size = -1;
2726 format = -1;
2727 for(;;) {
2728 switch(*p) {
2729 case 'o':
2730 case 'd':
2731 case 'u':
2732 case 'x':
2733 case 'i':
2734 case 'c':
2735 format = *p++;
2736 break;
2737 case 'b':
2738 size = 1;
2739 p++;
2740 break;
2741 case 'h':
2742 size = 2;
2743 p++;
2744 break;
2745 case 'w':
2746 size = 4;
2747 p++;
2748 break;
2749 case 'g':
2750 case 'L':
2751 size = 8;
2752 p++;
2753 break;
2754 default:
2755 goto next;
2756 }
2757 }
2758 next:
cd390083 2759 if (*p != '\0' && !qemu_isspace(*p)) {
376253ec
AL
2760 monitor_printf(mon, "invalid char in format: '%c'\n",
2761 *p);
9307c4c1
FB
2762 goto fail;
2763 }
9307c4c1
FB
2764 if (format < 0)
2765 format = default_fmt_format;
4c27ba27
FB
2766 if (format != 'i') {
2767 /* for 'i', not specifying a size gives -1 as size */
2768 if (size < 0)
2769 size = default_fmt_size;
e90f009b 2770 default_fmt_size = size;
4c27ba27 2771 }
9307c4c1
FB
2772 default_fmt_format = format;
2773 } else {
2774 count = 1;
2775 format = default_fmt_format;
4c27ba27
FB
2776 if (format != 'i') {
2777 size = default_fmt_size;
2778 } else {
2779 size = -1;
2780 }
9307c4c1 2781 }
f7188bbe
LC
2782 qdict_put(qdict, "count", qint_from_int(count));
2783 qdict_put(qdict, "format", qint_from_int(format));
2784 qdict_put(qdict, "size", qint_from_int(size));
9307c4c1 2785 }
9dc39cba 2786 break;
9307c4c1 2787 case 'i':
92a31b1f 2788 case 'l':
b6e098d7 2789 case 'M':
9307c4c1 2790 {
c2efc95d 2791 int64_t val;
7743e588 2792
cd390083 2793 while (qemu_isspace(*p))
9307c4c1 2794 p++;
3440557b 2795 if (*typestr == '?' || *typestr == '.') {
3440557b 2796 if (*typestr == '?') {
53773581
LC
2797 if (*p == '\0') {
2798 typestr++;
2799 break;
2800 }
3440557b
FB
2801 } else {
2802 if (*p == '.') {
2803 p++;
cd390083 2804 while (qemu_isspace(*p))
3440557b 2805 p++;
3440557b 2806 } else {
53773581
LC
2807 typestr++;
2808 break;
3440557b
FB
2809 }
2810 }
13224a87 2811 typestr++;
9307c4c1 2812 }
376253ec 2813 if (get_expr(mon, &val, &p))
9307c4c1 2814 goto fail;
675ebef9
LC
2815 /* Check if 'i' is greater than 32-bit */
2816 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
ae50212f 2817 monitor_printf(mon, "\'%s\' has failed: ", cmd->name);
675ebef9
LC
2818 monitor_printf(mon, "integer is for 32-bit values\n");
2819 goto fail;
b6e098d7 2820 } else if (c == 'M') {
91162849
LC
2821 if (val < 0) {
2822 monitor_printf(mon, "enter a positive value\n");
2823 goto fail;
2824 }
b6e098d7 2825 val <<= 20;
675ebef9 2826 }
53773581 2827 qdict_put(qdict, key, qint_from_int(val));
9307c4c1
FB
2828 }
2829 break;
dbc0c67f
JS
2830 case 'o':
2831 {
70b4f4bb 2832 int64_t val;
dbc0c67f
JS
2833 char *end;
2834
2835 while (qemu_isspace(*p)) {
2836 p++;
2837 }
2838 if (*typestr == '?') {
2839 typestr++;
2840 if (*p == '\0') {
2841 break;
2842 }
2843 }
4677bb40 2844 val = qemu_strtosz(p, &end);
dbc0c67f
JS
2845 if (val < 0) {
2846 monitor_printf(mon, "invalid size\n");
2847 goto fail;
2848 }
2849 qdict_put(qdict, key, qint_from_int(val));
2850 p = end;
2851 }
2852 break;
fccfb11e 2853 case 'T':
3350a4dd
MA
2854 {
2855 double val;
2856
2857 while (qemu_isspace(*p))
2858 p++;
2859 if (*typestr == '?') {
2860 typestr++;
2861 if (*p == '\0') {
2862 break;
2863 }
2864 }
2865 if (get_double(mon, &val, &p) < 0) {
2866 goto fail;
2867 }
07de3e60 2868 if (p[0] && p[1] == 's') {
fccfb11e
MA
2869 switch (*p) {
2870 case 'm':
2871 val /= 1e3; p += 2; break;
2872 case 'u':
2873 val /= 1e6; p += 2; break;
2874 case 'n':
2875 val /= 1e9; p += 2; break;
2876 }
2877 }
3350a4dd
MA
2878 if (*p && !qemu_isspace(*p)) {
2879 monitor_printf(mon, "Unknown unit suffix\n");
2880 goto fail;
2881 }
2882 qdict_put(qdict, key, qfloat_from_double(val));
2883 }
2884 break;
942cd1f2
MA
2885 case 'b':
2886 {
2887 const char *beg;
fc48ffc3 2888 bool val;
942cd1f2
MA
2889
2890 while (qemu_isspace(*p)) {
2891 p++;
2892 }
2893 beg = p;
2894 while (qemu_isgraph(*p)) {
2895 p++;
2896 }
2897 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
fc48ffc3 2898 val = true;
942cd1f2 2899 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
fc48ffc3 2900 val = false;
942cd1f2
MA
2901 } else {
2902 monitor_printf(mon, "Expected 'on' or 'off'\n");
2903 goto fail;
2904 }
fc48ffc3 2905 qdict_put(qdict, key, qbool_from_bool(val));
942cd1f2
MA
2906 }
2907 break;
9307c4c1
FB
2908 case '-':
2909 {
fbc3d96c 2910 const char *tmp = p;
eb159d13 2911 int skip_key = 0;
9307c4c1 2912 /* option */
3b46e624 2913
9307c4c1
FB
2914 c = *typestr++;
2915 if (c == '\0')
2916 goto bad_type;
cd390083 2917 while (qemu_isspace(*p))
9307c4c1 2918 p++;
9307c4c1
FB
2919 if (*p == '-') {
2920 p++;
fbc3d96c
LS
2921 if(c != *p) {
2922 if(!is_valid_option(p, typestr)) {
2923
2924 monitor_printf(mon, "%s: unsupported option -%c\n",
ae50212f 2925 cmd->name, *p);
fbc3d96c
LS
2926 goto fail;
2927 } else {
2928 skip_key = 1;
2929 }
2930 }
2931 if(skip_key) {
2932 p = tmp;
2933 } else {
eb159d13 2934 /* has option */
fbc3d96c 2935 p++;
fc48ffc3 2936 qdict_put(qdict, key, qbool_from_bool(true));
9307c4c1 2937 }
9307c4c1 2938 }
9307c4c1
FB
2939 }
2940 break;
129be006
WX
2941 case 'S':
2942 {
2943 /* package all remaining string */
2944 int len;
2945
2946 while (qemu_isspace(*p)) {
2947 p++;
2948 }
2949 if (*typestr == '?') {
2950 typestr++;
2951 if (*p == '\0') {
2952 /* no remaining string: NULL argument */
2953 break;
2954 }
2955 }
2956 len = strlen(p);
2957 if (len <= 0) {
2958 monitor_printf(mon, "%s: string expected\n",
ae50212f 2959 cmd->name);
e549d2aa 2960 goto fail;
129be006
WX
2961 }
2962 qdict_put(qdict, key, qstring_from_str(p));
2963 p += len;
2964 }
2965 break;
9307c4c1
FB
2966 default:
2967 bad_type:
ae50212f 2968 monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
9307c4c1
FB
2969 goto fail;
2970 }
7267c094 2971 g_free(key);
4d76d2ba 2972 key = NULL;
9dc39cba 2973 }
9307c4c1 2974 /* check that all arguments were parsed */
cd390083 2975 while (qemu_isspace(*p))
9307c4c1
FB
2976 p++;
2977 if (*p != '\0') {
376253ec 2978 monitor_printf(mon, "%s: extraneous characters at the end of line\n",
ae50212f 2979 cmd->name);
9307c4c1 2980 goto fail;
9dc39cba 2981 }
9307c4c1 2982
ae50212f 2983 return qdict;
ac7531ec 2984
55f81d96 2985fail:
ae50212f 2986 QDECREF(qdict);
7267c094 2987 g_free(key);
55f81d96
LC
2988 return NULL;
2989}
2990
7ef6cf63 2991static void handle_hmp_command(Monitor *mon, const char *cmdline)
55f81d96 2992{
55f81d96 2993 QDict *qdict;
c227f099 2994 const mon_cmd_t *cmd;
55f81d96 2995
ae50212f
BD
2996 cmd = monitor_parse_command(mon, &cmdline, mon->cmd_table);
2997 if (!cmd) {
2998 return;
2999 }
55f81d96 3000
ae50212f
BD
3001 qdict = monitor_parse_arguments(mon, &cmdline, cmd);
3002 if (!qdict) {
dd41eea7
BD
3003 monitor_printf(mon, "Try \"help %s\" for more information\n",
3004 cmd->name);
ae50212f 3005 return;
55f81d96
LC
3006 }
3007
ae50212f 3008 cmd->mhandler.cmd(mon, qdict);
f7188bbe 3009 QDECREF(qdict);
9dc39cba
FB
3010}
3011
cd5c6bba 3012static void cmd_completion(Monitor *mon, const char *name, const char *list)
81d0912d
FB
3013{
3014 const char *p, *pstart;
3015 char cmd[128];
3016 int len;
3017
3018 p = list;
3019 for(;;) {
3020 pstart = p;
3021 p = strchr(p, '|');
3022 if (!p)
3023 p = pstart + strlen(pstart);
3024 len = p - pstart;
3025 if (len > sizeof(cmd) - 2)
3026 len = sizeof(cmd) - 2;
3027 memcpy(cmd, pstart, len);
3028 cmd[len] = '\0';
3029 if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
cd5c6bba 3030 readline_add_completion(mon->rs, cmd);
81d0912d
FB
3031 }
3032 if (*p == '\0')
3033 break;
3034 p++;
3035 }
3036}
3037
cb8f68b1 3038static void file_completion(Monitor *mon, const char *input)
81d0912d
FB
3039{
3040 DIR *ffs;
3041 struct dirent *d;
3042 char path[1024];
3043 char file[1024], file_prefix[1024];
3044 int input_path_len;
3045 const char *p;
3046
5fafdf24 3047 p = strrchr(input, '/');
81d0912d
FB
3048 if (!p) {
3049 input_path_len = 0;
3050 pstrcpy(file_prefix, sizeof(file_prefix), input);
363a37d5 3051 pstrcpy(path, sizeof(path), ".");
81d0912d
FB
3052 } else {
3053 input_path_len = p - input + 1;
3054 memcpy(path, input, input_path_len);
3055 if (input_path_len > sizeof(path) - 1)
3056 input_path_len = sizeof(path) - 1;
3057 path[input_path_len] = '\0';
3058 pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3059 }
19f2db5c 3060
81d0912d
FB
3061 ffs = opendir(path);
3062 if (!ffs)
3063 return;
3064 for(;;) {
3065 struct stat sb;
3066 d = readdir(ffs);
3067 if (!d)
3068 break;
46c7fc18
KK
3069
3070 if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
3071 continue;
3072 }
3073
81d0912d
FB
3074 if (strstart(d->d_name, file_prefix, NULL)) {
3075 memcpy(file, input, input_path_len);
363a37d5
BS
3076 if (input_path_len < sizeof(file))
3077 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3078 d->d_name);
81d0912d
FB
3079 /* stat the file to find out if it's a directory.
3080 * In that case add a slash to speed up typing long paths
3081 */
c951d9a6 3082 if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) {
363a37d5 3083 pstrcat(file, sizeof(file), "/");
c951d9a6 3084 }
cb8f68b1 3085 readline_add_completion(mon->rs, file);
81d0912d
FB
3086 }
3087 }
3088 closedir(ffs);
3089}
3090
4d76d2ba
LC
3091static const char *next_arg_type(const char *typestr)
3092{
3093 const char *p = strchr(typestr, ':');
3094 return (p != NULL ? ++p : typestr);
3095}
3096
40d19394
HB
3097static void add_completion_option(ReadLineState *rs, const char *str,
3098 const char *option)
3099{
3100 if (!str || !option) {
3101 return;
3102 }
3103 if (!strncmp(option, str, strlen(str))) {
3104 readline_add_completion(rs, option);
3105 }
3106}
3107
13e315da
HB
3108void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str)
3109{
3110 size_t len;
3111 ChardevBackendInfoList *list, *start;
3112
3113 if (nb_args != 2) {
3114 return;
3115 }
3116 len = strlen(str);
3117 readline_set_completion_index(rs, len);
3118
3119 start = list = qmp_query_chardev_backends(NULL);
3120 while (list) {
3121 const char *chr_name = list->value->name;
3122
3123 if (!strncmp(chr_name, str, len)) {
3124 readline_add_completion(rs, chr_name);
3125 }
3126 list = list->next;
3127 }
3128 qapi_free_ChardevBackendInfoList(start);
3129}
3130
b162b49a
HB
3131void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str)
3132{
3133 size_t len;
3134 int i;
3135
3136 if (nb_args != 2) {
3137 return;
3138 }
3139 len = strlen(str);
3140 readline_set_completion_index(rs, len);
f394b2e2
EB
3141 for (i = 0; NetClientDriver_lookup[i]; i++) {
3142 add_completion_option(rs, str, NetClientDriver_lookup[i]);
b162b49a
HB
3143 }
3144}
3145
2da1b3ab 3146void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
992d3e64
HB
3147{
3148 GSList *list, *elt;
3149 size_t len;
3150
2da1b3ab
HB
3151 if (nb_args != 2) {
3152 return;
3153 }
3154
992d3e64
HB
3155 len = strlen(str);
3156 readline_set_completion_index(rs, len);
3157 list = elt = object_class_get_list(TYPE_DEVICE, false);
3158 while (elt) {
3159 const char *name;
3160 DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
3161 TYPE_DEVICE);
3162 name = object_class_get_name(OBJECT_CLASS(dc));
2da1b3ab
HB
3163
3164 if (!dc->cannot_instantiate_with_device_add_yet
3165 && !strncmp(name, str, len)) {
992d3e64
HB
3166 readline_add_completion(rs, name);
3167 }
3168 elt = elt->next;
3169 }
3170 g_slist_free(list);
3171}
3172
bfa40f77 3173void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
1094fd3a
HB
3174{
3175 GSList *list, *elt;
3176 size_t len;
3177
bfa40f77
HB
3178 if (nb_args != 2) {
3179 return;
3180 }
3181
1094fd3a
HB
3182 len = strlen(str);
3183 readline_set_completion_index(rs, len);
3184 list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
3185 while (elt) {
3186 const char *name;
3187
3188 name = object_class_get_name(OBJECT_CLASS(elt->data));
3189 if (!strncmp(name, str, len) && strcmp(name, TYPE_USER_CREATABLE)) {
3190 readline_add_completion(rs, name);
3191 }
3192 elt = elt->next;
3193 }
3194 g_slist_free(list);
3195}
3196
6a1fa9f5
ZG
3197static void peripheral_device_del_completion(ReadLineState *rs,
3198 const char *str, size_t len)
3199{
4cae4d5a
MA
3200 Object *peripheral = container_get(qdev_get_machine(), "/peripheral");
3201 GSList *list, *item;
6a1fa9f5 3202
4cae4d5a
MA
3203 list = qdev_build_hotpluggable_device_list(peripheral);
3204 if (!list) {
6a1fa9f5
ZG
3205 return;
3206 }
3207
6a1fa9f5
ZG
3208 for (item = list; item; item = g_slist_next(item)) {
3209 DeviceState *dev = item->data;
3210
3211 if (dev->id && !strncmp(str, dev->id, len)) {
3212 readline_add_completion(rs, dev->id);
3213 }
3214 }
3215
3216 g_slist_free(list);
3217}
3218
6297d9a2
HB
3219void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)
3220{
3221 size_t len;
3222 ChardevInfoList *list, *start;
3223
3224 if (nb_args != 2) {
3225 return;
3226 }
3227 len = strlen(str);
3228 readline_set_completion_index(rs, len);
3229
3230 start = list = qmp_query_chardev(NULL);
3231 while (list) {
3232 ChardevInfo *chr = list->value;
3233
3234 if (!strncmp(chr->label, str, len)) {
3235 readline_add_completion(rs, chr->label);
3236 }
3237 list = list->next;
3238 }
3239 qapi_free_ChardevInfoList(start);
3240}
3241
8e597779
HB
3242static void ringbuf_completion(ReadLineState *rs, const char *str)
3243{
3244 size_t len;
3245 ChardevInfoList *list, *start;
3246
3247 len = strlen(str);
3248 readline_set_completion_index(rs, len);
3249
3250 start = list = qmp_query_chardev(NULL);
3251 while (list) {
3252 ChardevInfo *chr_info = list->value;
3253
3254 if (!strncmp(chr_info->label, str, len)) {
3255 CharDriverState *chr = qemu_chr_find(chr_info->label);
3256 if (chr && chr_is_ringbuf(chr)) {
3257 readline_add_completion(rs, chr_info->label);
3258 }
3259 }
3260 list = list->next;
3261 }
3262 qapi_free_ChardevInfoList(start);
3263}
3264
8e597779
HB
3265void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str)
3266{
3267 if (nb_args != 2) {
3268 return;
3269 }
3270 ringbuf_completion(rs, str);
3271}
3272
2da1b3ab
HB
3273void device_del_completion(ReadLineState *rs, int nb_args, const char *str)
3274{
3275 size_t len;
3276
3277 if (nb_args != 2) {
3278 return;
3279 }
3280
3281 len = strlen(str);
3282 readline_set_completion_index(rs, len);
6a1fa9f5 3283 peripheral_device_del_completion(rs, str, len);
2da1b3ab
HB
3284}
3285
bfa40f77 3286void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
b48fa074
HB
3287{
3288 ObjectPropertyInfoList *list, *start;
3289 size_t len;
3290
bfa40f77
HB
3291 if (nb_args != 2) {
3292 return;
3293 }
b48fa074
HB
3294 len = strlen(str);
3295 readline_set_completion_index(rs, len);
3296
3297 start = list = qmp_qom_list("/objects", NULL);
3298 while (list) {
3299 ObjectPropertyInfo *info = list->value;
3300
3301 if (!strncmp(info->type, "child<", 5)
3302 && !strncmp(info->name, str, len)) {
3303 readline_add_completion(rs, info->name);
3304 }
3305 list = list->next;
3306 }
3307 qapi_free_ObjectPropertyInfoList(start);
3308}
3309
29136cd8
HB
3310void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
3311{
3312 int i;
3313 char *sep;
3314 size_t len;
3315
3316 if (nb_args != 2) {
3317 return;
3318 }
3319 sep = strrchr(str, '-');
3320 if (sep) {
3321 str = sep + 1;
3322 }
3323 len = strlen(str);
3324 readline_set_completion_index(rs, len);
7fb1cf16 3325 for (i = 0; i < Q_KEY_CODE__MAX; i++) {
29136cd8
HB
3326 if (!strncmp(str, QKeyCode_lookup[i], len)) {
3327 readline_add_completion(rs, QKeyCode_lookup[i]);
3328 }
3329 }
3330}
3331
40d19394
HB
3332void set_link_completion(ReadLineState *rs, int nb_args, const char *str)
3333{
3334 size_t len;
3335
3336 len = strlen(str);
3337 readline_set_completion_index(rs, len);
3338 if (nb_args == 2) {
eaed483c 3339 NetClientState *ncs[MAX_QUEUE_NUM];
40d19394
HB
3340 int count, i;
3341 count = qemu_find_net_clients_except(NULL, ncs,
f394b2e2 3342 NET_CLIENT_DRIVER_NONE,
eaed483c 3343 MAX_QUEUE_NUM);
bcfa4d60 3344 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
40d19394
HB
3345 const char *name = ncs[i]->name;
3346 if (!strncmp(str, name, len)) {
3347 readline_add_completion(rs, name);
3348 }
3349 }
3350 } else if (nb_args == 3) {
3351 add_completion_option(rs, str, "on");
3352 add_completion_option(rs, str, "off");
3353 }
3354}
3355
11b389f2
HB
3356void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str)
3357{
3358 int len, count, i;
eaed483c 3359 NetClientState *ncs[MAX_QUEUE_NUM];
11b389f2
HB
3360
3361 if (nb_args != 2) {
3362 return;
3363 }
3364
3365 len = strlen(str);
3366 readline_set_completion_index(rs, len);
f394b2e2 3367 count = qemu_find_net_clients_except(NULL, ncs, NET_CLIENT_DRIVER_NIC,
eaed483c 3368 MAX_QUEUE_NUM);
bcfa4d60 3369 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
11b389f2
HB
3370 QemuOpts *opts;
3371 const char *name = ncs[i]->name;
3372 if (strncmp(str, name, len)) {
3373 continue;
3374 }
3375 opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), name);
3376 if (opts) {
3377 readline_add_completion(rs, name);
3378 }
3379 }
3380}
3381
bd71211d
LV
3382void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *str)
3383{
3384 size_t len;
3385
3386 len = strlen(str);
3387 readline_set_completion_index(rs, len);
3388 if (nb_args == 2) {
3389 TraceEventID id;
3390 for (id = 0; id < trace_event_count(); id++) {
3391 const char *event_name = trace_event_get_name(trace_event_id(id));
3392 if (!strncmp(str, event_name, len)) {
3393 readline_add_completion(rs, event_name);
3394 }
3395 }
3396 }
3397}
3398
987bd270
DDAG
3399void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
3400{
3401 size_t len;
3402
3403 len = strlen(str);
3404 readline_set_completion_index(rs, len);
3405 if (nb_args == 2) {
3406 TraceEventID id;
3407 for (id = 0; id < trace_event_count(); id++) {
3408 const char *event_name = trace_event_get_name(trace_event_id(id));
3409 if (!strncmp(str, event_name, len)) {
3410 readline_add_completion(rs, event_name);
3411 }
3412 }
3413 } else if (nb_args == 3) {
3414 add_completion_option(rs, str, "on");
3415 add_completion_option(rs, str, "off");
3416 }
3417}
3418
d0ece345
HB
3419void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
3420{
4bb08af3
HB
3421 int i;
3422
d0ece345
HB
3423 if (nb_args != 2) {
3424 return;
3425 }
3426 readline_set_completion_index(rs, strlen(str));
4bb08af3
HB
3427 for (i = 0; WatchdogExpirationAction_lookup[i]; i++) {
3428 add_completion_option(rs, str, WatchdogExpirationAction_lookup[i]);
3429 }
d0ece345
HB
3430}
3431
c68a0409
HB
3432void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
3433 const char *str)
3434{
3435 size_t len;
3436
3437 len = strlen(str);
3438 readline_set_completion_index(rs, len);
3439 if (nb_args == 2) {
3440 int i;
7fb1cf16 3441 for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
c68a0409
HB
3442 const char *name = MigrationCapability_lookup[i];
3443 if (!strncmp(str, name, len)) {
3444 readline_add_completion(rs, name);
3445 }
3446 }
3447 } else if (nb_args == 3) {
3448 add_completion_option(rs, str, "on");
3449 add_completion_option(rs, str, "off");
3450 }
3451}
3452
50e9a629
LL
3453void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
3454 const char *str)
3455{
3456 size_t len;
3457
3458 len = strlen(str);
3459 readline_set_completion_index(rs, len);
3460 if (nb_args == 2) {
3461 int i;
7fb1cf16 3462 for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
50e9a629
LL
3463 const char *name = MigrationParameter_lookup[i];
3464 if (!strncmp(str, name, len)) {
3465 readline_add_completion(rs, name);
3466 }
3467 }
3468 }
3469}
3470
e3bb532c
HB
3471void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str)
3472{
3473 int i;
3474 size_t len;
3475 if (nb_args != 2) {
3476 return;
3477 }
3478 len = strlen(str);
3479 readline_set_completion_index(rs, len);
3480 for (i = 0; host_net_devices[i]; i++) {
3481 if (!strncmp(host_net_devices[i], str, len)) {
3482 readline_add_completion(rs, host_net_devices[i]);
3483 }
3484 }
3485}
3486
ddd6b45c
HB
3487void host_net_remove_completion(ReadLineState *rs, int nb_args, const char *str)
3488{
eaed483c 3489 NetClientState *ncs[MAX_QUEUE_NUM];
ddd6b45c
HB
3490 int count, i, len;
3491
3492 len = strlen(str);
3493 readline_set_completion_index(rs, len);
3494 if (nb_args == 2) {
3495 count = qemu_find_net_clients_except(NULL, ncs,
f394b2e2 3496 NET_CLIENT_DRIVER_NONE,
eaed483c 3497 MAX_QUEUE_NUM);
bcfa4d60 3498 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
ddd6b45c
HB
3499 int id;
3500 char name[16];
3501
3502 if (net_hub_id_for_client(ncs[i], &id)) {
3503 continue;
3504 }
3505 snprintf(name, sizeof(name), "%d", id);
3506 if (!strncmp(str, name, len)) {
3507 readline_add_completion(rs, name);
3508 }
3509 }
3510 return;
3511 } else if (nb_args == 3) {
3512 count = qemu_find_net_clients_except(NULL, ncs,
f394b2e2 3513 NET_CLIENT_DRIVER_NIC,
eaed483c 3514 MAX_QUEUE_NUM);
bcfa4d60 3515 for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
2c4681f5 3516 int id;
ddd6b45c
HB
3517 const char *name;
3518
f394b2e2 3519 if (ncs[i]->info->type == NET_CLIENT_DRIVER_HUBPORT ||
2c4681f5
JW
3520 net_hub_id_for_client(ncs[i], &id)) {
3521 continue;
3522 }
ddd6b45c
HB
3523 name = ncs[i]->name;
3524 if (!strncmp(str, name, len)) {
3525 readline_add_completion(rs, name);
3526 }
3527 }
3528 return;
3529 }
3530}
3531
b21631f3
HB
3532static void vm_completion(ReadLineState *rs, const char *str)
3533{
3534 size_t len;
7c8eece4 3535 BlockDriverState *bs;
88be7b4b 3536 BdrvNextIterator it;
b21631f3
HB
3537
3538 len = strlen(str);
3539 readline_set_completion_index(rs, len);
7c8eece4 3540
88be7b4b 3541 for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
b21631f3 3542 SnapshotInfoList *snapshots, *snapshot;
6bf1faa8
DL
3543 AioContext *ctx = bdrv_get_aio_context(bs);
3544 bool ok = false;
b21631f3 3545
6bf1faa8
DL
3546 aio_context_acquire(ctx);
3547 if (bdrv_can_snapshot(bs)) {
3548 ok = bdrv_query_snapshot_info_list(bs, &snapshots, NULL) == 0;
b21631f3 3549 }
6bf1faa8
DL
3550 aio_context_release(ctx);
3551 if (!ok) {
b21631f3
HB
3552 continue;
3553 }
6bf1faa8 3554
b21631f3
HB
3555 snapshot = snapshots;
3556 while (snapshot) {
3557 char *completion = snapshot->value->name;
3558 if (!strncmp(str, completion, len)) {
3559 readline_add_completion(rs, completion);
3560 }
3561 completion = snapshot->value->id;
3562 if (!strncmp(str, completion, len)) {
3563 readline_add_completion(rs, completion);
3564 }
3565 snapshot = snapshot->next;
3566 }
3567 qapi_free_SnapshotInfoList(snapshots);
3568 }
3569
3570}
3571
3572void delvm_completion(ReadLineState *rs, int nb_args, const char *str)
3573{
3574 if (nb_args == 2) {
3575 vm_completion(rs, str);
3576 }
3577}
3578
3579void loadvm_completion(ReadLineState *rs, int nb_args, const char *str)
3580{
3581 if (nb_args == 2) {
3582 vm_completion(rs, str);
3583 }
3584}
3585
c35b6400
WX
3586static void monitor_find_completion_by_table(Monitor *mon,
3587 const mon_cmd_t *cmd_table,
3588 char **args,
3589 int nb_args)
81d0912d
FB
3590{
3591 const char *cmdname;
c35b6400 3592 int i;
fea68bb6 3593 const char *ptype, *str, *name;
c227f099 3594 const mon_cmd_t *cmd;
da27a00e 3595 BlockBackend *blk = NULL;
81d0912d 3596
81d0912d
FB
3597 if (nb_args <= 1) {
3598 /* command completion */
3599 if (nb_args == 0)
3600 cmdname = "";
3601 else
3602 cmdname = args[0];
d2674b2c 3603 readline_set_completion_index(mon->rs, strlen(cmdname));
c35b6400 3604 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
cd5c6bba 3605 cmd_completion(mon, cmdname, cmd->name);
81d0912d
FB
3606 }
3607 } else {
3608 /* find the command */
c35b6400 3609 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
03a63484
JK
3610 if (compare_cmd(args[0], cmd->name)) {
3611 break;
3612 }
81d0912d 3613 }
03a63484 3614 if (!cmd->name) {
c35b6400 3615 return;
03a63484
JK
3616 }
3617
d903a779
WX
3618 if (cmd->sub_table) {
3619 /* do the job again */
e7ae771f
SW
3620 monitor_find_completion_by_table(mon, cmd->sub_table,
3621 &args[1], nb_args - 1);
3622 return;
d903a779 3623 }
bfa40f77 3624 if (cmd->command_completion) {
e7ae771f
SW
3625 cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
3626 return;
bfa40f77 3627 }
d903a779 3628
4d76d2ba 3629 ptype = next_arg_type(cmd->args_type);
81d0912d
FB
3630 for(i = 0; i < nb_args - 2; i++) {
3631 if (*ptype != '\0') {
4d76d2ba 3632 ptype = next_arg_type(ptype);
81d0912d 3633 while (*ptype == '?')
4d76d2ba 3634 ptype = next_arg_type(ptype);
81d0912d
FB
3635 }
3636 }
3637 str = args[nb_args - 1];
48fe86f6 3638 while (*ptype == '-' && ptype[1] != '\0') {
3b6dbf27 3639 ptype = next_arg_type(ptype);
2a1704a7 3640 }
81d0912d
FB
3641 switch(*ptype) {
3642 case 'F':
3643 /* file completion */
d2674b2c 3644 readline_set_completion_index(mon->rs, strlen(str));
cb8f68b1 3645 file_completion(mon, str);
81d0912d
FB
3646 break;
3647 case 'B':
3648 /* block device name completion */
599a926a 3649 readline_set_completion_index(mon->rs, strlen(str));
da27a00e
HR
3650 while ((blk = blk_next(blk)) != NULL) {
3651 name = blk_name(blk);
fea68bb6
MA
3652 if (str[0] == '\0' ||
3653 !strncmp(name, str, strlen(str))) {
3654 readline_add_completion(mon->rs, name);
3655 }
3656 }
81d0912d 3657 break;
7fe48483 3658 case 's':
129be006 3659 case 'S':
29136cd8 3660 if (!strcmp(cmd->name, "help|?")) {
7ca0e061
WX
3661 monitor_find_completion_by_table(mon, cmd_table,
3662 &args[1], nb_args - 1);
7fe48483
FB
3663 }
3664 break;
81d0912d
FB
3665 default:
3666 break;
3667 }
3668 }
c35b6400
WX
3669}
3670
c60bf339 3671static void monitor_find_completion(void *opaque,
c35b6400
WX
3672 const char *cmdline)
3673{
c60bf339 3674 Monitor *mon = opaque;
c35b6400
WX
3675 char *args[MAX_ARGS];
3676 int nb_args, len;
3677
3678 /* 1. parse the cmdline */
3679 if (parse_cmdline(cmdline, &nb_args, args) < 0) {
3680 return;
3681 }
c35b6400
WX
3682
3683 /* if the line ends with a space, it means we want to complete the
3684 next arg */
3685 len = strlen(cmdline);
3686 if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3687 if (nb_args >= MAX_ARGS) {
3688 goto cleanup;
3689 }
3690 args[nb_args++] = g_strdup("");
3691 }
3692
3693 /* 2. auto complete according to args */
3694 monitor_find_completion_by_table(mon, mon->cmd_table, args, nb_args);
03a63484
JK
3695
3696cleanup:
dcc70cdf 3697 free_cmdline_args(args, nb_args);
81d0912d
FB
3698}
3699
731b0364 3700static int monitor_can_read(void *opaque)
9dc39cba 3701{
731b0364
AL
3702 Monitor *mon = opaque;
3703
c62313bb 3704 return (mon->suspend_cnt == 0) ? 1 : 0;
9dc39cba
FB
3705}
3706
d79bedfa 3707static bool invalid_qmp_mode(const Monitor *mon, const char *cmd,
4086182f 3708 Error **errp)
5fa737a4 3709{
d79bedfa 3710 bool is_cap = g_str_equal(cmd, "qmp_capabilities");
f994b258
MA
3711
3712 if (is_cap && mon->qmp.in_command_mode) {
4086182f
MA
3713 error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
3714 "Capabilities negotiation is already complete, command "
d79bedfa 3715 "'%s' ignored", cmd);
2d5a8346
EB
3716 return true;
3717 }
f994b258 3718 if (!is_cap && !mon->qmp.in_command_mode) {
4086182f
MA
3719 error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
3720 "Expecting capabilities negotiation with "
d79bedfa 3721 "'qmp_capabilities' before command '%s'", cmd);
2d5a8346
EB
3722 return true;
3723 }
3724 return false;
5fa737a4
LC
3725}
3726
4af9193a
LC
3727/*
3728 * Argument validation rules:
3729 *
3730 * 1. The argument must exist in cmd_args qdict
3731 * 2. The argument type must be the expected one
3732 *
3733 * Special case: If the argument doesn't exist in cmd_args and
3734 * the QMP_ACCEPT_UNKNOWNS flag is set, then the
3735 * checking is skipped for it.
3736 */
326283aa
MA
3737static void check_client_args_type(const QDict *client_args,
3738 const QDict *cmd_args, int flags,
3739 Error **errp)
5fa737a4 3740{
4af9193a 3741 const QDictEntry *ent;
5fa737a4 3742
4af9193a
LC
3743 for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){
3744 QObject *obj;
3745 QString *arg_type;
3746 const QObject *client_arg = qdict_entry_value(ent);
3747 const char *client_arg_name = qdict_entry_key(ent);
3748
3749 obj = qdict_get(cmd_args, client_arg_name);
3750 if (!obj) {
3751 if (flags & QMP_ACCEPT_UNKNOWNS) {
3752 /* handler accepts unknowns */
3753 continue;
3754 }
3755 /* client arg doesn't exist */
c6bd8c70 3756 error_setg(errp, QERR_INVALID_PARAMETER, client_arg_name);
326283aa 3757 return;
4af9193a 3758 }
5fa737a4 3759
4af9193a
LC
3760 arg_type = qobject_to_qstring(obj);
3761 assert(arg_type != NULL);
5fa737a4 3762
4af9193a
LC
3763 /* check if argument's type is correct */
3764 switch (qstring_get_str(arg_type)[0]) {
5fa737a4
LC
3765 case 'F':
3766 case 'B':
3767 case 's':
4af9193a 3768 if (qobject_type(client_arg) != QTYPE_QSTRING) {
c6bd8c70
MA
3769 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3770 client_arg_name, "string");
326283aa 3771 return;
5fa737a4 3772 }
4af9193a 3773 break;
5fa737a4
LC
3774 case 'i':
3775 case 'l':
b6e098d7 3776 case 'M':
dbc0c67f 3777 case 'o':
4af9193a 3778 if (qobject_type(client_arg) != QTYPE_QINT) {
c6bd8c70
MA
3779 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3780 client_arg_name, "int");
326283aa 3781 return;
5fa737a4
LC
3782 }
3783 break;
fccfb11e 3784 case 'T':
4af9193a
LC
3785 if (qobject_type(client_arg) != QTYPE_QINT &&
3786 qobject_type(client_arg) != QTYPE_QFLOAT) {
c6bd8c70
MA
3787 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3788 client_arg_name, "number");
326283aa 3789 return;
3350a4dd
MA
3790 }
3791 break;
942cd1f2 3792 case 'b':
5fa737a4 3793 case '-':
4af9193a 3794 if (qobject_type(client_arg) != QTYPE_QBOOL) {
c6bd8c70
MA
3795 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3796 client_arg_name, "bool");
326283aa 3797 return;
5fa737a4
LC
3798 }
3799 break;
361127df 3800 case 'O':
4af9193a
LC
3801 assert(flags & QMP_ACCEPT_UNKNOWNS);
3802 break;
b9f8978c
PB
3803 case 'q':
3804 /* Any QObject can be passed. */
3805 break;
4af9193a
LC
3806 case '/':
3807 case '.':
3808 /*
3809 * These types are not supported by QMP and thus are not
3810 * handled here. Fall through.
3811 */
5fa737a4 3812 default:
5fa737a4 3813 abort();
4af9193a
LC
3814 }
3815 }
4af9193a
LC
3816}
3817
2dbc8db0
LC
3818/*
3819 * - Check if the client has passed all mandatory args
3820 * - Set special flags for argument validation
3821 */
326283aa
MA
3822static void check_mandatory_args(const QDict *cmd_args,
3823 const QDict *client_args, int *flags,
3824 Error **errp)
2dbc8db0
LC
3825{
3826 const QDictEntry *ent;
3827
3828 for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) {
3829 const char *cmd_arg_name = qdict_entry_key(ent);
3830 QString *type = qobject_to_qstring(qdict_entry_value(ent));
3831 assert(type != NULL);
3832
3833 if (qstring_get_str(type)[0] == 'O') {
3834 assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0);
3835 *flags |= QMP_ACCEPT_UNKNOWNS;
3836 } else if (qstring_get_str(type)[0] != '-' &&
3837 qstring_get_str(type)[1] != '?' &&
3838 !qdict_haskey(client_args, cmd_arg_name)) {
c6bd8c70 3839 error_setg(errp, QERR_MISSING_PARAMETER, cmd_arg_name);
326283aa 3840 return;
2dbc8db0 3841 }
5fa737a4 3842 }
5fa737a4
LC
3843}
3844
2dbc8db0 3845static QDict *qdict_from_args_type(const char *args_type)
5fa737a4 3846{
2dbc8db0
LC
3847 int i;
3848 QDict *qdict;
3849 QString *key, *type, *cur_qs;
3850
3851 assert(args_type != NULL);
3852
3853 qdict = qdict_new();
3854
3855 if (args_type == NULL || args_type[0] == '\0') {
3856 /* no args, empty qdict */
3857 goto out;
3858 }
3859
3860 key = qstring_new();
3861 type = qstring_new();
3862
3863 cur_qs = key;
3864
3865 for (i = 0;; i++) {
3866 switch (args_type[i]) {
3867 case ',':
3868 case '\0':
3869 qdict_put(qdict, qstring_get_str(key), type);
3870 QDECREF(key);
3871 if (args_type[i] == '\0') {
3872 goto out;
3873 }
3874 type = qstring_new(); /* qdict has ref */
3875 cur_qs = key = qstring_new();
3876 break;
3877 case ':':
3878 cur_qs = type;
3879 break;
3880 default:
3881 qstring_append_chr(cur_qs, args_type[i]);
3882 break;
3883 }
3884 }
3885
3886out:
3887 return qdict;
5fa737a4
LC
3888}
3889
2dbc8db0
LC
3890/*
3891 * Client argument checking rules:
3892 *
3893 * 1. Client must provide all mandatory arguments
4af9193a
LC
3894 * 2. Each argument provided by the client must be expected
3895 * 3. Each argument provided by the client must have the type expected
3896 * by the command
2dbc8db0 3897 */
326283aa
MA
3898static void qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args,
3899 Error **errp)
361127df 3900{
326283aa
MA
3901 Error *err = NULL;
3902 int flags;
2dbc8db0
LC
3903 QDict *cmd_args;
3904
3905 cmd_args = qdict_from_args_type(cmd->args_type);
3906
3907 flags = 0;
326283aa 3908 check_mandatory_args(cmd_args, client_args, &flags, &err);
2dbc8db0
LC
3909 if (err) {
3910 goto out;
3911 }
3912
326283aa 3913 check_client_args_type(client_args, cmd_args, flags, &err);
2dbc8db0
LC
3914
3915out:
326283aa 3916 error_propagate(errp, err);
2dbc8db0 3917 QDECREF(cmd_args);
361127df
MA
3918}
3919
5fa737a4 3920/*
c917c8f3 3921 * Input object checking rules
5fa737a4 3922 *
c917c8f3
LC
3923 * 1. Input object must be a dict
3924 * 2. The "execute" key must exist
3925 * 3. The "execute" key must be a string
3926 * 4. If the "arguments" key exists, it must be a dict
3927 * 5. If the "id" key exists, it can be anything (ie. json-value)
3928 * 6. Any argument not listed above is considered invalid
5fa737a4 3929 */
ba0510aa 3930static QDict *qmp_check_input_obj(QObject *input_obj, Error **errp)
5fa737a4 3931{
c917c8f3
LC
3932 const QDictEntry *ent;
3933 int has_exec_key = 0;
3934 QDict *input_dict;
5fa737a4 3935
c917c8f3 3936 if (qobject_type(input_obj) != QTYPE_QDICT) {
c6bd8c70 3937 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
c917c8f3 3938 return NULL;
5fa737a4
LC
3939 }
3940
c917c8f3 3941 input_dict = qobject_to_qdict(input_obj);
5fa737a4 3942
c917c8f3
LC
3943 for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
3944 const char *arg_name = qdict_entry_key(ent);
3945 const QObject *arg_obj = qdict_entry_value(ent);
5fa737a4 3946
c917c8f3
LC
3947 if (!strcmp(arg_name, "execute")) {
3948 if (qobject_type(arg_obj) != QTYPE_QSTRING) {
c6bd8c70
MA
3949 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
3950 "execute", "string");
c917c8f3 3951 return NULL;
361127df 3952 }
c917c8f3
LC
3953 has_exec_key = 1;
3954 } else if (!strcmp(arg_name, "arguments")) {
3955 if (qobject_type(arg_obj) != QTYPE_QDICT) {
c6bd8c70
MA
3956 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
3957 "arguments", "object");
c917c8f3 3958 return NULL;
5fa737a4 3959 }
779cec4d
MA
3960 } else if (!strcmp(arg_name, "id")) {
3961 /* Any string is acceptable as "id", so nothing to check */
5fa737a4 3962 } else {
c6bd8c70 3963 error_setg(errp, QERR_QMP_EXTRA_MEMBER, arg_name);
c917c8f3 3964 return NULL;
5fa737a4
LC
3965 }
3966 }
3967
c917c8f3 3968 if (!has_exec_key) {
c6bd8c70 3969 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "execute");
c917c8f3
LC
3970 return NULL;
3971 }
5fa737a4 3972
c917c8f3 3973 return input_dict;
09069b19
LC
3974}
3975
95385fe9 3976static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
5fa737a4 3977{
326283aa 3978 Error *local_err = NULL;
84add864 3979 QObject *obj, *data;
5fa737a4 3980 QDict *input, *args;
5fa737a4 3981 const mon_cmd_t *cmd;
c823501e 3982 QmpCommand *qcmd;
40e5a01d 3983 const char *cmd_name;
5fa737a4
LC
3984 Monitor *mon = cur_mon;
3985
e4940c60 3986 args = input = NULL;
84add864 3987 data = NULL;
5fa737a4
LC
3988
3989 obj = json_parser_parse(tokens, NULL);
3990 if (!obj) {
3991 // FIXME: should be triggered in json_parser_parse()
c6bd8c70 3992 error_setg(&local_err, QERR_JSON_PARSING);
5fa737a4 3993 goto err_out;
5fa737a4
LC
3994 }
3995
ba0510aa 3996 input = qmp_check_input_obj(obj, &local_err);
c917c8f3 3997 if (!input) {
5fa737a4
LC
3998 qobject_decref(obj);
3999 goto err_out;
4000 }
4001
74358f2a
MA
4002 mon->qmp.id = qdict_get(input, "id");
4003 qobject_incref(mon->qmp.id);
5fa737a4 4004
0bbab46d 4005 cmd_name = qdict_get_str(input, "execute");
89bd820a 4006 trace_handle_qmp_command(mon, cmd_name);
e3193601 4007 cmd = qmp_find_cmd(cmd_name);
c823501e
MAL
4008 qcmd = qmp_find_command(cmd_name);
4009 if (!qcmd || !cmd) {
710aec91
MA
4010 error_set(&local_err, ERROR_CLASS_COMMAND_NOT_FOUND,
4011 "The command %s has not been found", cmd_name);
e4940c60 4012 goto err_out;
5fa737a4 4013 }
d79bedfa 4014 if (invalid_qmp_mode(mon, cmd_name, &local_err)) {
2d5a8346
EB
4015 goto err_out;
4016 }
5fa737a4
LC
4017
4018 obj = qdict_get(input, "arguments");
4019 if (!obj) {
4020 args = qdict_new();
4021 } else {
4022 args = qobject_to_qdict(obj);
4023 QINCREF(args);
4024 }
4025
326283aa
MA
4026 qmp_check_client_args(cmd, args, &local_err);
4027 if (local_err) {
5fa737a4
LC
4028 goto err_out;
4029 }
4030
c823501e 4031 qcmd->fn(args, &data, &local_err);
5fa737a4 4032
5fa737a4 4033err_out:
710aec91 4034 monitor_protocol_emitter(mon, data, local_err);
84add864 4035 qobject_decref(data);
3a81a101 4036 error_free(local_err);
e4940c60 4037 QDECREF(input);
5fa737a4 4038 QDECREF(args);
5fa737a4
LC
4039}
4040
c83fe23b 4041static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size)
9b57c02e
LC
4042{
4043 Monitor *old_mon = cur_mon;
4044
4045 cur_mon = opaque;
4046
74358f2a 4047 json_message_parser_feed(&cur_mon->qmp.parser, (const char *) buf, size);
9b57c02e
LC
4048
4049 cur_mon = old_mon;
4050}
4051
731b0364 4052static void monitor_read(void *opaque, const uint8_t *buf, int size)
9dc39cba 4053{
731b0364 4054 Monitor *old_mon = cur_mon;
7e2515e8 4055 int i;
376253ec 4056
731b0364
AL
4057 cur_mon = opaque;
4058
cde76ee1
AL
4059 if (cur_mon->rs) {
4060 for (i = 0; i < size; i++)
4061 readline_handle_byte(cur_mon->rs, buf[i]);
4062 } else {
4063 if (size == 0 || buf[size - 1] != 0)
4064 monitor_printf(cur_mon, "corrupted command\n");
4065 else
7ef6cf63 4066 handle_hmp_command(cur_mon, (char *)buf);
cde76ee1 4067 }
9dc39cba 4068
731b0364
AL
4069 cur_mon = old_mon;
4070}
d8f44609 4071
c60bf339
SH
4072static void monitor_command_cb(void *opaque, const char *cmdline,
4073 void *readline_opaque)
aa455485 4074{
c60bf339
SH
4075 Monitor *mon = opaque;
4076
731b0364 4077 monitor_suspend(mon);
7ef6cf63 4078 handle_hmp_command(mon, cmdline);
731b0364 4079 monitor_resume(mon);
d8f44609
AL
4080}
4081
cde76ee1 4082int monitor_suspend(Monitor *mon)
d8f44609 4083{
cde76ee1
AL
4084 if (!mon->rs)
4085 return -ENOTTY;
731b0364 4086 mon->suspend_cnt++;
cde76ee1 4087 return 0;
d8f44609
AL
4088}
4089
376253ec 4090void monitor_resume(Monitor *mon)
d8f44609 4091{
cde76ee1
AL
4092 if (!mon->rs)
4093 return;
731b0364
AL
4094 if (--mon->suspend_cnt == 0)
4095 readline_show_prompt(mon->rs);
aa455485
FB
4096}
4097
ca9567e2
LC
4098static QObject *get_qmp_greeting(void)
4099{
b9c15f16 4100 QObject *ver = NULL;
ca9567e2 4101
7fad30f0 4102 qmp_marshal_query_version(NULL, &ver, NULL);
c823501e
MAL
4103
4104 return qobject_from_jsonf("{'QMP': {'version': %p, 'capabilities': []}}",
4105 ver);
ca9567e2
LC
4106}
4107
c83fe23b 4108static void monitor_qmp_event(void *opaque, int event)
9b57c02e 4109{
47116d1c
LC
4110 QObject *data;
4111 Monitor *mon = opaque;
9b57c02e 4112
47116d1c
LC
4113 switch (event) {
4114 case CHR_EVENT_OPENED:
f994b258 4115 mon->qmp.in_command_mode = false;
ca9567e2 4116 data = get_qmp_greeting();
9b57c02e
LC
4117 monitor_json_emitter(mon, data);
4118 qobject_decref(data);
efb87c16 4119 mon_refcount++;
47116d1c
LC
4120 break;
4121 case CHR_EVENT_CLOSED:
74358f2a
MA
4122 json_message_parser_destroy(&mon->qmp.parser);
4123 json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
efb87c16
CB
4124 mon_refcount--;
4125 monitor_fdsets_cleanup();
47116d1c 4126 break;
9b57c02e
LC
4127 }
4128}
4129
731b0364 4130static void monitor_event(void *opaque, int event)
86e94dea 4131{
376253ec
AL
4132 Monitor *mon = opaque;
4133
2724b180
AL
4134 switch (event) {
4135 case CHR_EVENT_MUX_IN:
6cff3e85 4136 qemu_mutex_lock(&mon->out_lock);
a7aec5da 4137 mon->mux_out = 0;
6cff3e85 4138 qemu_mutex_unlock(&mon->out_lock);
a7aec5da
GH
4139 if (mon->reset_seen) {
4140 readline_restart(mon->rs);
4141 monitor_resume(mon);
4142 monitor_flush(mon);
4143 } else {
4144 mon->suspend_cnt = 0;
4145 }
2724b180
AL
4146 break;
4147
4148 case CHR_EVENT_MUX_OUT:
a7aec5da
GH
4149 if (mon->reset_seen) {
4150 if (mon->suspend_cnt == 0) {
4151 monitor_printf(mon, "\n");
4152 }
4153 monitor_flush(mon);
4154 monitor_suspend(mon);
4155 } else {
4156 mon->suspend_cnt++;
4157 }
6cff3e85 4158 qemu_mutex_lock(&mon->out_lock);
a7aec5da 4159 mon->mux_out = 1;
6cff3e85 4160 qemu_mutex_unlock(&mon->out_lock);
2724b180 4161 break;
86e94dea 4162
b6b8df56 4163 case CHR_EVENT_OPENED:
2724b180
AL
4164 monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4165 "information\n", QEMU_VERSION);
a7aec5da 4166 if (!mon->mux_out) {
e5554e20 4167 readline_restart(mon->rs);
2724b180 4168 readline_show_prompt(mon->rs);
a7aec5da
GH
4169 }
4170 mon->reset_seen = 1;
efb87c16
CB
4171 mon_refcount++;
4172 break;
4173
4174 case CHR_EVENT_CLOSED:
4175 mon_refcount--;
4176 monitor_fdsets_cleanup();
2724b180
AL
4177 break;
4178 }
86e94dea
TS
4179}
4180
816f8925
WX
4181static int
4182compare_mon_cmd(const void *a, const void *b)
4183{
4184 return strcmp(((const mon_cmd_t *)a)->name,
4185 ((const mon_cmd_t *)b)->name);
4186}
4187
4188static void sortcmdlist(void)
4189{
4190 int array_num;
4191 int elem_size = sizeof(mon_cmd_t);
4192
4193 array_num = sizeof(mon_cmds)/elem_size-1;
4194 qsort((void *)mon_cmds, array_num, elem_size, compare_mon_cmd);
4195
4196 array_num = sizeof(info_cmds)/elem_size-1;
4197 qsort((void *)info_cmds, array_num, elem_size, compare_mon_cmd);
4198}
4199
c60bf339
SH
4200/* These functions just adapt the readline interface in a typesafe way. We
4201 * could cast function pointers but that discards compiler checks.
4202 */
d5d1507b
SW
4203static void GCC_FMT_ATTR(2, 3) monitor_readline_printf(void *opaque,
4204 const char *fmt, ...)
c60bf339
SH
4205{
4206 va_list ap;
4207 va_start(ap, fmt);
4208 monitor_vprintf(opaque, fmt, ap);
4209 va_end(ap);
4210}
4211
4212static void monitor_readline_flush(void *opaque)
4213{
4214 monitor_flush(opaque);
4215}
4216
d622cb58
PB
4217static void __attribute__((constructor)) monitor_lock_init(void)
4218{
4219 qemu_mutex_init(&monitor_lock);
4220}
4221
731b0364 4222void monitor_init(CharDriverState *chr, int flags)
aa455485 4223{
731b0364 4224 static int is_first_init = 1;
87127161 4225 Monitor *mon;
20d8a3ed
TS
4226
4227 if (is_first_init) {
43a14cfc 4228 monitor_qapi_event_init();
d038317c 4229 sortcmdlist();
20d8a3ed
TS
4230 is_first_init = 0;
4231 }
87127161 4232
b01fe89e
WX
4233 mon = g_malloc(sizeof(*mon));
4234 monitor_data_init(mon);
20d8a3ed 4235
87127161 4236 mon->chr = chr;
731b0364 4237 mon->flags = flags;
cde76ee1 4238 if (flags & MONITOR_USE_READLINE) {
c60bf339
SH
4239 mon->rs = readline_init(monitor_readline_printf,
4240 monitor_readline_flush,
4241 mon,
4242 monitor_find_completion);
cde76ee1
AL
4243 monitor_read_command(mon, 0);
4244 }
87127161 4245
9f3982f2 4246 if (monitor_is_qmp(mon)) {
c83fe23b
MA
4247 qemu_chr_add_handlers(chr, monitor_can_read, monitor_qmp_read,
4248 monitor_qmp_event, mon);
15f31519 4249 qemu_chr_fe_set_echo(chr, true);
74358f2a 4250 json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
9b57c02e
LC
4251 } else {
4252 qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
4253 monitor_event, mon);
4254 }
87127161 4255
d622cb58 4256 qemu_mutex_lock(&monitor_lock);
72cf2d4f 4257 QLIST_INSERT_HEAD(&mon_list, mon, entry);
d622cb58 4258 qemu_mutex_unlock(&monitor_lock);
aa455485
FB
4259}
4260
2ef45716
MAL
4261void monitor_cleanup(void)
4262{
4263 Monitor *mon, *next;
4264
4265 qemu_mutex_lock(&monitor_lock);
4266 QLIST_FOREACH_SAFE(mon, &mon_list, entry, next) {
4267 QLIST_REMOVE(mon, entry);
4268 monitor_data_destroy(mon);
4269 g_free(mon);
4270 }
4271 qemu_mutex_unlock(&monitor_lock);
4272}
4273
c60bf339
SH
4274static void bdrv_password_cb(void *opaque, const char *password,
4275 void *readline_opaque)
81d0912d 4276{
c60bf339
SH
4277 Monitor *mon = opaque;
4278 BlockDriverState *bs = readline_opaque;
bb5fc20f 4279 int ret = 0;
4d2855a3 4280 Error *local_err = NULL;
81d0912d 4281
4d2855a3
MA
4282 bdrv_add_key(bs, password, &local_err);
4283 if (local_err) {
193227f9 4284 error_report_err(local_err);
bb5fc20f 4285 ret = -EPERM;
9dc39cba 4286 }
731b0364
AL
4287 if (mon->password_completion_cb)
4288 mon->password_completion_cb(mon->password_opaque, ret);
bb5fc20f 4289
731b0364 4290 monitor_read_command(mon, 1);
9dc39cba 4291}
c0f4ce77 4292
0bbc47bb 4293int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
097310b5 4294 BlockCompletionFunc *completion_cb,
0bbc47bb 4295 void *opaque)
c0f4ce77 4296{
cde76ee1
AL
4297 int err;
4298
376253ec
AL
4299 monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
4300 bdrv_get_encrypted_filename(bs));
bb5fc20f 4301
731b0364
AL
4302 mon->password_completion_cb = completion_cb;
4303 mon->password_opaque = opaque;
bb5fc20f 4304
cde76ee1
AL
4305 err = monitor_read_password(mon, bdrv_password_cb, bs);
4306
4307 if (err && completion_cb)
4308 completion_cb(opaque, err);
0bbc47bb
LC
4309
4310 return err;
c0f4ce77 4311}
e42e818b
LC
4312
4313int monitor_read_block_device_key(Monitor *mon, const char *device,
097310b5 4314 BlockCompletionFunc *completion_cb,
e42e818b
LC
4315 void *opaque)
4316{
9b14e0ef 4317 Error *err = NULL;
5560625b 4318 BlockBackend *blk;
e42e818b 4319
5560625b
FZ
4320 blk = blk_by_name(device);
4321 if (!blk) {
e42e818b
LC
4322 monitor_printf(mon, "Device not found %s\n", device);
4323 return -1;
4324 }
5433c24f
HR
4325 if (!blk_bs(blk)) {
4326 monitor_printf(mon, "Device '%s' has no medium\n", device);
4327 return -1;
4328 }
e42e818b 4329
9b14e0ef
MA
4330 bdrv_add_key(blk_bs(blk), NULL, &err);
4331 if (err) {
4332 error_free(err);
4333 return monitor_read_bdrv_key_start(mon, blk_bs(blk), completion_cb, opaque);
4334 }
4335
4336 if (completion_cb) {
4337 completion_cb(opaque, 0);
4338 }
4339 return 0;
e42e818b 4340}
4d454574
PB
4341
4342QemuOptsList qemu_mon_opts = {
4343 .name = "mon",
4344 .implied_opt_name = "chardev",
4345 .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
4346 .desc = {
4347 {
4348 .name = "mode",
4349 .type = QEMU_OPT_STRING,
4350 },{
4351 .name = "chardev",
4352 .type = QEMU_OPT_STRING,
4353 },{
4354 .name = "default",
4355 .type = QEMU_OPT_BOOL,
4356 },{
4357 .name = "pretty",
4358 .type = QEMU_OPT_BOOL,
4359 },
4360 { /* end of list */ }
4361 },
4362};
f2ae8abf
MT
4363
4364#ifndef TARGET_I386
4365void qmp_rtc_reset_reinjection(Error **errp)
4366{
c6bd8c70 4367 error_setg(errp, QERR_FEATURE_DISABLED, "rtc-reset-reinjection");
f2ae8abf
MT
4368}
4369#endif
7ee0c3e3
JH
4370
4371#ifndef TARGET_S390X
4372void qmp_dump_skeys(const char *filename, Error **errp)
4373{
4374 error_setg(errp, QERR_FEATURE_DISABLED, "dump-skeys");
4375}
4376#endif
ae50a770
PX
4377
4378#ifndef TARGET_ARM
4379GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
4380{
4381 error_setg(errp, QERR_FEATURE_DISABLED, "query-gic-capabilities");
4382 return NULL;
4383}
4384#endif
d4633541
IM
4385
4386HotpluggableCPUList *qmp_query_hotpluggable_cpus(Error **errp)
4387{
4388 MachineState *ms = MACHINE(qdev_get_machine());
4389 MachineClass *mc = MACHINE_GET_CLASS(ms);
4390
4391 if (!mc->query_hotpluggable_cpus) {
4392 error_setg(errp, QERR_FEATURE_DISABLED, "query-hotpluggable-cpus");
4393 return NULL;
4394 }
4395
4396 return mc->query_hotpluggable_cpus(ms);
4397}