[libvirt] [PATCH] cpu: Add recently added cpu feature flags.

Martin Kletzander mkletzan at redhat.com
Wed Oct 24 15:10:55 UTC 2012


On 10/24/2012 03:56 PM, Peter Krempa wrote:
> Qemu has added some new feature flags. This patch adds them to libvirt.
> 
> The new features are for the cpuid function 0x7 that takes an argument
> in the ecx register. Currently only 0x0 is used as the argument so I was
> lazy and I just clear the registers to 0 before calling cpuid. In future
> when there maybe will be some other possible arguments, we will need to
> improve the cpu detection code to take this into account.
> ---
> The qemu flag definiton can be found at:
> http://git.qemu.org/?p=qemu.git;a=blob;f=target-i386/cpu.c;h=f3708e63b76541b12dd9eafb3b42f4b4b85b48a9;hb=HEAD#l40
> ---
>  src/cpu/cpu_map.xml | 12 ++++++++++++
>  src/cpu/cpu_x86.c   |  8 +++++++-
>  2 files changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
> index affcce3..d059e20 100644
> --- a/src/cpu/cpu_map.xml
> +++ b/src/cpu/cpu_map.xml
> @@ -142,6 +142,9 @@
>      <feature name='pdcm'>
>        <cpuid function='0x00000001' ecx='0x00008000'/>
>      </feature>
> +    <feature name='pcid'>
> +      <cpuid function='0x00000001' ecx='0x00020000'/>
> +    </feature>
>      <feature name='dca'> <!-- CPUID_EXT_DCA -->
>        <cpuid function='0x00000001' ecx='0x00040000'/>
>      </feature>
> @@ -261,6 +264,15 @@
>        <cpuid function='0x80000001' ecx='0x00080000'/>
>      </feature>
> 
> +    <!-- cpuid function 0x7 ecx 0x0 features -->
> +    <!-- We support only ecx 0x0 now as it's done by a workaround -->
> +    <feature name='smep'>
> +      <cpuid function='0x00000007' ebx='0x00000080'/>
> +    </feature>
> +    <feature name='smap'>
> +      <cpuid function='0x00000007' ebx='0x00080000'/>
> +    </feature>
> +
>      <!-- models -->
>      <model name='486'>
>        <feature name='fpu'/>
> diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
> index 7cd67b8..f54c3df 100644
> --- a/src/cpu/cpu_x86.c
> +++ b/src/cpu/cpu_x86.c
> @@ -1539,7 +1539,10 @@ static inline void
>  cpuidCall(struct cpuX86cpuid *cpuid)
>  {
>  # if __x86_64__
> -    asm("cpuid"
> +    asm("xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
> +        "xor %%ecx, %%ecx;" /* functions may use them as additional */
> +        "xor %%edx, %%edx;" /* arguments */
> +        "cpuid"

Even though it doesn't change anything, this is the only line not having
a semicolon at the end (and we have it in the "else" part), so if you
want, you can make it a bit shinier and put it here as well ;)

>          : "=a" (cpuid->eax),
>            "=b" (cpuid->ebx),
>            "=c" (cpuid->ecx),
> @@ -1550,6 +1553,9 @@ cpuidCall(struct cpuX86cpuid *cpuid)
>       * for global offset table on i386 with -fPIC
>       */
>      asm("push %%ebx;"
> +        "xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
> +        "xor %%ecx, %%ecx;" /* functions may use them as additional */
> +        "xor %%edx, %%edx;" /* arguments */
>          "cpuid;"
>          "mov %%ebx, %1;"
>          "pop %%ebx;"
> 

Makes sense, works, ACK.

Martin




More information about the libvir-list mailing list