All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-05-31 12:38 Valeriy Vdovin
  2021-06-02 12:24 ` Vladimir Sementsov-Ogievskiy
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Valeriy Vdovin @ 2021-05-31 12:38 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eduardo Habkost, Marcel Apfelbaum, Eric Blake, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy,
	Valeriy Vdovin

Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
get virtualized cpu model info generated by QEMU during VM initialization in
the form of cpuid representation.

Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
command line option. From there it takes the name of the model as the basis for
feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
that state if additional cpu features should be present on the virtual cpu or
excluded from it (tokens '+'/'-' or '=on'/'=off').
After that QEMU checks if the host's cpu can actually support the derived
feature set and applies host limitations to it.
After this initialization procedure, virtual cpu has it's model and
vendor names, and a working feature set and is ready for identification
instructions such as CPUID.

Currently full output for this method is only supported for x86 cpus.

To learn exactly how virtual cpu is presented to the guest machine via CPUID
instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
method, one can get a full listing of all CPUID leafs with subleafs which are
supported by the initialized virtual cpu.

Other than debug, the method is useful in cases when we would like to
utilize QEMU's virtual cpu initialization routines and put the retrieved
values into kernel CPUID overriding mechanics for more precise control
over how various processes perceive its underlying hardware with
container processes as a good example.

Output format:
The output is a plain list of leaf/subleaf agrument combinations, that
return 4 words in registers EAX, EBX, ECX, EDX.

Use example:
qmp_request: {
  "execute": "query-kvm-cpuid"
}

qmp_response: [
  {
    "eax": 1073741825,
    "edx": 77,
    "in_eax": 1073741824,
    "ecx": 1447775574,
    "ebx": 1263359563,
  },
  {
    "eax": 16777339,
    "edx": 0,
    "in_eax": 1073741825,
    "ecx": 0,
    "ebx": 0,
  },
  {
    "eax": 13,
    "edx": 1231384169,
    "in_eax": 0,
    "ecx": 1818588270,
    "ebx": 1970169159,
  },
  {
    "eax": 198354,
    "edx": 126614527,
  ....

Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>

v2: - Removed leaf/subleaf iterators.
    - Modified cpu_x86_cpuid to return false in cases when count is
      greater than supported subleaves.
v3: - Fixed structure name coding style.
    - Added more comments
    - Ensured buildability for non-x86 targets.
v4: - Fixed cpu_x86_cpuid return value logic and handling of 0xA leaf.
    - Fixed comments.
    - Removed target check in qmp_query_cpu_model_cpuid.
v5: - Added error handling code in qmp_query_cpu_model_cpuid
v6: - Fixed error handling code. Added method to query_error_class
v7: - Changed implementation in favor of cached cpuid_data for
      KVM_SET_CPUID2
v8: - Renamed qmp method to query-kvm-cpuid and some fields in response.
    - Modified documentation to qmp method
    - Removed helper struct declaration
---
 qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
 target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
 tests/qtest/qmp-cmd-test.c |  1 +
 3 files changed, 81 insertions(+)

diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index e7811654b7..a83180dd24 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -329,3 +329,46 @@
 ##
 { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
   'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
+
+##
+# @CpuidEntry:
+#
+# A single entry of a CPUID response.
+#
+# One entry holds full set of information (leaf) returned to the guest in response
+# to it calling a CPUID instruction with eax, ecx used as the agruments to that
+# instruction. ecx is an optional argument as not all of the leaves support it.
+#
+# @in_eax: CPUID argument in eax
+# @in_ecx: CPUID argument in ecx
+# @eax: eax
+# @ebx: ebx
+# @ecx: ecx
+# @edx: edx
+#
+# Since: 6.1
+##
+{ 'struct': 'CpuidEntry',
+  'data': { 'in_eax' : 'uint32',
+            '*in_ecx' : 'uint32',
+            'eax' : 'uint32',
+            'ebx' : 'uint32',
+            'ecx' : 'uint32',
+            'edx' : 'uint32'
+          },
+  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
+
+##
+# @query-kvm-cpuid:
+#
+# Returns raw data from the KVM CPUID table for the first VCPU.
+# The KVM CPUID table defines the response to the CPUID
+# instruction when executed by the guest operating system.
+#
+# Returns: a list of CpuidEntry
+#
+# Since: 6.1
+##
+{ 'command': 'query-kvm-cpuid',
+  'returns': ['CpuidEntry'],
+  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 7fe9f52710..a59d6efa41 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -20,6 +20,7 @@
 
 #include <linux/kvm.h>
 #include "standard-headers/asm-x86/kvm_para.h"
+#include "qapi/qapi-commands-machine-target.h"
 
 #include "cpu.h"
 #include "sysemu/sysemu.h"
@@ -1464,6 +1465,38 @@ static Error *invtsc_mig_blocker;
 
 #define KVM_MAX_CPUID_ENTRIES  100
 
+struct kvm_cpuid2 *cpuid_data_cached;
+
+CpuidEntryList *qmp_query_kvm_cpuid(Error **errp)
+{
+    int i;
+    struct kvm_cpuid_entry2 *kvm_entry;
+    CpuidEntryList *head = NULL, **tail = &head;
+    CpuidEntry *entry;
+
+    if (!cpuid_data_cached) {
+        error_setg(errp, "VCPU was not initialized yet");
+        return NULL;
+    }
+
+    for (i = 0; i < cpuid_data_cached->nent; ++i) {
+        kvm_entry = &cpuid_data_cached->entries[i];
+        entry = g_malloc0(sizeof(*entry));
+        entry->in_eax = kvm_entry->function;
+        if (kvm_entry->flags & KVM_CPUID_FLAG_SIGNIFCANT_INDEX) {
+            entry->in_ecx = kvm_entry->index;
+            entry->has_in_ecx = true;
+        }
+        entry->eax = kvm_entry->eax;
+        entry->ebx = kvm_entry->ebx;
+        entry->ecx = kvm_entry->ecx;
+        entry->edx = kvm_entry->edx;
+        QAPI_LIST_APPEND(tail, entry);
+    }
+
+    return head;
+}
+
 int kvm_arch_init_vcpu(CPUState *cs)
 {
     struct {
@@ -1833,6 +1866,10 @@ int kvm_arch_init_vcpu(CPUState *cs)
     if (r) {
         goto fail;
     }
+    if (!cpuid_data_cached) {
+        cpuid_data_cached = g_malloc0(sizeof(cpuid_data));
+        memcpy(cpuid_data_cached, &cpuid_data, sizeof(cpuid_data));
+    }
 
     if (has_xsave) {
         env->xsave_buf = qemu_memalign(4096, sizeof(struct kvm_xsave));
diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
index c98b78d033..48add3ada1 100644
--- a/tests/qtest/qmp-cmd-test.c
+++ b/tests/qtest/qmp-cmd-test.c
@@ -46,6 +46,7 @@ static int query_error_class(const char *cmd)
         { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
         { "query-hotpluggable-cpus", ERROR_CLASS_GENERIC_ERROR },
         { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
+        { "query-kvm-cpuid", ERROR_CLASS_GENERIC_ERROR },
         { NULL, -1 }
     };
     int i;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-05-31 12:38 [PATCH v8] qapi: introduce 'query-kvm-cpuid' action Valeriy Vdovin
@ 2021-06-02 12:24 ` Vladimir Sementsov-Ogievskiy
  2021-06-02 18:17   ` Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 16+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-06-02 12:24 UTC (permalink / raw)
  To: Valeriy Vdovin, qemu-devel
  Cc: Eduardo Habkost, Marcel Apfelbaum, Eric Blake, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev

31.05.2021 15:38, Valeriy Vdovin wrote:
> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> get virtualized cpu model info generated by QEMU during VM initialization in
> the form of cpuid representation.
> 

[..]

>      "ebx": 0,
>    },
>    {
>      "eax": 13,
>      "edx": 1231384169,
>      "in_eax": 0,
>      "ecx": 1818588270,
>      "ebx": 1970169159,
>    },
>    {
>      "eax": 198354,
>      "edx": 126614527,
>    ....
> 
> Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>


Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>


> 
> v2: - Removed leaf/subleaf iterators.
>      - Modified cpu_x86_cpuid to return false in cases when count is
>        greater than supported subleaves.

[..]

> +# @in_eax: CPUID argument in eax
> +# @in_ecx: CPUID argument in ecx
> +# @eax: eax
> +# @ebx: ebx
> +# @ecx: ecx
> +# @edx: edx
> +#
> +# Since: 6.1
> +##
> +{ 'struct': 'CpuidEntry',
> +  'data': { 'in_eax' : 'uint32',
> +            '*in_ecx' : 'uint32',

I'm not sure, probably '-' instead of '_' is preferable in QAPI.

> +            'eax' : 'uint32',
> +            'ebx' : 'uint32',
> +            'ecx' : 'uint32',
> +            'edx' : 'uint32'
> +          },
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> +


-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-05-31 12:38 [PATCH v8] qapi: introduce 'query-kvm-cpuid' action Valeriy Vdovin
@ 2021-06-02 18:17   ` Philippe Mathieu-Daudé
  2021-06-02 18:17   ` Philippe Mathieu-Daudé
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-06-02 18:17 UTC (permalink / raw)
  To: Valeriy Vdovin, qemu-devel
  Cc: Eduardo Habkost, Marcel Apfelbaum, Eric Blake, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

Hi Valeriy,

(Sorry for not looking earlier than v8)

On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> get virtualized cpu model info generated by QEMU during VM initialization in
> the form of cpuid representation.
> 
> Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
> command line option. From there it takes the name of the model as the basis for
> feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
> that state if additional cpu features should be present on the virtual cpu or
> excluded from it (tokens '+'/'-' or '=on'/'=off').
> After that QEMU checks if the host's cpu can actually support the derived
> feature set and applies host limitations to it.
> After this initialization procedure, virtual cpu has it's model and
> vendor names, and a working feature set and is ready for identification
> instructions such as CPUID.
> 
> Currently full output for this method is only supported for x86 cpus.
> 
> To learn exactly how virtual cpu is presented to the guest machine via CPUID
> instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
> method, one can get a full listing of all CPUID leafs with subleafs which are
> supported by the initialized virtual cpu.
> 
> Other than debug, the method is useful in cases when we would like to
> utilize QEMU's virtual cpu initialization routines and put the retrieved
> values into kernel CPUID overriding mechanics for more precise control
> over how various processes perceive its underlying hardware with
> container processes as a good example.
> 
> Output format:
> The output is a plain list of leaf/subleaf agrument combinations, that
> return 4 words in registers EAX, EBX, ECX, EDX.
> 
> Use example:
> qmp_request: {
>   "execute": "query-kvm-cpuid"
> }
> 
> qmp_response: [
>   {
>     "eax": 1073741825,
>     "edx": 77,
>     "in_eax": 1073741824,
>     "ecx": 1447775574,
>     "ebx": 1263359563,
>   },
>   {
>     "eax": 16777339,
>     "edx": 0,
>     "in_eax": 1073741825,
>     "ecx": 0,
>     "ebx": 0,
>   },
>   {
>     "eax": 13,
>     "edx": 1231384169,
>     "in_eax": 0,
>     "ecx": 1818588270,
>     "ebx": 1970169159,
>   },
>   {
>     "eax": 198354,
>     "edx": 126614527,
>   ....
> 
> Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>

---

> 
> v2: - Removed leaf/subleaf iterators.
>     - Modified cpu_x86_cpuid to return false in cases when count is
>       greater than supported subleaves.
> v3: - Fixed structure name coding style.
>     - Added more comments
>     - Ensured buildability for non-x86 targets.
> v4: - Fixed cpu_x86_cpuid return value logic and handling of 0xA leaf.
>     - Fixed comments.
>     - Removed target check in qmp_query_cpu_model_cpuid.
> v5: - Added error handling code in qmp_query_cpu_model_cpuid
> v6: - Fixed error handling code. Added method to query_error_class
> v7: - Changed implementation in favor of cached cpuid_data for
>       KVM_SET_CPUID2
> v8: - Renamed qmp method to query-kvm-cpuid and some fields in response.
>     - Modified documentation to qmp method
>     - Removed helper struct declaration
> ---

^ Below this '---' go your comments.

>  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
>  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
>  tests/qtest/qmp-cmd-test.c |  1 +
>  3 files changed, 81 insertions(+)
> 
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index e7811654b7..a83180dd24 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -329,3 +329,46 @@
>  ##
>  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
>    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> +
> +##
> +# @CpuidEntry:
> +#
> +# A single entry of a CPUID response.
> +#
> +# One entry holds full set of information (leaf) returned to the guest in response
> +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> +# instruction. ecx is an optional argument as not all of the leaves support it.
> +#
> +# @in_eax: CPUID argument in eax
> +# @in_ecx: CPUID argument in ecx
> +# @eax: eax
> +# @ebx: ebx
> +# @ecx: ecx
> +# @edx: edx
> +#
> +# Since: 6.1
> +##
> +{ 'struct': 'CpuidEntry',
> +  'data': { 'in_eax' : 'uint32',
> +            '*in_ecx' : 'uint32',
> +            'eax' : 'uint32',
> +            'ebx' : 'uint32',
> +            'ecx' : 'uint32',
> +            'edx' : 'uint32'
> +          },
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }

What about other accelerators?

> +
> +##
> +# @query-kvm-cpuid:
> +#
> +# Returns raw data from the KVM CPUID table for the first VCPU.
> +# The KVM CPUID table defines the response to the CPUID
> +# instruction when executed by the guest operating system.

What is specific to KVM here?

What about 'query-accel-cpuid' or 'query-vm-cpu-id'?

> +#
> +# Returns: a list of CpuidEntry
> +#
> +# Since: 6.1
> +##
> +{ 'command': 'query-kvm-cpuid',
> +  'returns': ['CpuidEntry'],
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
...
> diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
> index c98b78d033..48add3ada1 100644
> --- a/tests/qtest/qmp-cmd-test.c
> +++ b/tests/qtest/qmp-cmd-test.c
> @@ -46,6 +46,7 @@ static int query_error_class(const char *cmd)
>          { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
>          { "query-hotpluggable-cpus", ERROR_CLASS_GENERIC_ERROR },
>          { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
> +        { "query-kvm-cpuid", ERROR_CLASS_GENERIC_ERROR },
>          { NULL, -1 }
>      };
>      int i;
> 


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-02 18:17   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-06-02 18:17 UTC (permalink / raw)
  To: Valeriy Vdovin, qemu-devel
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy,
	Eduardo Habkost, kvm, Marcelo Tosatti, Richard Henderson,
	Markus Armbruster, Denis Lunev, Paolo Bonzini

Hi Valeriy,

(Sorry for not looking earlier than v8)

On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> get virtualized cpu model info generated by QEMU during VM initialization in
> the form of cpuid representation.
> 
> Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
> command line option. From there it takes the name of the model as the basis for
> feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
> that state if additional cpu features should be present on the virtual cpu or
> excluded from it (tokens '+'/'-' or '=on'/'=off').
> After that QEMU checks if the host's cpu can actually support the derived
> feature set and applies host limitations to it.
> After this initialization procedure, virtual cpu has it's model and
> vendor names, and a working feature set and is ready for identification
> instructions such as CPUID.
> 
> Currently full output for this method is only supported for x86 cpus.
> 
> To learn exactly how virtual cpu is presented to the guest machine via CPUID
> instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
> method, one can get a full listing of all CPUID leafs with subleafs which are
> supported by the initialized virtual cpu.
> 
> Other than debug, the method is useful in cases when we would like to
> utilize QEMU's virtual cpu initialization routines and put the retrieved
> values into kernel CPUID overriding mechanics for more precise control
> over how various processes perceive its underlying hardware with
> container processes as a good example.
> 
> Output format:
> The output is a plain list of leaf/subleaf agrument combinations, that
> return 4 words in registers EAX, EBX, ECX, EDX.
> 
> Use example:
> qmp_request: {
>   "execute": "query-kvm-cpuid"
> }
> 
> qmp_response: [
>   {
>     "eax": 1073741825,
>     "edx": 77,
>     "in_eax": 1073741824,
>     "ecx": 1447775574,
>     "ebx": 1263359563,
>   },
>   {
>     "eax": 16777339,
>     "edx": 0,
>     "in_eax": 1073741825,
>     "ecx": 0,
>     "ebx": 0,
>   },
>   {
>     "eax": 13,
>     "edx": 1231384169,
>     "in_eax": 0,
>     "ecx": 1818588270,
>     "ebx": 1970169159,
>   },
>   {
>     "eax": 198354,
>     "edx": 126614527,
>   ....
> 
> Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>

---

> 
> v2: - Removed leaf/subleaf iterators.
>     - Modified cpu_x86_cpuid to return false in cases when count is
>       greater than supported subleaves.
> v3: - Fixed structure name coding style.
>     - Added more comments
>     - Ensured buildability for non-x86 targets.
> v4: - Fixed cpu_x86_cpuid return value logic and handling of 0xA leaf.
>     - Fixed comments.
>     - Removed target check in qmp_query_cpu_model_cpuid.
> v5: - Added error handling code in qmp_query_cpu_model_cpuid
> v6: - Fixed error handling code. Added method to query_error_class
> v7: - Changed implementation in favor of cached cpuid_data for
>       KVM_SET_CPUID2
> v8: - Renamed qmp method to query-kvm-cpuid and some fields in response.
>     - Modified documentation to qmp method
>     - Removed helper struct declaration
> ---

^ Below this '---' go your comments.

>  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
>  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
>  tests/qtest/qmp-cmd-test.c |  1 +
>  3 files changed, 81 insertions(+)
> 
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index e7811654b7..a83180dd24 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -329,3 +329,46 @@
>  ##
>  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
>    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> +
> +##
> +# @CpuidEntry:
> +#
> +# A single entry of a CPUID response.
> +#
> +# One entry holds full set of information (leaf) returned to the guest in response
> +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> +# instruction. ecx is an optional argument as not all of the leaves support it.
> +#
> +# @in_eax: CPUID argument in eax
> +# @in_ecx: CPUID argument in ecx
> +# @eax: eax
> +# @ebx: ebx
> +# @ecx: ecx
> +# @edx: edx
> +#
> +# Since: 6.1
> +##
> +{ 'struct': 'CpuidEntry',
> +  'data': { 'in_eax' : 'uint32',
> +            '*in_ecx' : 'uint32',
> +            'eax' : 'uint32',
> +            'ebx' : 'uint32',
> +            'ecx' : 'uint32',
> +            'edx' : 'uint32'
> +          },
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }

What about other accelerators?

> +
> +##
> +# @query-kvm-cpuid:
> +#
> +# Returns raw data from the KVM CPUID table for the first VCPU.
> +# The KVM CPUID table defines the response to the CPUID
> +# instruction when executed by the guest operating system.

What is specific to KVM here?

What about 'query-accel-cpuid' or 'query-vm-cpu-id'?

> +#
> +# Returns: a list of CpuidEntry
> +#
> +# Since: 6.1
> +##
> +{ 'command': 'query-kvm-cpuid',
> +  'returns': ['CpuidEntry'],
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
...
> diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
> index c98b78d033..48add3ada1 100644
> --- a/tests/qtest/qmp-cmd-test.c
> +++ b/tests/qtest/qmp-cmd-test.c
> @@ -46,6 +46,7 @@ static int query_error_class(const char *cmd)
>          { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
>          { "query-hotpluggable-cpus", ERROR_CLASS_GENERIC_ERROR },
>          { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
> +        { "query-kvm-cpuid", ERROR_CLASS_GENERIC_ERROR },
>          { NULL, -1 }
>      };
>      int i;
> 



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-06-02 18:17   ` Philippe Mathieu-Daudé
@ 2021-06-02 20:46     ` Eduardo Habkost
  -1 siblings, 0 replies; 16+ messages in thread
From: Eduardo Habkost @ 2021-06-02 20:46 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Valeriy Vdovin, qemu-devel, Marcel Apfelbaum, Eric Blake,
	Markus Armbruster, Paolo Bonzini, Marcelo Tosatti,
	Richard Henderson, Thomas Huth, Laurent Vivier, kvm, Denis Lunev,
	Vladimir Sementsov-Ogievskiy

On Wed, Jun 02, 2021 at 08:17:28PM +0200, Philippe Mathieu-Daudé wrote:
> Hi Valeriy,
> 
> (Sorry for not looking earlier than v8)
> 
> On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
> > Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> > get virtualized cpu model info generated by QEMU during VM initialization in
> > the form of cpuid representation.
> > 
> > Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
> > command line option. From there it takes the name of the model as the basis for
> > feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
> > that state if additional cpu features should be present on the virtual cpu or
> > excluded from it (tokens '+'/'-' or '=on'/'=off').
> > After that QEMU checks if the host's cpu can actually support the derived
> > feature set and applies host limitations to it.
> > After this initialization procedure, virtual cpu has it's model and
> > vendor names, and a working feature set and is ready for identification
> > instructions such as CPUID.
> > 
> > Currently full output for this method is only supported for x86 cpus.
> > 
> > To learn exactly how virtual cpu is presented to the guest machine via CPUID
> > instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
> > method, one can get a full listing of all CPUID leafs with subleafs which are
> > supported by the initialized virtual cpu.
> > 
> > Other than debug, the method is useful in cases when we would like to
> > utilize QEMU's virtual cpu initialization routines and put the retrieved
> > values into kernel CPUID overriding mechanics for more precise control
> > over how various processes perceive its underlying hardware with
> > container processes as a good example.
> > 
> > Output format:
> > The output is a plain list of leaf/subleaf agrument combinations, that
> > return 4 words in registers EAX, EBX, ECX, EDX.
> > 
> > Use example:
> > qmp_request: {
> >   "execute": "query-kvm-cpuid"
> > }
> > 
> > qmp_response: [
> >   {
> >     "eax": 1073741825,
> >     "edx": 77,
> >     "in_eax": 1073741824,
> >     "ecx": 1447775574,
> >     "ebx": 1263359563,
> >   },
> >   {
> >     "eax": 16777339,
> >     "edx": 0,
> >     "in_eax": 1073741825,
> >     "ecx": 0,
> >     "ebx": 0,
> >   },
> >   {
> >     "eax": 13,
> >     "edx": 1231384169,
> >     "in_eax": 0,
> >     "ecx": 1818588270,
> >     "ebx": 1970169159,
> >   },
> >   {
> >     "eax": 198354,
> >     "edx": 126614527,
> >   ....
> > 
> > Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>
> 
> ---
> 
> > 
> > v2: - Removed leaf/subleaf iterators.
> >     - Modified cpu_x86_cpuid to return false in cases when count is
> >       greater than supported subleaves.
> > v3: - Fixed structure name coding style.
> >     - Added more comments
> >     - Ensured buildability for non-x86 targets.
> > v4: - Fixed cpu_x86_cpuid return value logic and handling of 0xA leaf.
> >     - Fixed comments.
> >     - Removed target check in qmp_query_cpu_model_cpuid.
> > v5: - Added error handling code in qmp_query_cpu_model_cpuid
> > v6: - Fixed error handling code. Added method to query_error_class
> > v7: - Changed implementation in favor of cached cpuid_data for
> >       KVM_SET_CPUID2
> > v8: - Renamed qmp method to query-kvm-cpuid and some fields in response.
> >     - Modified documentation to qmp method
> >     - Removed helper struct declaration
> > ---
> 
> ^ Below this '---' go your comments.
> 
> >  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
> >  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
> >  tests/qtest/qmp-cmd-test.c |  1 +
> >  3 files changed, 81 insertions(+)
> > 
> > diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> > index e7811654b7..a83180dd24 100644
> > --- a/qapi/machine-target.json
> > +++ b/qapi/machine-target.json
> > @@ -329,3 +329,46 @@
> >  ##
> >  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
> >    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> > +
> > +##
> > +# @CpuidEntry:
> > +#
> > +# A single entry of a CPUID response.
> > +#
> > +# One entry holds full set of information (leaf) returned to the guest in response
> > +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> > +# instruction. ecx is an optional argument as not all of the leaves support it.
> > +#
> > +# @in_eax: CPUID argument in eax
> > +# @in_ecx: CPUID argument in ecx
> > +# @eax: eax
> > +# @ebx: ebx
> > +# @ecx: ecx
> > +# @edx: edx
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'struct': 'CpuidEntry',
> > +  'data': { 'in_eax' : 'uint32',
> > +            '*in_ecx' : 'uint32',
> > +            'eax' : 'uint32',
> > +            'ebx' : 'uint32',
> > +            'ecx' : 'uint32',
> > +            'edx' : 'uint32'
> > +          },
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> 
> What about other accelerators?
> 
> > +
> > +##
> > +# @query-kvm-cpuid:
> > +#
> > +# Returns raw data from the KVM CPUID table for the first VCPU.
> > +# The KVM CPUID table defines the response to the CPUID
> > +# instruction when executed by the guest operating system.
> 
> What is specific to KVM here?
> 
> What about 'query-accel-cpuid' or 'query-vm-cpu-id'?

The implementation is KVM-specific.  I believe it's a reasonable
compromise because the implementation is trivial, and a raw copy
of the KVM CPUID table makes it a more useful (KVM-specific)
debugging/testing mechanism.

I don't really mind how the command is called, but I would prefer
to add a more complex abstraction only if maintainers of other
accelerators are interested and volunteer to provide similar
functionality.  I don't want to introduce complexity for use
cases that may not even exist.

> 
> > +#
> > +# Returns: a list of CpuidEntry
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'command': 'query-kvm-cpuid',
> > +  'returns': ['CpuidEntry'],
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> ...
> > diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
> > index c98b78d033..48add3ada1 100644
> > --- a/tests/qtest/qmp-cmd-test.c
> > +++ b/tests/qtest/qmp-cmd-test.c
> > @@ -46,6 +46,7 @@ static int query_error_class(const char *cmd)
> >          { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
> >          { "query-hotpluggable-cpus", ERROR_CLASS_GENERIC_ERROR },
> >          { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
> > +        { "query-kvm-cpuid", ERROR_CLASS_GENERIC_ERROR },
> >          { NULL, -1 }
> >      };
> >      int i;
> > 
> 

-- 
Eduardo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-02 20:46     ` Eduardo Habkost
  0 siblings, 0 replies; 16+ messages in thread
From: Eduardo Habkost @ 2021-06-02 20:46 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy, kvm,
	Marcelo Tosatti, Richard Henderson, Markus Armbruster,
	qemu-devel, Valeriy Vdovin, Denis Lunev, Paolo Bonzini

On Wed, Jun 02, 2021 at 08:17:28PM +0200, Philippe Mathieu-Daudé wrote:
> Hi Valeriy,
> 
> (Sorry for not looking earlier than v8)
> 
> On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
> > Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> > get virtualized cpu model info generated by QEMU during VM initialization in
> > the form of cpuid representation.
> > 
> > Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
> > command line option. From there it takes the name of the model as the basis for
> > feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
> > that state if additional cpu features should be present on the virtual cpu or
> > excluded from it (tokens '+'/'-' or '=on'/'=off').
> > After that QEMU checks if the host's cpu can actually support the derived
> > feature set and applies host limitations to it.
> > After this initialization procedure, virtual cpu has it's model and
> > vendor names, and a working feature set and is ready for identification
> > instructions such as CPUID.
> > 
> > Currently full output for this method is only supported for x86 cpus.
> > 
> > To learn exactly how virtual cpu is presented to the guest machine via CPUID
> > instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
> > method, one can get a full listing of all CPUID leafs with subleafs which are
> > supported by the initialized virtual cpu.
> > 
> > Other than debug, the method is useful in cases when we would like to
> > utilize QEMU's virtual cpu initialization routines and put the retrieved
> > values into kernel CPUID overriding mechanics for more precise control
> > over how various processes perceive its underlying hardware with
> > container processes as a good example.
> > 
> > Output format:
> > The output is a plain list of leaf/subleaf agrument combinations, that
> > return 4 words in registers EAX, EBX, ECX, EDX.
> > 
> > Use example:
> > qmp_request: {
> >   "execute": "query-kvm-cpuid"
> > }
> > 
> > qmp_response: [
> >   {
> >     "eax": 1073741825,
> >     "edx": 77,
> >     "in_eax": 1073741824,
> >     "ecx": 1447775574,
> >     "ebx": 1263359563,
> >   },
> >   {
> >     "eax": 16777339,
> >     "edx": 0,
> >     "in_eax": 1073741825,
> >     "ecx": 0,
> >     "ebx": 0,
> >   },
> >   {
> >     "eax": 13,
> >     "edx": 1231384169,
> >     "in_eax": 0,
> >     "ecx": 1818588270,
> >     "ebx": 1970169159,
> >   },
> >   {
> >     "eax": 198354,
> >     "edx": 126614527,
> >   ....
> > 
> > Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>
> 
> ---
> 
> > 
> > v2: - Removed leaf/subleaf iterators.
> >     - Modified cpu_x86_cpuid to return false in cases when count is
> >       greater than supported subleaves.
> > v3: - Fixed structure name coding style.
> >     - Added more comments
> >     - Ensured buildability for non-x86 targets.
> > v4: - Fixed cpu_x86_cpuid return value logic and handling of 0xA leaf.
> >     - Fixed comments.
> >     - Removed target check in qmp_query_cpu_model_cpuid.
> > v5: - Added error handling code in qmp_query_cpu_model_cpuid
> > v6: - Fixed error handling code. Added method to query_error_class
> > v7: - Changed implementation in favor of cached cpuid_data for
> >       KVM_SET_CPUID2
> > v8: - Renamed qmp method to query-kvm-cpuid and some fields in response.
> >     - Modified documentation to qmp method
> >     - Removed helper struct declaration
> > ---
> 
> ^ Below this '---' go your comments.
> 
> >  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
> >  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
> >  tests/qtest/qmp-cmd-test.c |  1 +
> >  3 files changed, 81 insertions(+)
> > 
> > diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> > index e7811654b7..a83180dd24 100644
> > --- a/qapi/machine-target.json
> > +++ b/qapi/machine-target.json
> > @@ -329,3 +329,46 @@
> >  ##
> >  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
> >    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> > +
> > +##
> > +# @CpuidEntry:
> > +#
> > +# A single entry of a CPUID response.
> > +#
> > +# One entry holds full set of information (leaf) returned to the guest in response
> > +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> > +# instruction. ecx is an optional argument as not all of the leaves support it.
> > +#
> > +# @in_eax: CPUID argument in eax
> > +# @in_ecx: CPUID argument in ecx
> > +# @eax: eax
> > +# @ebx: ebx
> > +# @ecx: ecx
> > +# @edx: edx
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'struct': 'CpuidEntry',
> > +  'data': { 'in_eax' : 'uint32',
> > +            '*in_ecx' : 'uint32',
> > +            'eax' : 'uint32',
> > +            'ebx' : 'uint32',
> > +            'ecx' : 'uint32',
> > +            'edx' : 'uint32'
> > +          },
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> 
> What about other accelerators?
> 
> > +
> > +##
> > +# @query-kvm-cpuid:
> > +#
> > +# Returns raw data from the KVM CPUID table for the first VCPU.
> > +# The KVM CPUID table defines the response to the CPUID
> > +# instruction when executed by the guest operating system.
> 
> What is specific to KVM here?
> 
> What about 'query-accel-cpuid' or 'query-vm-cpu-id'?

The implementation is KVM-specific.  I believe it's a reasonable
compromise because the implementation is trivial, and a raw copy
of the KVM CPUID table makes it a more useful (KVM-specific)
debugging/testing mechanism.

I don't really mind how the command is called, but I would prefer
to add a more complex abstraction only if maintainers of other
accelerators are interested and volunteer to provide similar
functionality.  I don't want to introduce complexity for use
cases that may not even exist.

> 
> > +#
> > +# Returns: a list of CpuidEntry
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'command': 'query-kvm-cpuid',
> > +  'returns': ['CpuidEntry'],
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> ...
> > diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
> > index c98b78d033..48add3ada1 100644
> > --- a/tests/qtest/qmp-cmd-test.c
> > +++ b/tests/qtest/qmp-cmd-test.c
> > @@ -46,6 +46,7 @@ static int query_error_class(const char *cmd)
> >          { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
> >          { "query-hotpluggable-cpus", ERROR_CLASS_GENERIC_ERROR },
> >          { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
> > +        { "query-kvm-cpuid", ERROR_CLASS_GENERIC_ERROR },
> >          { NULL, -1 }
> >      };
> >      int i;
> > 
> 

-- 
Eduardo



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-05-31 12:38 [PATCH v8] qapi: introduce 'query-kvm-cpuid' action Valeriy Vdovin
@ 2021-06-02 20:51   ` Eric Blake
  2021-06-02 18:17   ` Philippe Mathieu-Daudé
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 16+ messages in thread
From: Eric Blake @ 2021-06-02 20:51 UTC (permalink / raw)
  To: Valeriy Vdovin
  Cc: qemu-devel, Eduardo Habkost, Marcel Apfelbaum, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

On Mon, May 31, 2021 at 03:38:06PM +0300, Valeriy Vdovin wrote:
> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> get virtualized cpu model info generated by QEMU during VM initialization in
> the form of cpuid representation.
> 
> 
> Use example:
> qmp_request: {
>   "execute": "query-kvm-cpuid"
> }
> 
> qmp_response: [
>   {
>     "eax": 1073741825,
>     "edx": 77,
>     "in_eax": 1073741824,
>     "ecx": 1447775574,
>     "ebx": 1263359563,
>   },

JSON does not permit a trailing ',' before '}'; which means you did
not actually paste an actual QMP response here.

> ---
>  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
>  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
>  tests/qtest/qmp-cmd-test.c |  1 +
>  3 files changed, 81 insertions(+)
> 
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index e7811654b7..a83180dd24 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -329,3 +329,46 @@
>  ##
>  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
>    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> +
> +##
> +# @CpuidEntry:
> +#
> +# A single entry of a CPUID response.
> +#
> +# One entry holds full set of information (leaf) returned to the guest in response
> +# to it calling a CPUID instruction with eax, ecx used as the agruments to that

arguments

> +# instruction. ecx is an optional argument as not all of the leaves support it.

Is there a default value of ecx for when it is not provided by the
user but needed by the leaf?  Or is it an error if ecx is omitted in
that case?  Similarly, is it an error if ecx is provided but not
needed?

> +#
> +# @in_eax: CPUID argument in eax
> +# @in_ecx: CPUID argument in ecx

Should be in-eax, in-ecx.

> +# @eax: eax
> +# @ebx: ebx
> +# @ecx: ecx
> +# @edx: edx
> +#
> +# Since: 6.1
> +##
> +{ 'struct': 'CpuidEntry',
> +  'data': { 'in_eax' : 'uint32',
> +            '*in_ecx' : 'uint32',
> +            'eax' : 'uint32',
> +            'ebx' : 'uint32',
> +            'ecx' : 'uint32',
> +            'edx' : 'uint32'
> +          },
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> +
> +##
> +# @query-kvm-cpuid:
> +#
> +# Returns raw data from the KVM CPUID table for the first VCPU.
> +# The KVM CPUID table defines the response to the CPUID
> +# instruction when executed by the guest operating system.
> +#
> +# Returns: a list of CpuidEntry
> +#
> +# Since: 6.1
> +##
> +{ 'command': 'query-kvm-cpuid',
> +  'returns': ['CpuidEntry'],
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-02 20:51   ` Eric Blake
  0 siblings, 0 replies; 16+ messages in thread
From: Eric Blake @ 2021-06-02 20:51 UTC (permalink / raw)
  To: Valeriy Vdovin
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy,
	Eduardo Habkost, kvm, Marcelo Tosatti, Richard Henderson,
	Markus Armbruster, qemu-devel, Denis Lunev, Paolo Bonzini

On Mon, May 31, 2021 at 03:38:06PM +0300, Valeriy Vdovin wrote:
> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> get virtualized cpu model info generated by QEMU during VM initialization in
> the form of cpuid representation.
> 
> 
> Use example:
> qmp_request: {
>   "execute": "query-kvm-cpuid"
> }
> 
> qmp_response: [
>   {
>     "eax": 1073741825,
>     "edx": 77,
>     "in_eax": 1073741824,
>     "ecx": 1447775574,
>     "ebx": 1263359563,
>   },

JSON does not permit a trailing ',' before '}'; which means you did
not actually paste an actual QMP response here.

> ---
>  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
>  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
>  tests/qtest/qmp-cmd-test.c |  1 +
>  3 files changed, 81 insertions(+)
> 
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index e7811654b7..a83180dd24 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -329,3 +329,46 @@
>  ##
>  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
>    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> +
> +##
> +# @CpuidEntry:
> +#
> +# A single entry of a CPUID response.
> +#
> +# One entry holds full set of information (leaf) returned to the guest in response
> +# to it calling a CPUID instruction with eax, ecx used as the agruments to that

arguments

> +# instruction. ecx is an optional argument as not all of the leaves support it.

Is there a default value of ecx for when it is not provided by the
user but needed by the leaf?  Or is it an error if ecx is omitted in
that case?  Similarly, is it an error if ecx is provided but not
needed?

> +#
> +# @in_eax: CPUID argument in eax
> +# @in_ecx: CPUID argument in ecx

Should be in-eax, in-ecx.

> +# @eax: eax
> +# @ebx: ebx
> +# @ecx: ecx
> +# @edx: edx
> +#
> +# Since: 6.1
> +##
> +{ 'struct': 'CpuidEntry',
> +  'data': { 'in_eax' : 'uint32',
> +            '*in_ecx' : 'uint32',
> +            'eax' : 'uint32',
> +            'ebx' : 'uint32',
> +            'ecx' : 'uint32',
> +            'edx' : 'uint32'
> +          },
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> +
> +##
> +# @query-kvm-cpuid:
> +#
> +# Returns raw data from the KVM CPUID table for the first VCPU.
> +# The KVM CPUID table defines the response to the CPUID
> +# instruction when executed by the guest operating system.
> +#
> +# Returns: a list of CpuidEntry
> +#
> +# Since: 6.1
> +##
> +{ 'command': 'query-kvm-cpuid',
> +  'returns': ['CpuidEntry'],
> +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-06-02 20:51   ` Eric Blake
@ 2021-06-02 21:01     ` Eduardo Habkost
  -1 siblings, 0 replies; 16+ messages in thread
From: Eduardo Habkost @ 2021-06-02 21:01 UTC (permalink / raw)
  To: Eric Blake
  Cc: Valeriy Vdovin, qemu-devel, Marcel Apfelbaum, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

On Wed, Jun 02, 2021 at 03:51:02PM -0500, Eric Blake wrote:
> On Mon, May 31, 2021 at 03:38:06PM +0300, Valeriy Vdovin wrote:
[...]
> > +##
> > +# @CpuidEntry:
> > +#
> > +# A single entry of a CPUID response.
> > +#
> > +# One entry holds full set of information (leaf) returned to the guest in response
> > +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> 
> arguments
> 
> > +# instruction. ecx is an optional argument as not all of the leaves support it.
> 
> Is there a default value of ecx for when it is not provided by the
> user but needed by the leaf?  Or is it an error if ecx is omitted in
> that case?  Similarly, is it an error if ecx is provided but not
> needed?

What does "not provided by the user" mean here?  This is not
describing the input to a QMP command, but the input to the CPUID
instruction.

-- 
Eduardo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-02 21:01     ` Eduardo Habkost
  0 siblings, 0 replies; 16+ messages in thread
From: Eduardo Habkost @ 2021-06-02 21:01 UTC (permalink / raw)
  To: Eric Blake
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy, kvm,
	Marcelo Tosatti, Richard Henderson, Markus Armbruster,
	qemu-devel, Valeriy Vdovin, Denis Lunev, Paolo Bonzini

On Wed, Jun 02, 2021 at 03:51:02PM -0500, Eric Blake wrote:
> On Mon, May 31, 2021 at 03:38:06PM +0300, Valeriy Vdovin wrote:
[...]
> > +##
> > +# @CpuidEntry:
> > +#
> > +# A single entry of a CPUID response.
> > +#
> > +# One entry holds full set of information (leaf) returned to the guest in response
> > +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> 
> arguments
> 
> > +# instruction. ecx is an optional argument as not all of the leaves support it.
> 
> Is there a default value of ecx for when it is not provided by the
> user but needed by the leaf?  Or is it an error if ecx is omitted in
> that case?  Similarly, is it an error if ecx is provided but not
> needed?

What does "not provided by the user" mean here?  This is not
describing the input to a QMP command, but the input to the CPUID
instruction.

-- 
Eduardo



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-06-02 20:46     ` Eduardo Habkost
@ 2021-06-02 23:24       ` Philippe Mathieu-Daudé
  -1 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-06-02 23:24 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Valeriy Vdovin, qemu-devel, Marcel Apfelbaum, Eric Blake,
	Markus Armbruster, Paolo Bonzini, Marcelo Tosatti,
	Richard Henderson, Thomas Huth, Laurent Vivier, kvm, Denis Lunev,
	Vladimir Sementsov-Ogievskiy

On 6/2/21 10:46 PM, Eduardo Habkost wrote:
> On Wed, Jun 02, 2021 at 08:17:28PM +0200, Philippe Mathieu-Daudé wrote:
>> Hi Valeriy,
>>
>> (Sorry for not looking earlier than v8)
>>
>> On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
>>> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
>>> get virtualized cpu model info generated by QEMU during VM initialization in
>>> the form of cpuid representation.
>>>
>>> Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
>>> command line option. From there it takes the name of the model as the basis for
>>> feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
>>> that state if additional cpu features should be present on the virtual cpu or
>>> excluded from it (tokens '+'/'-' or '=on'/'=off').
>>> After that QEMU checks if the host's cpu can actually support the derived
>>> feature set and applies host limitations to it.
>>> After this initialization procedure, virtual cpu has it's model and
>>> vendor names, and a working feature set and is ready for identification
>>> instructions such as CPUID.
>>>
>>> Currently full output for this method is only supported for x86 cpus.
>>>
>>> To learn exactly how virtual cpu is presented to the guest machine via CPUID
>>> instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
>>> method, one can get a full listing of all CPUID leafs with subleafs which are
>>> supported by the initialized virtual cpu.
>>>
>>> Other than debug, the method is useful in cases when we would like to
>>> utilize QEMU's virtual cpu initialization routines and put the retrieved
>>> values into kernel CPUID overriding mechanics for more precise control
>>> over how various processes perceive its underlying hardware with
>>> container processes as a good example.
>>>
>>> Output format:
>>> The output is a plain list of leaf/subleaf agrument combinations, that
>>> return 4 words in registers EAX, EBX, ECX, EDX.
>>>
>>> Use example:
>>> qmp_request: {
>>>   "execute": "query-kvm-cpuid"
>>> }
>>>
>>> qmp_response: [
>>>   {
>>>     "eax": 1073741825,
>>>     "edx": 77,
>>>     "in_eax": 1073741824,
>>>     "ecx": 1447775574,
>>>     "ebx": 1263359563,
>>>   },
>>>   {
>>>     "eax": 16777339,
>>>     "edx": 0,
>>>     "in_eax": 1073741825,
>>>     "ecx": 0,
>>>     "ebx": 0,
>>>   },
>>>   {
>>>     "eax": 13,
>>>     "edx": 1231384169,
>>>     "in_eax": 0,
>>>     "ecx": 1818588270,
>>>     "ebx": 1970169159,
>>>   },
>>>   {
>>>     "eax": 198354,
>>>     "edx": 126614527,
>>>   ....
>>>
>>> Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>

>>> +##
>>> +# @query-kvm-cpuid:
>>> +#
>>> +# Returns raw data from the KVM CPUID table for the first VCPU.
>>> +# The KVM CPUID table defines the response to the CPUID
>>> +# instruction when executed by the guest operating system.
>>
>> What is specific to KVM here?
>>
>> What about 'query-accel-cpuid' or 'query-vm-cpu-id'?
> 
> The implementation is KVM-specific.  I believe it's a reasonable
> compromise because the implementation is trivial, and a raw copy
> of the KVM CPUID table makes it a more useful (KVM-specific)
> debugging/testing mechanism.
> 
> I don't really mind how the command is called, but I would prefer
> to add a more complex abstraction only if maintainers of other
> accelerators are interested and volunteer to provide similar
> functionality.  I don't want to introduce complexity for use
> cases that may not even exist.

Fine, fair enough.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-02 23:24       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-06-02 23:24 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy, kvm,
	Marcelo Tosatti, Richard Henderson, Markus Armbruster,
	qemu-devel, Valeriy Vdovin, Denis Lunev, Paolo Bonzini

On 6/2/21 10:46 PM, Eduardo Habkost wrote:
> On Wed, Jun 02, 2021 at 08:17:28PM +0200, Philippe Mathieu-Daudé wrote:
>> Hi Valeriy,
>>
>> (Sorry for not looking earlier than v8)
>>
>> On 5/31/21 2:38 PM, Valeriy Vdovin wrote:
>>> Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
>>> get virtualized cpu model info generated by QEMU during VM initialization in
>>> the form of cpuid representation.
>>>
>>> Diving into more details about virtual cpu generation: QEMU first parses '-cpu'
>>> command line option. From there it takes the name of the model as the basis for
>>> feature set of the new virtual cpu. After that it uses trailing '-cpu' options,
>>> that state if additional cpu features should be present on the virtual cpu or
>>> excluded from it (tokens '+'/'-' or '=on'/'=off').
>>> After that QEMU checks if the host's cpu can actually support the derived
>>> feature set and applies host limitations to it.
>>> After this initialization procedure, virtual cpu has it's model and
>>> vendor names, and a working feature set and is ready for identification
>>> instructions such as CPUID.
>>>
>>> Currently full output for this method is only supported for x86 cpus.
>>>
>>> To learn exactly how virtual cpu is presented to the guest machine via CPUID
>>> instruction, new qapi method can be used. By calling 'query-kvm-cpuid'
>>> method, one can get a full listing of all CPUID leafs with subleafs which are
>>> supported by the initialized virtual cpu.
>>>
>>> Other than debug, the method is useful in cases when we would like to
>>> utilize QEMU's virtual cpu initialization routines and put the retrieved
>>> values into kernel CPUID overriding mechanics for more precise control
>>> over how various processes perceive its underlying hardware with
>>> container processes as a good example.
>>>
>>> Output format:
>>> The output is a plain list of leaf/subleaf agrument combinations, that
>>> return 4 words in registers EAX, EBX, ECX, EDX.
>>>
>>> Use example:
>>> qmp_request: {
>>>   "execute": "query-kvm-cpuid"
>>> }
>>>
>>> qmp_response: [
>>>   {
>>>     "eax": 1073741825,
>>>     "edx": 77,
>>>     "in_eax": 1073741824,
>>>     "ecx": 1447775574,
>>>     "ebx": 1263359563,
>>>   },
>>>   {
>>>     "eax": 16777339,
>>>     "edx": 0,
>>>     "in_eax": 1073741825,
>>>     "ecx": 0,
>>>     "ebx": 0,
>>>   },
>>>   {
>>>     "eax": 13,
>>>     "edx": 1231384169,
>>>     "in_eax": 0,
>>>     "ecx": 1818588270,
>>>     "ebx": 1970169159,
>>>   },
>>>   {
>>>     "eax": 198354,
>>>     "edx": 126614527,
>>>   ....
>>>
>>> Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>

>>> +##
>>> +# @query-kvm-cpuid:
>>> +#
>>> +# Returns raw data from the KVM CPUID table for the first VCPU.
>>> +# The KVM CPUID table defines the response to the CPUID
>>> +# instruction when executed by the guest operating system.
>>
>> What is specific to KVM here?
>>
>> What about 'query-accel-cpuid' or 'query-vm-cpu-id'?
> 
> The implementation is KVM-specific.  I believe it's a reasonable
> compromise because the implementation is trivial, and a raw copy
> of the KVM CPUID table makes it a more useful (KVM-specific)
> debugging/testing mechanism.
> 
> I don't really mind how the command is called, but I would prefer
> to add a more complex abstraction only if maintainers of other
> accelerators are interested and volunteer to provide similar
> functionality.  I don't want to introduce complexity for use
> cases that may not even exist.

Fine, fair enough.



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-06-02 20:51   ` Eric Blake
  (?)
  (?)
@ 2021-06-03  8:21   ` Valeriy Vdovin
  -1 siblings, 0 replies; 16+ messages in thread
From: Valeriy Vdovin @ 2021-06-03  8:21 UTC (permalink / raw)
  To: Eric Blake
  Cc: qemu-devel, Eduardo Habkost, Marcel Apfelbaum, Markus Armbruster,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

On Wed, Jun 02, 2021 at 03:51:02PM -0500, Eric Blake wrote:
> On Mon, May 31, 2021 at 03:38:06PM +0300, Valeriy Vdovin wrote:
> > Introducing new qapi method 'query-kvm-cpuid'. This method can be used to
> > get virtualized cpu model info generated by QEMU during VM initialization in
> > the form of cpuid representation.
> > 
> > 
> > Use example:
> > qmp_request: {
> >   "execute": "query-kvm-cpuid"
> > }
> > 
> > qmp_response: [
> >   {
> >     "eax": 1073741825,
> >     "edx": 77,
> >     "in_eax": 1073741824,
> >     "ecx": 1447775574,
> >     "ebx": 1263359563,
> >   },
> 
> JSON does not permit a trailing ',' before '}'; which means you did
> not actually paste an actual QMP response here.
> 

I actually did paste it. Here is a python code-snippet of my test script
that I've used to extract the above response:

  self.__p.stdin.writelines([cmdstring])
  self.__p.stdin.flush()
  out = self.__p.stdout.readline()
  print(out)
  resp = json.loads(out)['return']
  pretty = json.dumps(resp, indent=2)
  print('qmp_response: {}'.format(pretty)) <- this is what I've copied.
> > ---
> >  qapi/machine-target.json   | 43 ++++++++++++++++++++++++++++++++++++++
> >  target/i386/kvm/kvm.c      | 37 ++++++++++++++++++++++++++++++++
> >  tests/qtest/qmp-cmd-test.c |  1 +
> >  3 files changed, 81 insertions(+)
> > 
> > diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> > index e7811654b7..a83180dd24 100644
> > --- a/qapi/machine-target.json
> > +++ b/qapi/machine-target.json
> > @@ -329,3 +329,46 @@
> >  ##
> >  { 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'],
> >    'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
> > +
> > +##
> > +# @CpuidEntry:
> > +#
> > +# A single entry of a CPUID response.
> > +#
> > +# One entry holds full set of information (leaf) returned to the guest in response
> > +# to it calling a CPUID instruction with eax, ecx used as the agruments to that
> 
> arguments
> 
> > +# instruction. ecx is an optional argument as not all of the leaves support it.
> 
> Is there a default value of ecx for when it is not provided by the
> user but needed by the leaf?  Or is it an error if ecx is omitted in
> that case?  Similarly, is it an error if ecx is provided but not
> needed?
> 
> > +#
> > +# @in_eax: CPUID argument in eax
> > +# @in_ecx: CPUID argument in ecx
> 
> Should be in-eax, in-ecx.
> 
> > +# @eax: eax
> > +# @ebx: ebx
> > +# @ecx: ecx
> > +# @edx: edx
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'struct': 'CpuidEntry',
> > +  'data': { 'in_eax' : 'uint32',
> > +            '*in_ecx' : 'uint32',
> > +            'eax' : 'uint32',
> > +            'ebx' : 'uint32',
> > +            'ecx' : 'uint32',
> > +            'edx' : 'uint32'
> > +          },
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> > +
> > +##
> > +# @query-kvm-cpuid:
> > +#
> > +# Returns raw data from the KVM CPUID table for the first VCPU.
> > +# The KVM CPUID table defines the response to the CPUID
> > +# instruction when executed by the guest operating system.
> > +#
> > +# Returns: a list of CpuidEntry
> > +#
> > +# Since: 6.1
> > +##
> > +{ 'command': 'query-kvm-cpuid',
> > +  'returns': ['CpuidEntry'],
> > +  'if': 'defined(TARGET_I386) && defined(CONFIG_KVM)' }
> 
> -- 
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.           +1-919-301-3266
> Virtualization:  qemu.org | libvirt.org
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-05-31 12:38 [PATCH v8] qapi: introduce 'query-kvm-cpuid' action Valeriy Vdovin
@ 2021-06-08 15:14   ` Markus Armbruster
  2021-06-02 18:17   ` Philippe Mathieu-Daudé
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 16+ messages in thread
From: Markus Armbruster @ 2021-06-08 15:14 UTC (permalink / raw)
  To: Valeriy Vdovin
  Cc: qemu-devel, Eduardo Habkost, Marcel Apfelbaum, Eric Blake,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

Double-checking: this supersedes "[PATCH v7 0/1] qapi: introduce
'query-cpu-model-cpuid' action"?


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
@ 2021-06-08 15:14   ` Markus Armbruster
  0 siblings, 0 replies; 16+ messages in thread
From: Markus Armbruster @ 2021-06-08 15:14 UTC (permalink / raw)
  To: Valeriy Vdovin
  Cc: Laurent Vivier, Thomas Huth, Vladimir Sementsov-Ogievskiy,
	Eduardo Habkost, kvm, Marcelo Tosatti, Richard Henderson,
	qemu-devel, Denis Lunev, Paolo Bonzini, Eric Blake

Double-checking: this supersedes "[PATCH v7 0/1] qapi: introduce
'query-cpu-model-cpuid' action"?



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v8] qapi: introduce 'query-kvm-cpuid' action
  2021-06-08 15:14   ` Markus Armbruster
  (?)
@ 2021-06-08 15:27   ` Valeriy Vdovin
  -1 siblings, 0 replies; 16+ messages in thread
From: Valeriy Vdovin @ 2021-06-08 15:27 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, Eduardo Habkost, Marcel Apfelbaum, Eric Blake,
	Paolo Bonzini, Marcelo Tosatti, Richard Henderson, Thomas Huth,
	Laurent Vivier, kvm, Denis Lunev, Vladimir Sementsov-Ogievskiy

On Tue, Jun 08, 2021 at 05:14:16PM +0200, Markus Armbruster wrote:
> Double-checking: this supersedes "[PATCH v7 0/1] qapi: introduce
> 'query-cpu-model-cpuid' action"?
> 
Yes. I've changed the title in response to the changed api name
and just forgot that I should have linked it to the previous versions
somehow.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2021-06-08 15:27 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-31 12:38 [PATCH v8] qapi: introduce 'query-kvm-cpuid' action Valeriy Vdovin
2021-06-02 12:24 ` Vladimir Sementsov-Ogievskiy
2021-06-02 18:17 ` Philippe Mathieu-Daudé
2021-06-02 18:17   ` Philippe Mathieu-Daudé
2021-06-02 20:46   ` Eduardo Habkost
2021-06-02 20:46     ` Eduardo Habkost
2021-06-02 23:24     ` Philippe Mathieu-Daudé
2021-06-02 23:24       ` Philippe Mathieu-Daudé
2021-06-02 20:51 ` Eric Blake
2021-06-02 20:51   ` Eric Blake
2021-06-02 21:01   ` Eduardo Habkost
2021-06-02 21:01     ` Eduardo Habkost
2021-06-03  8:21   ` Valeriy Vdovin
2021-06-08 15:14 ` Markus Armbruster
2021-06-08 15:14   ` Markus Armbruster
2021-06-08 15:27   ` Valeriy Vdovin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.