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

Re: [Xen-devel] [PATCH 2/2] x86: drop cpu_has_sse{,2}



On 09/12/16 14:33, Jan Beulich wrote:
>>>> On 09.12.16 at 15:15, <andrew.cooper3@xxxxxxxxxx> wrote:
>> On 09/12/16 13:28, Jan Beulich wrote:
>>>>>> On 09.12.16 at 14:00, <andrew.cooper3@xxxxxxxxxx> wrote:
>>>> On 09/12/16 11:54, Jan Beulich wrote:
>>>>> Commit dc88221c97 ("x86: rename XMM* features to SSE*") pointlessly
>>>>> added them - these features are always available on 64-bit CPUs. (Let's
>>>>> not assume this for MMX though in at least the insn emulator.)
>>>>>
>>>>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>>> This isn't necessarily true when compiled for 32bit in the userspace
>>>> harness.
>>> In the test harness vcpu_has_* == cpu_has_*, as also
>>> demonstrated by
>>>
>>> #define host_and_vcpu_must_have(feat) vcpu_must_have(feat)
>>>
>>> . The change (as its title is trying to say) really only affects the
>>> hypervisor.
>> Right, but this change is still contrary to the written requirement.
> I don't understand.
>
>> /*                                                                           
>>  * Note the difference between vcpu_must_have_<feature>() and                
>>                                                           
>>  * host_and_vcpu_must_have(<feature>): The latter needs to be used when      
>>                                                                    
>>  * emulation code is using the same instruction class for carrying out       
>>                                                                    
>>  * the actual operation.                                                     
>>               
>>  */
> This comment sits inside #ifdef __XEN__.

Yes, which means it applies to code running in the hypervisor.

>
>> We are using SSE and SSE2 instructions for carrying out that emulation,
>> so should still be using the host_and_vcpu check.
> Xen only running on x86-64, and x86-64 taking SSE and SSE2 as
> given (all math operations other than 80-bit ones are using these
> instead of the x87), there's no need to look at any flags here
> (and as you can see from the patch, the flags also already haven't
> been used anywhere outside the insn emulator, despite us using
> SSE2 insns, e.g. MOVNTI in the page copying and clearing code).

I agree that 64bit code may take SSE and SSE2 as a given, which is why I
have suggested this:

diff --git a/xen/include/asm-x86/cpufeature.h
b/xen/include/asm-x86/cpufeature.h
index c7c8520..c62dacd 100644
--- a/xen/include/asm-x86/cpufeature.h
+++ b/xen/include/asm-x86/cpufeature.h
@@ -59,8 +59,8 @@ XEN_CPUFEATURE(XEN_SMAP,        (FSCAPINTS+0)*32+ 11)
/* SMAP gets used by Xen i
 #define cpu_has_sep            boot_cpu_has(X86_FEATURE_SEP)
 #define cpu_has_mtrr           1
 #define cpu_has_mmx            1
-#define cpu_has_sse            boot_cpu_has(X86_FEATURE_SSE)
-#define cpu_has_sse2           boot_cpu_has(X86_FEATURE_SSE2)
+#define cpu_has_sse            1
+#define cpu_has_sse2           1
 #define cpu_has_sse3           boot_cpu_has(X86_FEATURE_SSE3)
 #define cpu_has_sse4_2         boot_cpu_has(X86_FEATURE_SSE4_2)
 #define cpu_has_htt            boot_cpu_has(X86_FEATURE_HTT)

This is fine, as we only support 64bit in the hypervisor.

>> Swapping the hypervisor defines to being 1 will cause the
>> generate_exception_if() clause to become dead and get dropped, turning
>> host_and_vcpu_must_have() into just vcpu_must_have_##feat
> Which is fine for the hypervisor. And for the test harness the
> vcpu_must_have() is sufficient, as explained before.

It is a layering violation to remove the host_has_* part of the check
from the emulator.

The purpose of the host_has_* part of the check is to be present when we
are using instructions from a certain instruction class, and we are
still using SSE/SSE2 instructions in the emulator.  Untill we drop the
32bit build of x86_emulate.c, it is wrong to drop the SSE/SSE2 check.

With the above diff, host_and_vcpu_must_have(SSE) will be simplified to
vcpu_must_have(SSE) by the compiler, which achieves your goal of
removing a tautological check.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.