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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list