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

Re: [Xen-devel] [V9 1/3] x86/xsaves: enable xsaves/xrstors/xsavec in xen



>>> On 05.11.15 at 02:34, <shuai.ruan@xxxxxxxxxxxxxxx> wrote:
> On Wed, Nov 04, 2015 at 10:04:33AM -0700, Jan Beulich wrote:
>> >>> On 03.11.15 at 07:27, <shuai.ruan@xxxxxxxxxxxxxxx> wrote:
>> > @@ -158,6 +334,20 @@ void xsave(struct vcpu *v, uint64_t mask)
>> >          ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET] = word_size;
>> >  }
>> > +#define XSTATE_FIXUP ".section .fixup,\"ax\"      \n"        \
>> > +                     "2: mov %5,%%ecx             \n"        \
>> > +                     "   xor %1,%1                \n"        \
>> > +                     "   rep stosb                \n"        \
>> > +                     "   lea %2,%0                \n"        \
>> > +                     "   mov %3,%1                \n"        \
>> > +                     "   jmp 1b                   \n"        \
>> > +                     ".previous                   \n"        \
>> > +                     _ASM_EXTABLE(1b, 2b)                    \
>> > +                     : "+&D" (ptr), "+&a" (lmask)            \
>> > +                     : "m" (*ptr), "g" (lmask), "d" (hmask), \
>> > +                       "m" (xsave_cntxt_size)                \
>> > +                     : "ecx"
>> > +
>> >  void xrstor(struct vcpu *v, uint64_t mask)
>> >  {
>> >      uint32_t hmask = mask >> 32;
>> > @@ -187,39 +377,22 @@ void xrstor(struct vcpu *v, uint64_t mask)
>> >      switch ( __builtin_expect(ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET], 8) )
>> >      {
>> >      default:
>> > -        asm volatile ( "1: .byte 0x48,0x0f,0xae,0x2f\n"
>> > -                       ".section .fixup,\"ax\"      \n"
>> > -                       "2: mov %5,%%ecx             \n"
>> > -                       "   xor %1,%1                \n"
>> > -                       "   rep stosb                \n"
>> > -                       "   lea %2,%0                \n"
>> > -                       "   mov %3,%1                \n"
>> > -                       "   jmp 1b                   \n"
>> > -                       ".previous                   \n"
>> > -                       _ASM_EXTABLE(1b, 2b)
>> > -                       : "+&D" (ptr), "+&a" (lmask)
>> > -                       : "m" (*ptr), "g" (lmask), "d" (hmask),
>> > -                         "m" (xsave_cntxt_size)
>> > -                       : "ecx" );
>> > +        alternative_input("1: "".byte 0x48,0x0f,0xae,0x2f",
>> > +                          ".byte 0x48,0x0f,0xc7,0x1f",
>> > +                          X86_FEATURE_XSAVES,
>> > +                          "D" (ptr), "m" (*ptr), "a" (lmask), "d" 
> (hmask));
>> > +        asm volatile (XSTATE_FIXUP);
>> >          break;
>> >      case 4: case 2:
>> > -        asm volatile ( "1: .byte 0x0f,0xae,0x2f\n"
>> > -                       ".section .fixup,\"ax\" \n"
>> > -                       "2: mov %5,%%ecx        \n"
>> > -                       "   xor %1,%1           \n"
>> > -                       "   rep stosb           \n"
>> > -                       "   lea %2,%0           \n"
>> > -                       "   mov %3,%1           \n"
>> > -                       "   jmp 1b              \n"
>> > -                       ".previous              \n"
>> > -                       _ASM_EXTABLE(1b, 2b)
>> > -                       : "+&D" (ptr), "+&a" (lmask)
>> > -                       : "m" (*ptr), "g" (lmask), "d" (hmask),
>> > -                         "m" (xsave_cntxt_size)
>> > -                       : "ecx" );
>> > +        alternative_input("1: "".byte 0x0f,0xae,0x2f",
>> > +                          ".byte 0x0f,0xc7,0x1f",
>> > +                          X86_FEATURE_XSAVES,
>> > +                          "D" (ptr), "m" (*ptr), "a" (lmask), "d" 
> (hmask));
>> > +        asm volatile (XSTATE_FIXUP);
>> >          break;
>> >      }
>> >  }
>> > +#undef XSTATE_FIXUP
>> 
>> Repeating my comment on v8: "I wonder whether at least for the
>> restore side alternative asm wouldn't result in better readable code
>> and at the same time in a smaller patch." Did you at least look into
>> that option?
>> 
> I may misunderstand your meaning. I have adressed the comment by changing 
> the restor side using alternative_input. Does "alternative_input" not what 
> you want ? 
> if it is not what you want, please give me some suggestions how to
> address this ?  

Oh, I'm sorry, I should have looked more closely. The fact that
XSTATE_FIXUP survived made me draw wrong conclusions without
looking more closely. Now the bad news is - you can't split things
like this, as the compiler doesn't make any guarantees as to
register values between two asm()-s. The whole construct needs
to and up as a single asm(), which is why XSTATE_FIXUP and is
unlikely to be of much use here (at least in the context of this
patch; a separate cleanup patch might eliminate the redundancy).

Jan

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


 


Rackspace

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