Lines Matching +full:0 +full:- +full:mon
4 * Copyright (c) 2003-2004 Fabrice Bellard
27 #include "hw/qdev-core.h"
28 #include "monitor-internal.h"
32 #include "qemu/config-file.h"
38 #include "sysemu/block-backend.h"
44 MonitorHMP *mon = opaque; in monitor_command_cb() local
46 monitor_suspend(&mon->common); in monitor_command_cb()
47 handle_hmp_command(mon, cmdline); in monitor_command_cb()
48 monitor_resume(&mon->common); in monitor_command_cb()
51 void monitor_read_command(MonitorHMP *mon, int show_prompt) in monitor_read_command() argument
53 if (!mon->rs) { in monitor_read_command()
57 readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL); in monitor_read_command()
59 readline_show_prompt(mon->rs); in monitor_read_command()
63 int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func, in monitor_read_password() argument
66 if (mon->rs) { in monitor_read_password()
67 readline_start(mon->rs, "Password: ", 1, readline_func, opaque); in monitor_read_password()
69 return 0; in monitor_read_password()
71 monitor_printf(&mon->common, in monitor_read_password()
73 return -ENOTTY; in monitor_read_password()
88 if (*p == '\0') { in get_str()
90 *q = '\0'; in get_str()
92 return -1; in get_str()
96 while (*p != '\0' && *p != '\"') { in get_str()
115 if ((q - buf) < buf_size - 1) { in get_str()
119 if ((q - buf) < buf_size - 1) { in get_str()
131 while (*p != '\0' && !qemu_isspace(*p)) { in get_str()
132 if ((q - buf) < buf_size - 1) { in get_str()
138 *q = '\0'; in get_str()
140 return 0; in get_str()
151 for (i = 0; i < nb_args; i++) { in free_cmdline_args()
164 * Returns 0 on success, negative on failure.
178 nb_args = 0; in parse_cmdline()
183 if (*p == '\0') { in parse_cmdline()
190 if (ret < 0) { in parse_cmdline()
197 return 0; in parse_cmdline()
201 return -1; in parse_cmdline()
209 if (!cmd->flags) { in cmd_can_preconfig()
213 return strchr(cmd->flags, 'p'); in cmd_can_preconfig()
221 static void help_cmd_dump_one(Monitor *mon, in help_cmd_dump_one() argument
232 for (i = 0; i < prefix_args_nb; i++) { in help_cmd_dump_one()
233 monitor_printf(mon, "%s ", prefix_args[i]); in help_cmd_dump_one()
235 monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help); in help_cmd_dump_one()
239 static void help_cmd_dump(Monitor *mon, const HMPCommand *cmds, in help_cmd_dump() argument
247 for (cmd = cmds; cmd->name != NULL; cmd++) { in help_cmd_dump()
248 help_cmd_dump_one(mon, cmd, args, arg_index); in help_cmd_dump()
254 for (cmd = cmds; cmd->name != NULL; cmd++) { in help_cmd_dump()
255 if (hmp_compare_cmd(args[arg_index], cmd->name) && in help_cmd_dump()
257 if (cmd->sub_table) { in help_cmd_dump()
259 help_cmd_dump(mon, cmd->sub_table, in help_cmd_dump()
262 help_cmd_dump_one(mon, cmd, args, arg_index); in help_cmd_dump()
269 monitor_printf(mon, "unknown command: '"); in help_cmd_dump()
270 for (i = 0; i <= arg_index; i++) { in help_cmd_dump()
271 monitor_printf(mon, "%s%s", args[i], i == arg_index ? "'\n" : " "); in help_cmd_dump()
275 void hmp_help_cmd(Monitor *mon, const char *name) in hmp_help_cmd() argument
278 int nb_args = 0; in hmp_help_cmd()
285 monitor_printf(mon, "Log items (comma separated):\n"); in hmp_help_cmd()
286 monitor_printf(mon, "%-15s %s\n", "none", "remove all logs"); in hmp_help_cmd()
287 for (item = qemu_log_items; item->mask != 0; item++) { in hmp_help_cmd()
288 monitor_printf(mon, "%-15s %s\n", item->name, item->help); in hmp_help_cmd()
291 monitor_printf(mon, "trace:PATTERN enable trace events\n"); in hmp_help_cmd()
292 monitor_printf(mon, "\nUse \"log trace:help\" to get a list of " in hmp_help_cmd()
298 if (parse_cmdline(name, &nb_args, args) < 0) { in hmp_help_cmd()
304 help_cmd_dump(mon, hmp_cmds, args, nb_args, 0); in hmp_help_cmd()
315 void expr_error(Monitor *mon, const char *fmt, ...) in expr_error() argument
319 monitor_vprintf(mon, fmt, ap); in expr_error()
320 monitor_printf(mon, "\n"); in expr_error()
327 if (*pch != '\0') { in next()
335 static int64_t expr_sum(Monitor *mon);
337 static int64_t expr_unary(Monitor *mon) in expr_unary() argument
346 n = expr_unary(mon); in expr_unary()
348 case '-': in expr_unary()
350 n = -expr_unary(mon); in expr_unary()
354 n = ~expr_unary(mon); in expr_unary()
358 n = expr_sum(mon); in expr_unary()
360 expr_error(mon, "')' expected"); in expr_unary()
366 if (*pch == '\0') { in expr_unary()
367 expr_error(mon, "character constant expected"); in expr_unary()
372 expr_error(mon, "missing terminating \' character"); in expr_unary()
379 int64_t reg = 0; in expr_unary()
385 (*pch >= '0' && *pch <= '9') || in expr_unary()
387 if ((q - buf) < sizeof(buf) - 1) { in expr_unary()
395 *q = 0; in expr_unary()
396 ret = get_monitor_def(mon, ®, buf); in expr_unary()
397 if (ret < 0) { in expr_unary()
398 expr_error(mon, "unknown register"); in expr_unary()
403 case '\0': in expr_unary()
404 expr_error(mon, "unexpected end of expression"); in expr_unary()
405 n = 0; in expr_unary()
408 errno = 0; in expr_unary()
409 n = strtoull(pch, &p, 0); in expr_unary()
411 expr_error(mon, "number too large"); in expr_unary()
414 expr_error(mon, "invalid char '%c' in expression", *p); in expr_unary()
425 static int64_t expr_prod(Monitor *mon) in expr_prod() argument
430 val = expr_unary(mon); in expr_prod()
437 val2 = expr_unary(mon); in expr_prod()
445 if (val2 == 0) { in expr_prod()
446 expr_error(mon, "division by zero"); in expr_prod()
459 static int64_t expr_logic(Monitor *mon) in expr_logic() argument
464 val = expr_prod(mon); in expr_logic()
471 val2 = expr_prod(mon); in expr_logic()
488 static int64_t expr_sum(Monitor *mon) in expr_sum() argument
493 val = expr_logic(mon); in expr_sum()
496 if (op != '+' && op != '-') { in expr_sum()
500 val2 = expr_logic(mon); in expr_sum()
504 val -= val2; in expr_sum()
510 static int get_expr(Monitor *mon, int64_t *pval, const char **pp) in get_expr() argument
513 if (sigsetjmp(expr_env, 0)) { in get_expr()
515 return -1; in get_expr()
520 *pval = expr_sum(mon); in get_expr()
522 return 0; in get_expr()
525 static int get_double(Monitor *mon, double *pval, const char **pp) in get_double() argument
533 monitor_printf(mon, "Number expected\n"); in get_double()
534 return -1; in get_double()
536 if (d != d || d - d != 0) { in get_double()
538 monitor_printf(mon, "Bad number\n"); in get_double()
539 return -1; in get_double()
543 return 0; in get_double()
547 * Store the command-name in cmdname, and return a pointer to
560 if (*p == '\0') { in get_command_name()
564 while (*p != '\0' && *p != '/' && !qemu_isspace(*p)) { in get_command_name()
567 len = p - pstart; in get_command_name()
568 if (len > nlen - 1) { in get_command_name()
569 len = nlen - 1; in get_command_name()
572 cmdname[len] = '\0'; in get_command_name()
594 len = p - type; in key_get_info()
598 str[len] = '\0'; in key_get_info()
611 option[0] = '-'; in is_valid_option()
613 option[2] = '\0'; in is_valid_option()
624 for (cmd = disp_table; cmd->name != NULL; cmd++) { in search_dispatch_table()
625 if (hmp_compare_cmd(cmdname, cmd->name)) { in search_dispatch_table()
636 * Else, if no valid command can be found, report to @mon, and return
641 * the command is found in a sub-command table.
648 Monitor *mon = &hmp_mon->common; in monitor_parse_command() local
661 monitor_printf(mon, "unknown command: '%.*s'\n", in monitor_parse_command()
662 (int)(p - cmdp_start), cmdp_start); in monitor_parse_command()
666 monitor_printf(mon, "Command '%.*s' not available " in monitor_parse_command()
668 (int)(p - cmdp_start), cmdp_start); in monitor_parse_command()
679 if (cmd->sub_table != NULL && *p != '\0') { in monitor_parse_command()
680 return monitor_parse_command(hmp_mon, cmdp_start, cmdp, cmd->sub_table); in monitor_parse_command()
688 * If it can't be parsed, report to @mon, and return NULL.
692 static QDict *monitor_parse_arguments(Monitor *mon, in monitor_parse_arguments() argument
704 typestr = cmd->args_type; in monitor_parse_arguments()
724 if (*p == '\0') { in monitor_parse_arguments()
730 if (ret < 0) { in monitor_parse_arguments()
733 monitor_printf(mon, "%s: filename expected\n", in monitor_parse_arguments()
734 cmd->name); in monitor_parse_arguments()
737 monitor_printf(mon, "%s: block device name expected\n", in monitor_parse_arguments()
738 cmd->name); in monitor_parse_arguments()
741 monitor_printf(mon, "%s: string expected\n", cmd->name); in monitor_parse_arguments()
755 if (!opts_list || opts_list->desc->name) { in monitor_parse_arguments()
764 if (get_str(buf, sizeof(buf), &p) < 0) { in monitor_parse_arguments()
787 count = 0; in monitor_parse_arguments()
789 count = count * 10 + (*p - '0'); in monitor_parse_arguments()
793 size = -1; in monitor_parse_arguments()
794 format = -1; in monitor_parse_arguments()
827 if (*p != '\0' && !qemu_isspace(*p)) { in monitor_parse_arguments()
828 monitor_printf(mon, "invalid char in format: '%c'\n", in monitor_parse_arguments()
832 if (format < 0) { in monitor_parse_arguments()
836 /* for 'i', not specifying a size gives -1 as size */ in monitor_parse_arguments()
837 if (size < 0) { in monitor_parse_arguments()
849 size = -1; in monitor_parse_arguments()
868 if (*p == '\0') { in monitor_parse_arguments()
885 if (get_expr(mon, &val, &p)) { in monitor_parse_arguments()
888 /* Check if 'i' is greater than 32-bit */ in monitor_parse_arguments()
889 if ((c == 'i') && ((val >> 32) & 0xffffffff)) { in monitor_parse_arguments()
890 monitor_printf(mon, "\'%s\' has failed: ", cmd->name); in monitor_parse_arguments()
891 monitor_printf(mon, "integer is for 32-bit values\n"); in monitor_parse_arguments()
894 if (val < 0) { in monitor_parse_arguments()
895 monitor_printf(mon, "enter a positive value\n"); in monitor_parse_arguments()
914 if (*p == '\0') { in monitor_parse_arguments()
919 if (ret < 0 || val > INT64_MAX) { in monitor_parse_arguments()
920 monitor_printf(mon, "invalid size\n"); in monitor_parse_arguments()
936 if (*p == '\0') { in monitor_parse_arguments()
940 if (get_double(mon, &val, &p) < 0) { in monitor_parse_arguments()
943 if (p[0] && p[1] == 's') { in monitor_parse_arguments()
954 monitor_printf(mon, "Unknown unit suffix\n"); in monitor_parse_arguments()
972 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) { in monitor_parse_arguments()
974 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) { in monitor_parse_arguments()
977 monitor_printf(mon, "Expected 'on' or 'off'\n"); in monitor_parse_arguments()
983 case '-': in monitor_parse_arguments()
986 int skip_key = 0; in monitor_parse_arguments()
991 if (c == '\0') { in monitor_parse_arguments()
997 if (*p == '-') { in monitor_parse_arguments()
1001 monitor_printf(mon, "%s: unsupported option -%c\n", in monitor_parse_arguments()
1002 cmd->name, *p); in monitor_parse_arguments()
1018 if (ret < 0) { in monitor_parse_arguments()
1019 monitor_printf(mon, "%s: value expected for -%c\n", in monitor_parse_arguments()
1020 cmd->name, *tmp); in monitor_parse_arguments()
1044 if (*p == '\0') { in monitor_parse_arguments()
1050 if (len <= 0) { in monitor_parse_arguments()
1051 monitor_printf(mon, "%s: string expected\n", in monitor_parse_arguments()
1052 cmd->name); in monitor_parse_arguments()
1061 monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c); in monitor_parse_arguments()
1071 if (*p != '\0') { in monitor_parse_arguments()
1072 monitor_printf(mon, "%s: extraneous characters at the end of line\n", in monitor_parse_arguments()
1073 cmd->name); in monitor_parse_arguments()
1085 static void hmp_info_human_readable_text(Monitor *mon, in hmp_info_human_readable_text() argument
1091 if (hmp_handle_error(mon, err)) { in hmp_info_human_readable_text()
1095 monitor_puts(mon, info->human_readable_text); in hmp_info_human_readable_text()
1098 static void handle_hmp_command_exec(Monitor *mon, in handle_hmp_command_exec() argument
1102 if (cmd->cmd_info_hrt) { in handle_hmp_command_exec()
1103 hmp_info_human_readable_text(mon, in handle_hmp_command_exec()
1104 cmd->cmd_info_hrt); in handle_hmp_command_exec()
1106 cmd->cmd(mon, qdict); in handle_hmp_command_exec()
1111 Monitor *mon; member
1120 handle_hmp_command_exec(data->mon, data->cmd, data->qdict); in handle_hmp_command_co()
1122 data->done = true; in handle_hmp_command_co()
1125 void handle_hmp_command(MonitorHMP *mon, const char *cmdline) in handle_hmp_command() argument
1131 trace_handle_hmp_command(mon, cmdline); in handle_hmp_command()
1133 cmd = monitor_parse_command(mon, cmdline, &cmdline, hmp_cmds); in handle_hmp_command()
1138 if (!cmd->cmd && !cmd->cmd_info_hrt) { in handle_hmp_command()
1140 monitor_printf(&mon->common, "Command \"%.*s\" is not available.\n", in handle_hmp_command()
1141 (int)(cmdline - cmd_start), cmd_start); in handle_hmp_command()
1145 qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd); in handle_hmp_command()
1147 while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) { in handle_hmp_command()
1148 cmdline--; in handle_hmp_command()
1150 monitor_printf(&mon->common, "Try \"help %.*s\" for more information\n", in handle_hmp_command()
1151 (int)(cmdline - cmd_start), cmd_start); in handle_hmp_command()
1155 if (!cmd->coroutine) { in handle_hmp_command()
1156 /* old_mon is non-NULL when called from qmp_human_monitor_command() */ in handle_hmp_command()
1157 Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(), &mon->common); in handle_hmp_command()
1158 handle_hmp_command_exec(&mon->common, cmd, qdict); in handle_hmp_command()
1162 .mon = &mon->common, in handle_hmp_command()
1168 monitor_set_cur(co, &mon->common); in handle_hmp_command()
1176 static void cmd_completion(MonitorHMP *mon, const char *name, const char *list) in cmd_completion() argument
1186 len = p - pstart; in cmd_completion()
1187 if (len > sizeof(cmd) - 2) { in cmd_completion()
1188 len = sizeof(cmd) - 2; in cmd_completion()
1191 cmd[len] = '\0'; in cmd_completion()
1192 readline_add_completion_of(mon->rs, name, cmd); in cmd_completion()
1193 if (*p == '\0') { in cmd_completion()
1200 static void file_completion(MonitorHMP *mon, const char *input) in file_completion() argument
1211 input_path_len = 0; in file_completion()
1215 input_path_len = p - input + 1; in file_completion()
1217 if (input_path_len > sizeof(path) - 1) { in file_completion()
1218 input_path_len = sizeof(path) - 1; in file_completion()
1220 path[input_path_len] = '\0'; in file_completion()
1235 if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) { in file_completion()
1239 if (strstart(d->d_name, file_prefix, NULL)) { in file_completion()
1242 pstrcpy(file + input_path_len, sizeof(file) - input_path_len, in file_completion()
1243 d->d_name); in file_completion()
1249 if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) { in file_completion()
1252 readline_add_completion(mon->rs, file); in file_completion()
1264 static void monitor_find_completion_by_table(MonitorHMP *mon, in monitor_find_completion_by_table() argument
1277 if (nb_args == 0) { in monitor_find_completion_by_table()
1280 cmdname = args[0]; in monitor_find_completion_by_table()
1282 readline_set_completion_index(mon->rs, strlen(cmdname)); in monitor_find_completion_by_table()
1283 for (cmd = cmd_table; cmd->name != NULL; cmd++) { in monitor_find_completion_by_table()
1285 cmd_completion(mon, cmdname, cmd->name); in monitor_find_completion_by_table()
1290 for (cmd = cmd_table; cmd->name != NULL; cmd++) { in monitor_find_completion_by_table()
1291 if (hmp_compare_cmd(args[0], cmd->name) && in monitor_find_completion_by_table()
1296 if (!cmd->name) { in monitor_find_completion_by_table()
1300 if (cmd->sub_table) { in monitor_find_completion_by_table()
1302 monitor_find_completion_by_table(mon, cmd->sub_table, in monitor_find_completion_by_table()
1303 &args[1], nb_args - 1); in monitor_find_completion_by_table()
1306 if (cmd->command_completion) { in monitor_find_completion_by_table()
1307 cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]); in monitor_find_completion_by_table()
1311 ptype = next_arg_type(cmd->args_type); in monitor_find_completion_by_table()
1312 for (i = 0; i < nb_args - 2; i++) { in monitor_find_completion_by_table()
1313 if (*ptype != '\0') { in monitor_find_completion_by_table()
1320 str = args[nb_args - 1]; in monitor_find_completion_by_table()
1322 while (*ptype == '-' && old_ptype != ptype) { in monitor_find_completion_by_table()
1329 readline_set_completion_index(mon->rs, strlen(str)); in monitor_find_completion_by_table()
1330 file_completion(mon, str); in monitor_find_completion_by_table()
1334 readline_set_completion_index(mon->rs, strlen(str)); in monitor_find_completion_by_table()
1336 readline_add_completion_of(mon->rs, str, blk_name(blk)); in monitor_find_completion_by_table()
1341 if (!strcmp(cmd->name, "help|?")) { in monitor_find_completion_by_table()
1342 monitor_find_completion_by_table(mon, cmd_table, in monitor_find_completion_by_table()
1343 &args[1], nb_args - 1); in monitor_find_completion_by_table()
1355 MonitorHMP *mon = opaque; in monitor_find_completion() local
1360 if (parse_cmdline(cmdline, &nb_args, args) < 0) { in monitor_find_completion()
1369 if (len > 0 && qemu_isspace(cmdline[len - 1])) { in monitor_find_completion()
1377 monitor_find_completion_by_table(mon, hmp_cmds, args, nb_args); in monitor_find_completion()
1385 MonitorHMP *mon = container_of(opaque, MonitorHMP, common); in monitor_read() local
1388 if (mon->rs) { in monitor_read()
1389 for (i = 0; i < size; i++) { in monitor_read()
1390 readline_handle_byte(mon->rs, buf[i]); in monitor_read()
1393 if (size == 0 || buf[size - 1] != 0) { in monitor_read()
1394 monitor_printf(&mon->common, "corrupted command\n"); in monitor_read()
1396 handle_hmp_command(mon, (char *)buf); in monitor_read()
1403 Monitor *mon = opaque; in monitor_event() local
1407 qemu_mutex_lock(&mon->mon_lock); in monitor_event()
1408 if (mon->mux_out) { in monitor_event()
1409 mon->mux_out = 0; in monitor_event()
1410 monitor_resume(mon); in monitor_event()
1412 qemu_mutex_unlock(&mon->mon_lock); in monitor_event()
1416 qemu_mutex_lock(&mon->mon_lock); in monitor_event()
1417 if (!mon->mux_out) { in monitor_event()
1418 if (mon->reset_seen && !mon->suspend_cnt) { in monitor_event()
1419 monitor_puts_locked(mon, "\n"); in monitor_event()
1421 monitor_flush_locked(mon); in monitor_event()
1423 monitor_suspend(mon); in monitor_event()
1424 mon->mux_out = 1; in monitor_event()
1426 qemu_mutex_unlock(&mon->mon_lock); in monitor_event()
1430 monitor_printf(mon, "QEMU %s monitor - type 'help' for more " in monitor_event()
1432 qemu_mutex_lock(&mon->mon_lock); in monitor_event()
1433 mon->reset_seen = 1; in monitor_event()
1434 if (!mon->mux_out) { in monitor_event()
1435 /* Suspend-resume forces the prompt to be printed. */ in monitor_event()
1436 monitor_suspend(mon); in monitor_event()
1437 monitor_resume(mon); in monitor_event()
1439 qemu_mutex_unlock(&mon->mon_lock); in monitor_event()
1460 MonitorHMP *mon = opaque; in monitor_readline_printf() local
1463 monitor_vprintf(&mon->common, fmt, ap); in monitor_readline_printf()
1469 MonitorHMP *mon = opaque; in monitor_readline_flush() local
1470 monitor_flush(&mon->common); in monitor_readline_flush()
1475 MonitorHMP *mon = g_new0(MonitorHMP, 1); in monitor_init_hmp() local
1477 if (!qemu_chr_fe_init(&mon->common.chr, chr, errp)) { in monitor_init_hmp()
1478 g_free(mon); in monitor_init_hmp()
1482 monitor_data_init(&mon->common, false, false, false); in monitor_init_hmp()
1484 mon->use_readline = use_readline; in monitor_init_hmp()
1485 if (mon->use_readline) { in monitor_init_hmp()
1486 mon->rs = readline_init(monitor_readline_printf, in monitor_init_hmp()
1488 mon, in monitor_init_hmp()
1490 monitor_read_command(mon, 0); in monitor_init_hmp()
1493 qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_read, in monitor_init_hmp()
1494 monitor_event, NULL, &mon->common, NULL, true); in monitor_init_hmp()
1495 monitor_list_append(&mon->common); in monitor_init_hmp()