qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v9] qapi: introduce 'query-kvm-cpuid' action


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [PATCH v9] qapi: introduce 'query-kvm-cpuid' action
Date: Thu, 3 Jun 2021 15:29:12 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.2

03.06.2021 12:07, 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: {
   "return": [
     {
       "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,
       "in-eax": 1,
       "ecx": 2176328193,
       "ebx": 2048
     },
     ....
     {
       "eax": 12328,
       "edx": 0,
       "in-eax": 2147483656,
       "ecx": 0,
       "ebx": 0
     }
   ]
}

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

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

--
Best regards,
Vladimir



reply via email to

[Prev in Thread] Current Thread [Next in Thread]