X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/e02bbe1956d8105f2593c3137da510eeb260010b..3182664220571d11d4fe03ecdc10fcc1e842ed32:/monitor.c diff --git a/monitor.c b/monitor.c index 1e63ace2d4..fe0d1bdbb4 100644 --- a/monitor.c +++ b/monitor.c @@ -81,6 +81,7 @@ #if defined(TARGET_S390X) #include "hw/s390x/storage-keys.h" +#include "hw/s390x/storage-attributes.h" #endif /* @@ -927,7 +928,7 @@ EventInfoList *qmp_query_events(Error **errp) QAPIEvent e; for (e = 0 ; e < QAPI_EVENT__MAX ; e++) { - const char *event_name = QAPIEvent_lookup[e]; + const char *event_name = QAPIEvent_str(e); assert(event_name != NULL); info = g_malloc0(sizeof(*info)); info->value = g_malloc0(sizeof(*info->value)); @@ -1078,15 +1079,27 @@ int monitor_get_cpu_index(void) static void hmp_info_registers(Monitor *mon, const QDict *qdict) { - CPUState *cs = mon_get_cpu(); + bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false); + CPUState *cs; - if (!cs) { - monitor_printf(mon, "No CPU available\n"); - return; + if (all_cpus) { + CPU_FOREACH(cs) { + monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index); + cpu_dump_state(cs, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); + } + } else { + cs = mon_get_cpu(); + + if (!cs) { + monitor_printf(mon, "No CPU available\n"); + return; + } + + cpu_dump_state(cs, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); } - cpu_dump_state(cs, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); } +#ifdef CONFIG_TCG static void hmp_info_jit(Monitor *mon, const QDict *qdict) { if (!tcg_enabled()) { @@ -1102,6 +1115,7 @@ static void hmp_info_opcount(Monitor *mon, const QDict *qdict) { dump_opcount_info((FILE *)mon, monitor_fprintf); } +#endif static void hmp_info_history(Monitor *mon, const QDict *qdict) { @@ -1335,7 +1349,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize, switch(format) { case 'o': - max_digits = (wsize * 8 + 2) / 3; + max_digits = DIV_ROUND_UP(wsize * 8, 3); break; default: case 'x': @@ -1343,7 +1357,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize, break; case 'u': case 'd': - max_digits = (wsize * 8 * 10 + 32) / 33; + max_digits = DIV_ROUND_UP(wsize * 8 * 10, 33); break; case 'c': wsize = 1; @@ -1689,18 +1703,20 @@ static void hmp_boot_set(Monitor *mon, const QDict *qdict) static void hmp_info_mtree(Monitor *mon, const QDict *qdict) { bool flatview = qdict_get_try_bool(qdict, "flatview", false); + bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false); - mtree_info((fprintf_function)monitor_printf, mon, flatview); + mtree_info((fprintf_function)monitor_printf, mon, flatview, dispatch_tree); } static void hmp_info_numa(Monitor *mon, const QDict *qdict) { int i; - uint64_t *node_mem; + NumaNodeMem *node_mem; CpuInfoList *cpu_list, *cpu; cpu_list = qmp_query_cpus(&error_abort); - node_mem = g_new0(uint64_t, nb_numa_nodes); + node_mem = g_new0(NumaNodeMem, nb_numa_nodes); + query_numa_node_mem(node_mem); monitor_printf(mon, "%d nodes\n", nb_numa_nodes); for (i = 0; i < nb_numa_nodes; i++) { @@ -1713,7 +1729,9 @@ static void hmp_info_numa(Monitor *mon, const QDict *qdict) } monitor_printf(mon, "\n"); monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i, - node_mem[i] >> 20); + node_mem[i].node_mem >> 20); + monitor_printf(mon, "node %d plugged: %" PRId64 " MB\n", i, + node_mem[i].node_plugged_mem >> 20); } qapi_free_CpuInfoList(cpu_list); g_free(node_mem); @@ -2679,6 +2697,7 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table, * the command is found in a sub-command table. */ static const mon_cmd_t *monitor_parse_command(Monitor *mon, + const char *cmdp_start, const char **cmdp, mon_cmd_t *table) { @@ -2694,7 +2713,7 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon, cmd = search_dispatch_table(table, cmdname); if (!cmd) { monitor_printf(mon, "unknown command: '%.*s'\n", - (int)(p - *cmdp), *cmdp); + (int)(p - cmdp_start), cmdp_start); return NULL; } @@ -2706,7 +2725,7 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon, *cmdp = p; /* search sub command */ if (cmd->sub_table != NULL && *p != '\0') { - return monitor_parse_command(mon, cmdp, cmd->sub_table); + return monitor_parse_command(mon, cmdp_start, cmdp, cmd->sub_table); } return cmd; @@ -2974,7 +2993,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, monitor_printf(mon, "Unknown unit suffix\n"); goto fail; } - qdict_put(qdict, key, qfloat_from_double(val)); + qdict_put(qdict, key, qnum_from_double(val)); } break; case 'b': @@ -3088,7 +3107,9 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline) QDict *qdict; const mon_cmd_t *cmd; - cmd = monitor_parse_command(mon, &cmdline, mon->cmd_table); + trace_handle_hmp_command(mon, cmdline); + + cmd = monitor_parse_command(mon, cmdline, &cmdline, mon->cmd_table); if (!cmd) { return; } @@ -3233,8 +3254,8 @@ void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str) } len = strlen(str); readline_set_completion_index(rs, len); - for (i = 0; NetClientDriver_lookup[i]; i++) { - add_completion_option(rs, str, NetClientDriver_lookup[i]); + for (i = 0; i < NET_CLIENT_DRIVER__MAX; i++) { + add_completion_option(rs, str, NetClientDriver_str(i)); } } @@ -3418,8 +3439,8 @@ void sendkey_completion(ReadLineState *rs, int nb_args, const char *str) len = strlen(str); readline_set_completion_index(rs, len); for (i = 0; i < Q_KEY_CODE__MAX; i++) { - if (!strncmp(str, QKeyCode_lookup[i], len)) { - readline_add_completion(rs, QKeyCode_lookup[i]); + if (!strncmp(str, QKeyCode_str(i), len)) { + readline_add_completion(rs, QKeyCode_str(i)); } } } @@ -3521,8 +3542,8 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str) return; } readline_set_completion_index(rs, strlen(str)); - for (i = 0; WatchdogExpirationAction_lookup[i]; i++) { - add_completion_option(rs, str, WatchdogExpirationAction_lookup[i]); + for (i = 0; i < WATCHDOG_ACTION__MAX; i++) { + add_completion_option(rs, str, WatchdogAction_str(i)); } } @@ -3536,7 +3557,7 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args, if (nb_args == 2) { int i; for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) { - const char *name = MigrationCapability_lookup[i]; + const char *name = MigrationCapability_str(i); if (!strncmp(str, name, len)) { readline_add_completion(rs, name); } @@ -3557,7 +3578,7 @@ void migrate_set_parameter_completion(ReadLineState *rs, int nb_args, if (nb_args == 2) { int i; for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) { - const char *name = MigrationParameter_lookup[i]; + const char *name = MigrationParameter_str(i); if (!strncmp(str, name, len)) { readline_add_completion(rs, name); } @@ -3824,13 +3845,19 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens) qdict_del(qdict, "id"); } /* else will fail qmp_dispatch() */ + if (trace_event_get_state_backends(TRACE_HANDLE_QMP_COMMAND)) { + QString *req_json = qobject_to_json(req); + trace_handle_qmp_command(mon, qstring_get_str(req_json)); + QDECREF(req_json); + } + rsp = qmp_dispatch(cur_mon->qmp.commands, req); if (mon->qmp.commands == &qmp_cap_negotiation_commands) { qdict = qdict_get_qdict(qobject_to_qdict(rsp), "error"); if (qdict && !g_strcmp0(qdict_get_try_str(qdict, "class"), - QapiErrorClass_lookup[ERROR_CLASS_COMMAND_NOT_FOUND])) { + QapiErrorClass_str(ERROR_CLASS_COMMAND_NOT_FOUND))) { /* Provide a more useful error message */ qdict_del(qdict, "desc"); qdict_put_str(qdict, "desc", "Expecting capabilities negotiation" @@ -4090,12 +4117,12 @@ void monitor_init(Chardev *chr, int flags) if (monitor_is_qmp(mon)) { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_read, - monitor_qmp_event, mon, NULL, true); + monitor_qmp_event, NULL, mon, NULL, true); qemu_chr_fe_set_echo(&mon->chr, true); json_message_parser_init(&mon->qmp.parser, handle_qmp_command); } else { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read, - monitor_event, mon, NULL, true); + monitor_event, NULL, mon, NULL, true); } qemu_mutex_lock(&monitor_lock); @@ -4116,74 +4143,6 @@ void monitor_cleanup(void) qemu_mutex_unlock(&monitor_lock); } -static void bdrv_password_cb(void *opaque, const char *password, - void *readline_opaque) -{ - Monitor *mon = opaque; - BlockDriverState *bs = readline_opaque; - int ret = 0; - Error *local_err = NULL; - - bdrv_add_key(bs, password, &local_err); - if (local_err) { - error_report_err(local_err); - ret = -EPERM; - } - if (mon->password_completion_cb) - mon->password_completion_cb(mon->password_opaque, ret); - - monitor_read_command(mon, 1); -} - -int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, - BlockCompletionFunc *completion_cb, - void *opaque) -{ - int err; - - monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs), - bdrv_get_encrypted_filename(bs)); - - mon->password_completion_cb = completion_cb; - mon->password_opaque = opaque; - - err = monitor_read_password(mon, bdrv_password_cb, bs); - - if (err && completion_cb) - completion_cb(opaque, err); - - return err; -} - -int monitor_read_block_device_key(Monitor *mon, const char *device, - BlockCompletionFunc *completion_cb, - void *opaque) -{ - Error *err = NULL; - BlockBackend *blk; - - blk = blk_by_name(device); - if (!blk) { - monitor_printf(mon, "Device not found %s\n", device); - return -1; - } - if (!blk_bs(blk)) { - monitor_printf(mon, "Device '%s' has no medium\n", device); - return -1; - } - - bdrv_add_key(blk_bs(blk), NULL, &err); - if (err) { - error_free(err); - return monitor_read_bdrv_key_start(mon, blk_bs(blk), completion_cb, opaque); - } - - if (completion_cb) { - completion_cb(opaque, 0); - } - return 0; -} - QemuOptsList qemu_mon_opts = { .name = "mon", .implied_opt_name = "chardev",