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

Re: [Xen-devel] [PATCH 1/3] tests/x86emul: Helpers to save and restore FPU state



On 09/03/18 13:38, Jan Beulich wrote:
>>>> On 09.03.18 at 13:37, <JBeulich@xxxxxxxx> wrote:
>>>>> On 06.03.18 at 21:24, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> +void emul_save_fpu_state(void)
>>> +{
>>> +    if ( use_xsave )
>>> +        asm volatile ( "xsave" __OS " %[ptr]"
>>> +                       : [ptr] "=m" (fpu_save_area)
>>> +                       : "a" (~0ull), "d" (~0ull) );
>> Wait, this doesn't build as 32-bit binary. Needs to be ~0ul, and
>> __OS also can't be used here.
>>
>>> +    else
>>> +        asm volatile ( "fxsave %0" : "=m" (fpu_save_area) );
>> Whereas if you want something like __OS above, you'd want the
>> same here.
> Here's the full incremental diff I've used for now, so that things
> would build everywhere I've tried:
>
> --- unstable.orig/tools/tests/x86_emulator/x86-emulate.c
> +++ unstable/tools/tests/x86_emulator/x86-emulate.c
> @@ -32,20 +32,22 @@ static bool use_xsave;
>  void emul_save_fpu_state(void)
>  {
>      if ( use_xsave )
> -        asm volatile ( "xsave" __OS " %[ptr]"
> +        asm volatile ( "xsave %[ptr]"
>                         : [ptr] "=m" (fpu_save_area)
> -                       : "a" (~0ull), "d" (~0ull) );
> +                       : "a" (~0ul), "d" (~0ul) );
>      else
>          asm volatile ( "fxsave %0" : "=m" (fpu_save_area) );
>  }
>  
>  void emul_restore_fpu_state(void)
>  {
> +    /* Older gcc can't deal with "m" array inputs; make them outputs 
> instead. */
>      if ( use_xsave )
> -        asm volatile ( "xrstor" __OS " %[ptr]"
> -                       :: [ptr] "m" (fpu_save_area), "a" (~0ull), "d" 
> (~0ull) );
> +        asm volatile ( "xrstor %[ptr]"
> +                       : [ptr] "+m" (fpu_save_area)
> +                       : "a" (~0ul), "d" (~0ul) );
>      else
> -        asm volatile ( "fxrstor %0" :: "m" (fpu_save_area) );
> +        asm volatile ( "fxrstor %0" : "+m" (fpu_save_area) );
>  }
>  
>  bool emul_test_init(void)

Ok - I'll merge this in.

My worry with the __OS was to make sure that we matched how the kernel
would save and restore context, so the exception pointers don't get
lost.  However, that only matters at the point that we attempt to
memcmp(), and thinking about it, we'd need a better algorithm anyway.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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