* Stefan Fritsch (s...@sfritsch.de) wrote:
> Sending a break on a serial console can be useful for debugging the
> guest. But not all chardev backends support sending breaks (only telnet
> and mux do). The chardev-send-break command allows to send a break even
> if using other backends.
> 
> Signed-off-by: Stefan Fritsch <s...@sfritsch.de>

From the HMP side, it looks OK, you could easily add a line to
tests/test-hmp.c's command list.

But,

Acked-by: Dr. David Alan Gilbert <dgilb...@redhat.com>

Dave

> ---
>  chardev/char.c   | 12 ++++++++++++
>  hmp-commands.hx  | 16 ++++++++++++++++
>  hmp.c            |  8 ++++++++
>  hmp.h            |  1 +
>  qapi-schema.json | 20 ++++++++++++++++++++
>  5 files changed, 57 insertions(+)
> 
> diff --git a/chardev/char.c b/chardev/char.c
> index 4e24dc39af..fa54f7c915 100644
> --- a/chardev/char.c
> +++ b/chardev/char.c
> @@ -1307,6 +1307,18 @@ void qmp_chardev_remove(const char *id, Error **errp)
>      object_unparent(OBJECT(chr));
>  }
>  
> +void qmp_chardev_send_break(const char *id, Error **errp)
> +{
> +    Chardev *chr;
> +
> +    chr = qemu_chr_find(id);
> +    if (chr == NULL) {
> +        error_setg(errp, "Chardev '%s' not found", id);
> +        return;
> +    }
> +    qemu_chr_be_event(chr, CHR_EVENT_BREAK);
> +}
> +
>  void qemu_chr_cleanup(void)
>  {
>      object_unparent(get_chardevs_root());
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index e763606fe5..fc8d54b52a 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1745,6 +1745,22 @@ Removes the chardev @var{id}.
>  ETEXI
>  
>      {
> +        .name       = "chardev-send-break",
> +        .args_type  = "id:s",
> +        .params     = "id",
> +        .help       = "send break on chardev",
> +        .cmd        = hmp_chardev_send_break,
> +        .command_completion = chardev_remove_completion,
> +    },
> +
> +STEXI
> +@item chardev-send-break id
> +@findex chardev-send-break
> +Sends break on the chardev @var{id}.
> +
> +ETEXI
> +
> +    {
>          .name       = "qemu-io",
>          .args_type  = "device:B,command:s",
>          .params     = "[device] \"[command]\"",
> diff --git a/hmp.c b/hmp.c
> index ad723903a6..fb2a38b7d6 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -2233,6 +2233,14 @@ void hmp_chardev_remove(Monitor *mon, const QDict 
> *qdict)
>      hmp_handle_error(mon, &local_err);
>  }
>  
> +void hmp_chardev_send_break(Monitor *mon, const QDict *qdict)
> +{
> +    Error *local_err = NULL;
> +
> +    qmp_chardev_send_break(qdict_get_str(qdict, "id"), &local_err);
> +    hmp_handle_error(mon, &local_err);
> +}
> +
>  void hmp_qemu_io(Monitor *mon, const QDict *qdict)
>  {
>      BlockBackend *blk;
> diff --git a/hmp.h b/hmp.h
> index d8b94ce9dc..214b2617e7 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -103,6 +103,7 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict);
>  void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict);
>  void hmp_chardev_add(Monitor *mon, const QDict *qdict);
>  void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
> +void hmp_chardev_send_break(Monitor *mon, const QDict *qdict);
>  void hmp_qemu_io(Monitor *mon, const QDict *qdict);
>  void hmp_cpu_add(Monitor *mon, const QDict *qdict);
>  void hmp_object_add(Monitor *mon, const QDict *qdict);
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 4b50b652d3..e01dd83dd9 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -5114,6 +5114,26 @@
>  { 'command': 'chardev-remove', 'data': {'id': 'str'} }
>  
>  ##
> +# @chardev-send-break:
> +#
> +# Send a break to a character device
> +#
> +# @id: the chardev's ID, must exist
> +#
> +# Returns: Nothing on success
> +#
> +# Since: 2.10
> +#
> +# Example:
> +#
> +# -> { "execute": "chardev-send-break", "arguments": { "id" : "foo" } }
> +# <- { "return": {} }
> +#
> +##
> +{ 'command': 'chardev-send-break', 'data': {'id': 'str'} }
> +
> +
> +##
>  # @TpmModel:
>  #
>  # An enumeration of TPM models
> -- 
> 2.11.0
> 
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK

Reply via email to