HMP pull 2018-06-21

Minor fixes and reenable preconfig
 -----BEGIN PGP SIGNATURE-----
 
 iQIcBAABAgAGBQJbK9WdAAoJEAUWMx68W/3njg0P/0qdP1TctuwwikSbRuEPLVCa
 nwqfsEMomiukC9wD4DR4opsupY+e5Ugeje+TTK8oF+CzamD70XXtLoeR2JSXEon2
 ZlN3MxOv/4ibP3f5pjgJc0skzhD3y/FAD3qzBkaaHwsudBSjZ7rlOGS3E5U3tOxy
 JLKrotjV9W6qtwO6DNKE7+DcnJPbb6zNtKjt00BuYghVn8K5zXyTKOsxK6QLH9b3
 txdeVmqMnIhpFavLESMOgE3HicTATLJsRREqmnZz+fPPP0Yiz/2tyLXEV64v9BLu
 G99/FeqtLVvxyeKCAn/dWbbLqrsAV7pgnyaQfE55EzjpSO2xl8hayNUUqbgqsNwW
 nKSQO0P2iFU1zQTHs5hJyBaqjdlOOsPdM6tO9UywSERiyAlxosVr0K+gFYVcQi56
 2BelxNeAvqIDrWPPvaSLZhNXGUxpk3LwSzS9Ma5KqHFb+MaW++hZhkVy4exRm+NN
 OIk+Em5QCBMp0AoNaVsf+qGpy0wkfUDB4OVycDscr1dRx5uKmgMl6qDh1nwg3a73
 527ui0+qpI2/3zLlG6ohazGiVLwio005MJkYG2dAvobwZC0p5MnbFkjPML444EDj
 3QAFzzUHJkFusmsNl1Jkgf1Uh1mXCwovE6fU/fa/I0HxS/M7lJob0NLRMctL60Q7
 O9R6jhRh0vsCHepCYOH6
 =Gxyi
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/dgilbert/tags/pull-hmp-20180621' into staging

HMP pull 2018-06-21

Minor fixes and reenable preconfig

# gpg: Signature made Thu 21 Jun 2018 17:43:09 BST
# gpg:                using RSA key 0516331EBC5BFDE7
# gpg: Good signature from "Dr. David Alan Gilbert (RH2) <dgilbert@redhat.com>"
# Primary key fingerprint: 45F5 C71B 4A0C B7FB 977A  9FA9 0516 331E BC5B FDE7

* remotes/dgilbert/tags/pull-hmp-20180621:
  hmp: Allow HMP in preconfig state again
  hmp: add exit_preconfig
  hmp: Add commands for preconfig
  qmp: Enable a few commands in preconfig state
  hmp: Restrict auto-complete in preconfig
  hmp: Allow help on preconfig commands
  hmp: Add flag for preconfig commands
  hmp-commands: use long for begin and length in dump-guest-memory
  monitor: report entirety of hmp command on error

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2018-06-22 13:27:45 +01:00
commit c74b91ac1c
7 changed files with 102 additions and 23 deletions

View File

@ -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
@ -399,6 +402,7 @@ ETEXI
.params = "",
.help = "show the current VM status (running|paused)",
.cmd = hmp_info_status,
.flags = "p",
},
STEXI
@ -457,6 +461,7 @@ ETEXI
.params = "",
.help = "show the current VM name",
.cmd = hmp_info_name,
.flags = "p",
},
STEXI
@ -471,6 +476,7 @@ ETEXI
.params = "",
.help = "show the current VM UUID",
.cmd = hmp_info_uuid,
.flags = "p",
},
STEXI
@ -613,6 +619,7 @@ ETEXI
.params = "[path]",
.help = "show QOM composition tree",
.cmd = hmp_info_qom_tree,
.flags = "p",
},
STEXI
@ -671,6 +678,7 @@ ETEXI
.params = "",
.help = "show memory backends",
.cmd = hmp_info_memdev,
.flags = "p",
},
STEXI
@ -699,6 +707,7 @@ ETEXI
.params = "",
.help = "show iothreads",
.cmd = hmp_info_iothreads,
.flags = "p",
},
STEXI
@ -829,6 +838,7 @@ ETEXI
.params = "",
.help = "Show information about hotpluggable CPUs",
.cmd = hmp_hotpluggable_cpus,
.flags = "p",
},
STEXI

View File

@ -15,6 +15,7 @@ ETEXI
.params = "[cmd]",
.help = "show the help",
.cmd = do_help_cmd,
.flags = "p",
},
STEXI
@ -54,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
{
@ -1116,7 +1136,7 @@ ETEXI
{
.name = "dump-guest-memory",
.args_type = "paging:-p,detach:-d,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:i?,length:i?",
.args_type = "paging:-p,detach:-d,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:l?,length:l?",
.params = "[-p] [-d] [-z|-l|-s] filename [begin length]",
.help = "dump guest memory into file 'filename'.\n\t\t\t"
"-p: do paging to get guest's memory mapping.\n\t\t\t"
@ -1827,6 +1847,7 @@ ETEXI
.params = "path",
.help = "list QOM properties",
.cmd = hmp_qom_list,
.flags = "p",
},
STEXI
@ -1840,6 +1861,7 @@ ETEXI
.params = "path property value",
.help = "set QOM property",
.cmd = hmp_qom_set,
.flags = "p",
},
STEXI
@ -1854,6 +1876,7 @@ ETEXI
.help = "show various information about the system state",
.cmd = hmp_info_help,
.sub_table = info_cmds,
.flags = "p",
},
STEXI

8
hmp.c
View File

@ -1068,6 +1068,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;

1
hmp.h
View File

@ -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);

View File

@ -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
@ -958,6 +959,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,
@ -965,6 +979,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]);
}
@ -987,7 +1005,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,
@ -3041,6 +3061,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)) {
@ -3431,15 +3457,10 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline)
{
QDict *qdict;
const mon_cmd_t *cmd;
const char *cmd_start = 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;
@ -3447,8 +3468,11 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline)
qdict = monitor_parse_arguments(mon, &cmdline, cmd);
if (!qdict) {
monitor_printf(mon, "Try \"help %s\" for more information\n",
cmd->name);
while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
cmdline--;
}
monitor_printf(mon, "Try \"help %.*s\" for more information\n",
(int)(cmdline - cmd_start), cmd_start);
return;
}
@ -3990,12 +4014,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;
}
}

View File

@ -62,7 +62,8 @@
# }
#
##
{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] }
{ 'command': 'query-chardev', 'returns': ['ChardevInfo'],
'allow-preconfig': true }
##
# @ChardevBackendInfo:

View File

@ -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: