Reenable hmp for preconfig mode
v4 cover Reenable hmp for preconfig mode
From: "Dr. David Alan Gilbert" <[email protected]>
Reenable HMP in preconfig mode; it's pretty
easy and anyway I want to do a similar thing for OOB eventually. We'll want to enable more commands in preconfig mode to make it useful at some point.
Dave
v4
Fixes from Markus' review.
Including enabling some more qom-* commands in qmp
Dr. David Alan Gilbert (6):
hmp: Add flag for preconfig commands
hmp: Allow help on preconfig commands
hmp: Restrict auto-complete in preconfig
hmp: Add commands for preconfig
hmp: add exit_preconfig
hmp: Allow HMP in preconfig state again
Igor Mammedov (1):
qmp: Enable a few commands in preconfig state
hmp-commands-info.hx | 12 ++++++++++++ hmp-commands.hx | 23 +++++++++++++++++++++++ hmp.c | 8 ++++++++ hmp.h | 1 + monitor.c | 43 ++++++++++++++++++++++++++++++++++--------- qapi/char.json | 3 ++- qapi/misc.json | 27 +++++++++++++++++---------- 7 files changed, 97 insertions(+), 20 deletions(-)
Signature · 1 line
2.17.1
PATCH v4 1/7 hmp: Add flag for preconfig commands
From: "Dr. David Alan Gilbert" <[email protected]>
Add a flag to command definitions to allow them to be used in preconfig and check it.
If users try to use commands that aren't available, tell them to use the exit_preconfig comand we're adding in a few patches.
--- monitor.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
monitor.c +20 -0
@@ -128,6 +128,7 @@ typedef struct mon_cmd_t {const char *args_type;const char *params;const char *help; +const char *flags;/* p=preconfig */ void (*cmd)(Monitor *mon,const QDict *qdict);/* @sub_table is a list of 2nd level of commands. If it does not exist, * cmd should be used. If it exists, sub_table[?].cmd should be
@@ -936,6 +937,19 @@ static int parse_cmdline(const char *cmdline,return -1 ; } +/* +* Returns true if the command can be executed in preconfig mode +* i.e. it has the 'p' flag. +*/ +static bool cmd_can_preconfig (const mon_cmd_t *cmd) +{ +if (!cmd->flags) { +return false; + } + +return strchr (cmd->flags,'p' ); +} + static void help_cmd_dump_one(Monitor *mon, const mon_cmd_t *cmd, char **prefix_args,
@@ -2976,6 +2990,12 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon, (int)(p - cmdp_start), cmdp_start);return NULL ; } +if (runstate_check (RUN_STATE_PRECONFIG ) && !cmd_can_preconfig (cmd)) { +monitor_printf (mon,"Command '%.*s' not available with -preconfig " +"until after exit_preconfig.\n" , + (int )(p - cmdp_start), cmdp_start); +return NULL ; + }/* filter out following useless space */ while (qemu_isspace (*p)) {
Signature · 1 line
2.17.1
PATCH v4 2/7 hmp: Allow help on preconfig commands
In reply to Dr. David Alan Gilbert (git)From: "Dr. David Alan Gilbert" <[email protected]>
Allow the 'help' command in preconfig state but make it only list the preconfig commands.
--- hmp-commands.hx | 1 + monitor.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-)
hmp-commands.hx +1 -0
@@ -15,6 +15,7 @@ ETEXI .params = "[cmd]", .help = "show the help", .cmd = do_help_cmd, + .flags = "p", }, STEXI
monitor.c +7 -1
@@ -957,6 +957,10 @@ static void help_cmd_dump_one(Monitor *mon, {int i; +if (runstate_check (RUN_STATE_PRECONFIG ) && !cmd_can_preconfig (cmd)) { +return ; + } +for (i =0 ; i < prefix_args_nb; i++) {monitor_printf (mon,"%s " , prefix_args[i]); }
@@ -979,7 +983,9 @@ static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,/* Find one entry to dump */ for (cmd = cmds; cmd->name !=NULL ; cmd++) { -if (compare_cmd (args[arg_index], cmd->name)) { +if (compare_cmd (args[arg_index], cmd->name) && + ((!runstate_check (RUN_STATE_PRECONFIG ) || +cmd_can_preconfig (cmd)))) {if (cmd->sub_table) {/* continue with next arg */ help_cmd_dump(mon, cmd->sub_table,
Signature · 1 line
2.17.1
PATCH v4 3/7 hmp: Restrict auto-complete in preconfig
In reply to Dr. David Alan Gilbert (git)From: "Dr. David Alan Gilbert" <[email protected]>
Don't show the commands that aren't available.
--- monitor.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
monitor.c +7 -2
@@ -3951,12 +3951,17 @@ static void monitor_find_completion_by_table(Monitor *mon, cmdname = args[0 ];readline_set_completion_index (mon->rs,strlen (cmdname));for (cmd = cmd_table; cmd->name !=NULL ; cmd++) { -cmd_completion (mon, cmdname, cmd->name); +if (!runstate_check (RUN_STATE_PRECONFIG ) || +cmd_can_preconfig (cmd)) { +cmd_completion (mon, cmdname, cmd->name); + } } }else {/* find the command */ for (cmd = cmd_table; cmd->name !=NULL ; cmd++) { -if (compare_cmd (args[0 ], cmd->name)) { +if (compare_cmd (args[0 ], cmd->name) && + (!runstate_check (RUN_STATE_PRECONFIG ) || +cmd_can_preconfig (cmd))) {break ; } }
Signature · 1 line
2.17.1
PATCH v4 4/7 qmp: Enable a few commands in preconfig state
In reply to Dr. David Alan Gilbert (git)From: Igor Mammedov <[email protected]>
Commands query-chardev, query-version, query-name, query-uuid, query-iothreads, query-memdev are informational and do not depend on the machine being initialized. Make them available in preconfig runstate to make the latter a little bit more useful.
The generic qom commands don't depend on the machine being initialized either; so enabled qom-list, qom-get, qom-set, qom-list-types, qom-list-properties.
--- qapi/char.json | 3 ++- qapi/misc.json | 27 +++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-)
qapi/char.json +2 -1
@@ -62,7 +62,8 @@ # } # ## -{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] } +{ 'command': 'query-chardev', 'returns': ['ChardevInfo'], + 'allow-preconfig': true } ## # @ChardevBackendInfo:
qapi/misc.json +17 -10
@@ -117,7 +117,8 @@ # } # ## -{ 'command': 'query-version', 'returns': 'VersionInfo' } +{ 'command': 'query-version', 'returns': 'VersionInfo', + 'allow-preconfig': true } ## # @CommandInfo:
@@ -241,7 +242,7 @@ # <- { "return": { "name": "qemu-name" } } # ## -{ 'command': 'query-name', 'returns': 'NameInfo' } +{ 'command': 'query-name', 'returns': 'NameInfo', 'allow-preconfig': true } ## # @KvmInfo:
@@ -301,7 +302,7 @@ # <- { "return": { "UUID": "550e8400-e29b-41d4-a716-446655440000" } } # ## -{ 'command': 'query-uuid', 'returns': 'UuidInfo' } +{ 'command': 'query-uuid', 'returns': 'UuidInfo', 'allow-preconfig': true } ## # @EventInfo:
@@ -710,7 +711,8 @@ # } # ## -{ 'command': 'query-iothreads', 'returns': ['IOThreadInfo'] } +{ 'command': 'query-iothreads', 'returns': ['IOThreadInfo'], + 'allow-preconfig': true } ## # @BalloonInfo:
@@ -1408,7 +1410,8 @@ ## { 'command': 'qom-list', 'data': { 'path': 'str' }, - 'returns': [ 'ObjectPropertyInfo' ] } + 'returns': [ 'ObjectPropertyInfo' ], + 'allow-preconfig': true } ## # @qom-get:
@@ -1444,7 +1447,8 @@ ## { 'command': 'qom-get', 'data': { 'path': 'str', 'property': 'str' }, - 'returns': 'any' } + 'returns': 'any', + 'allow-preconfig': true } ## # @qom-set:
@@ -1461,7 +1465,8 @@ # Since: 1.2 ## { 'command': 'qom-set', - 'data': { 'path': 'str', 'property': 'str', 'value': 'any' } } + 'data': { 'path': 'str', 'property': 'str', 'value': 'any' }, + 'allow-preconfig': true } ## # @change:
@@ -1543,7 +1548,8 @@ ## { 'command': 'qom-list-types', 'data': { '*implements': 'str', '*abstract': 'bool' }, - 'returns': [ 'ObjectTypeInfo' ] } + 'returns': [ 'ObjectTypeInfo' ], + 'allow-preconfig': true } ## # @device-list-properties:
@@ -1581,7 +1587,8 @@ ## { 'command': 'qom-list-properties', 'data': { 'typename': 'str'}, - 'returns': [ 'ObjectPropertyInfo' ] } + 'returns': [ 'ObjectPropertyInfo' ], + 'allow-preconfig': true } ## # @xen-set-global-dirty-log:
@@ -2902,7 +2909,7 @@ # } # ## -{ 'command': 'query-memdev', 'returns': ['Memdev'] } +{ 'command': 'query-memdev', 'returns': ['Memdev'], 'allow-preconfig': true } ## # @PCDIMMDeviceInfo:
Signature · 1 line
2.17.1
PATCH v4 5/7 hmp: Add commands for preconfig
In reply to Dr. David Alan Gilbert (git)From: "Dr. David Alan Gilbert" <[email protected]>
Allow a bunch of the info commands to be used in preconfig.
version, chardev, name, uuid,memdev, iothreads
Were enabled in QMP in the previous patch from Igor
status, hotpluggable_cpus
Was enabled in the original allow-preconfig series
history
is HMP specific
usbhost, qom-tree, numa
Don't have a QMP equivalent
Also enable the qom commands qom-list and qom-set.
--- hmp-commands-info.hx | 12 ++++++++++++ hmp-commands.hx | 3 +++ 2 files changed, 15 insertions(+)
hmp-commands-info.hx +12 -0
@@ -19,6 +19,7 @@ ETEXI .params = "", .help = "show the version of QEMU", .cmd = hmp_info_version, + .flags = "p", }, STEXI
@@ -47,6 +48,7 @@ ETEXI .params = "", .help = "show the character devices", .cmd = hmp_info_chardev, + .flags = "p", }, STEXI
@@ -165,6 +167,7 @@ ETEXI .params = "", .help = "show the command line history", .cmd = hmp_info_history, + .flags = "p", }, STEXI
@@ -315,6 +318,7 @@ ETEXI .params = "", .help = "show NUMA information", .cmd = hmp_info_numa, + .flags = "p", }, STEXI
@@ -343,6 +347,7 @@ ETEXI .params = "", .help = "show host USB devices", .cmd = hmp_info_usbhost, + .flags = "p", }, STEXI
@@ -399,6 +404,7 @@ ETEXI .params = "", .help = "show the current VM status (running|paused)", .cmd = hmp_info_status, + .flags = "p", }, STEXI
@@ -457,6 +463,7 @@ ETEXI .params = "", .help = "show the current VM name", .cmd = hmp_info_name, + .flags = "p", }, STEXI
@@ -471,6 +478,7 @@ ETEXI .params = "", .help = "show the current VM UUID", .cmd = hmp_info_uuid, + .flags = "p", }, STEXI
@@ -613,6 +621,7 @@ ETEXI .params = "[path]", .help = "show QOM composition tree", .cmd = hmp_info_qom_tree, + .flags = "p", }, STEXI
@@ -671,6 +680,7 @@ ETEXI .params = "", .help = "show memory backends", .cmd = hmp_info_memdev, + .flags = "p", }, STEXI
@@ -699,6 +709,7 @@ ETEXI .params = "", .help = "show iothreads", .cmd = hmp_info_iothreads, + .flags = "p", }, STEXI
@@ -829,6 +840,7 @@ ETEXI .params = "", .help = "Show information about hotpluggable CPUs", .cmd = hmp_hotpluggable_cpus, + .flags = "p", }, STEXI
hmp-commands.hx +3 -0
@@ -1829,6 +1829,7 @@ ETEXI .params = "path", .help = "list QOM properties", .cmd = hmp_qom_list, + .flags = "p", }, STEXI
@@ -1842,6 +1843,7 @@ ETEXI .params = "path property value", .help = "set QOM property", .cmd = hmp_qom_set, + .flags = "p", }, STEXI
@@ -1856,6 +1858,7 @@ ETEXI .help = "show various information about the system state", .cmd = hmp_info_help, .sub_table = info_cmds, + .flags = "p", }, STEXI
Signature · 1 line
2.17.1
PATCH v4 6/7 hmp: add exit_preconfig
In reply to Dr. David Alan Gilbert (git)From: "Dr. David Alan Gilbert" <[email protected]>
Add the exit_preconfig command to return to normality.
--- hmp-commands.hx | 19 +++++++++++++++++++ hmp.c | 8 ++++++++ hmp.h | 1 + 3 files changed, 28 insertions(+)
hmp-commands.hx +19 -0
@@ -55,6 +55,25 @@ STEXI @item q or quit @findex quit Quit the emulator. +ETEXI + + { + .name = "exit_preconfig", + .args_type = "", + .params = "", + .help = "exit the preconfig state", + .cmd = hmp_exit_preconfig, + .flags = "p", + }, + +STEXI +@item exit_preconfig +@findex exit_preconfig +This command makes QEMU exit the preconfig state and proceed with +VM initialization using configuration data provided on the command line +and via the QMP monitor during the preconfig state. The command is only +available during the preconfig state (i.e. when the --preconfig command +line option was in use). ETEXI {
hmp.c +8 -0
@@ -1065,6 +1065,14 @@ void hmp_system_powerdown(Monitor *mon, const QDict *qdict)qmp_system_powerdown (NULL ); } +void hmp_exit_preconfig (Monitor *mon,const QDict *qdict) +{ +Error *err =NULL ; + +qmp_exit_preconfig (&err); +hmp_handle_error (mon, &err); +} +void hmp_cpu (Monitor *mon,const QDict *qdict) {int64_t cpu_index;
hmp.h +1 -0
@@ -44,6 +44,7 @@ void hmp_quit(Monitor *mon, const QDict *qdict);void hmp_stop (Monitor *mon,const QDict *qdict);void hmp_system_reset (Monitor *mon,const QDict *qdict);void hmp_system_powerdown (Monitor *mon,const QDict *qdict); +void hmp_exit_preconfig (Monitor *mon,const QDict *qdict);void hmp_cpu (Monitor *mon,const QDict *qdict);void hmp_memsave (Monitor *mon,const QDict *qdict);void hmp_pmemsave (Monitor *mon,const QDict *qdict);
Signature · 1 line
2.17.1
PATCH v4 7/7 hmp: Allow HMP in preconfig state again
In reply to Dr. David Alan Gilbert (git)From: "Dr. David Alan Gilbert" <[email protected]>
Now we can cope with preconfig in HMP, reenable by reverting commit 71dc578e116599ea73c8a2a4e693134702ec0e83.
--- monitor.c | 6 ------ 1 file changed, 6 deletions(-)
monitor.c +0 -6
@@ -3395,12 +3395,6 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline)trace_handle_hmp_command (mon, cmdline); -if (runstate_check (RUN_STATE_PRECONFIG )) { -monitor_printf (mon,"HMP not available in preconfig state, " -"use QMP instead\n" ); -return ; - } - cmd =monitor_parse_command (mon, cmdline, &cmdline, mon->cmd_table);if (!cmd) {return ;
Signature · 1 line
2.17.1