Daniel P. Berrangé <[email protected]> writes:

> Implement the user creatable QOM interface and define the monitor-qmp
> and monitor-hmp types in QAPI. This unlocks the ability to create them
> on the command line with -object or in HMP/QMP with object_add.
>
> For example:
>
>   $QEMU -chardev stdio,id=monchr0 -object monitor-hmp,id=mon0,chrdev=monchr0
>
> Initially the "prepare_delete" callback is hardcoded to return an error
> which means -object and object_add can be used, but object_del will fail.
> Support for deleting monitors will be introduced in subsequent commits.
>
> Reviewed-by: Marc-André Lureau <[email protected]>
> Tested-by: Peter Krempa <[email protected]>
> Signed-off-by: Daniel P. Berrangé <[email protected]>

[...]

> diff --git a/qapi/qom.json b/qapi/qom.json
> index dd45ac1087..6affb70a59 100644
> --- a/qapi/qom.json
> +++ b/qapi/qom.json
> @@ -1187,6 +1187,45 @@
>    'data': { '*cpu-affinity': ['uint16'],
>              '*node-affinity': ['uint16'] } }
>  
> +##
> +# @MonitorProperties:
> +#
> +# Properties for all monitors
> +#
> +# @chardev: ID of the character device providing the monitor transport
> +#
> +# Since: 11.1
> +##
> +{ 'struct': 'MonitorProperties',
> +  'data': { 'chardev': 'str' }}
> +
> +##
> +# @MonitorHMPProperties:
> +#
> +# Properties for the HMP monitor
> +#
> +# @readline: whether to enable readline for line editing
> +#      (default: enabled)

The default value is 'true', and it means 'enabeld'.  We pretty much
universally have the default value in (default: ...), not the meaning.

> +#
> +# Since: 11.1
> +##
> +{ 'struct': 'MonitorHMPProperties',
> +  'base': 'MonitorProperties',
> +  'data': { '*readline': 'bool' } }
> +
> +##
> +# @MonitorQMPProperties:
> +#
> +# Properties for the QMP monitor
> +#
> +# @pretty: whether to pretty print JSON responses (default: disabled)

Likewise.

> +#
> +# Since: 11.1
> +##
> +{ 'struct': 'MonitorQMPProperties',
> +  'base': 'MonitorProperties',
> +  'data': { '*pretty': 'bool' } }
> +
>  ##
>  # @ObjectType:
>  #
> @@ -1237,6 +1276,8 @@
>      'memory-backend-ram',
>      { 'name': 'memory-backend-shm',
>        'if': 'CONFIG_POSIX' },
> +    'monitor-hmp',
> +    'monitor-qmp',
>      'pef-guest',
>      { 'name': 'pr-manager-helper',
>        'if': 'CONFIG_LINUX' },
> @@ -1315,6 +1356,8 @@
>        'memory-backend-ram':         'MemoryBackendProperties',
>        'memory-backend-shm':         { 'type': 'MemoryBackendShmProperties',
>                                        'if': 'CONFIG_POSIX' },
> +      'monitor-hmp':                {'type': 'MonitorHMPProperties' },
> +      'monitor-qmp':                {'type': 'MonitorQMPProperties' },

Use the short form when possible:

         'monitor-hmp':                'MonitorHMPProperties',
         'monitor-qmp':                'MonitorQMPProperties',

>        'pr-manager-helper':          { 'type': 'PrManagerHelperProperties',
>                                        'if': 'CONFIG_LINUX' },
>        'qtest':                      'QtestProperties',
> diff --git a/stubs/monitor-internal.c b/stubs/monitor-internal.c
> index 51db7588b9..59ccc4b35c 100644
> --- a/stubs/monitor-internal.c
> +++ b/stubs/monitor-internal.c
> @@ -10,4 +10,5 @@ int monitor_get_fd(Monitor *mon, const char *name, Error 
> **errp)
>  
>  void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **errp)
>  {
> +    g_assert_not_reached();
>  }
> diff --git a/system/vl.c b/system/vl.c
> index fb36140aac..79ed2be449 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -1830,6 +1830,10 @@ static void object_option_add_visitor(Visitor *v)
>  {
>      ObjectOption *opt = g_new0(ObjectOption, 1);
>      visit_type_ObjectOptions(v, NULL, &opt->opts, &error_fatal);
> +    if (opt->opts->qom_type == OBJECT_TYPE_MONITOR_HMP ||
> +        opt->opts->qom_type == OBJECT_TYPE_MONITOR_QMP) {
> +        default_monitor = 0;
> +    }

Still okay, but if we pick up more, we better do it like
default_driver_disable() does for devices.

>      QTAILQ_INSERT_TAIL(&object_opts, opt, next);
>  }
>  
> @@ -1971,7 +1975,9 @@ static bool object_create_early(const char *type)
>  
>      /* Reason: property "chardev" */
>      if (g_str_equal(type, "rng-egd") ||
> -        g_str_equal(type, "qtest")) {
> +        g_str_equal(type, "qtest") ||
> +        g_str_equal(type, "monitor-hmp") ||
> +        g_str_equal(type, "monitor-qmp")) {
>          return false;
>      }

QAPI schema
Acked-by: Markus Armbruster <[email protected]>

Reply via email to