|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] X86: Fix vcpu xsave bug
Jan Beulich wrote:
>>>> On 18.11.13 at 11:35, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
>> Jan Beulich wrote:
>>>>>> On 15.11.13 at 17:55, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>> wrote:
>>>> @@ -257,22 +257,29 @@ void vcpu_restore_fpu_lazy(struct vcpu *v)
>>>> */ void vcpu_save_fpu(struct vcpu *v)
>>>> {
>>>> - if ( !v->fpu_dirtied )
>>>> - return;
>>>> -
>>>
>>> And the - afaict - the only changed needed to this function is the
>>> deletion above.
>>>
>>
>> If I didn't misunderstand your meaning, it can not only delete these
>> 2 lines, say, when (!v->fpu_dirtied) and in old platform that do
>> fpu_fxsave/fpu_fsave?
>
> Sorry, I don't understand what you're asking.
>
The problem is I don't understand your last comments:
'And the - afaict - the only changed needed to this function is the deletion
above.'
Seems some misunderstanding here :)
So would you please give me the code of your thought based on the patch below?
Thanks,
Jinsong
=======================
diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c
index 7649274..f1d2ccc 100644
--- a/xen/arch/x86/i387.c
+++ b/xen/arch/x86/i387.c
@@ -134,7 +134,7 @@ static inline void fpu_frstor(struct vcpu *v)
/* FPU Save Functions */
/*******************************/
/* Save x87 extended state */
-static inline void fpu_xsave(struct vcpu *v)
+static inline void fpu_xsave(struct vcpu *v, uint64_t mask)
{
bool_t ok;
@@ -145,7 +145,7 @@ static inline void fpu_xsave(struct vcpu *v)
*/
ok = set_xcr0(v->arch.xcr0_accum | XSTATE_FP_SSE);
ASSERT(ok);
- xsave(v, v->arch.nonlazy_xstate_used ? XSTATE_ALL : XSTATE_LAZY);
+ xsave(v, mask);
ok = set_xcr0(v->arch.xcr0 ?: XSTATE_FP_SSE);
ASSERT(ok);
}
@@ -257,22 +257,29 @@ void vcpu_restore_fpu_lazy(struct vcpu *v)
*/
void vcpu_save_fpu(struct vcpu *v)
{
- if ( !v->fpu_dirtied )
- return;
-
ASSERT(!is_idle_vcpu(v));
- /* This can happen, if a paravirtualised guest OS has set its CR0.TS. */
+ /* Avoid recursion */
clts();
-
- if ( cpu_has_xsave )
- fpu_xsave(v);
- else if ( cpu_has_fxsr )
- fpu_fxsave(v);
+ if ( !v->fpu_dirtied )
+ {
+ if ( v->arch.nonlazy_xstate_used )
+ {
+ ASSERT(cpu_has_xsave);
+ fpu_xsave(v, XSTATE_NONLAZY);
+ }
+ }
else
- fpu_fsave(v);
+ {
+ if ( cpu_has_xsave )
+ fpu_xsave(v, XSTATE_ALL);
+ else if ( cpu_has_fxsr )
+ fpu_fxsave(v);
+ else
+ fpu_fsave(v);
- v->fpu_dirtied = 0;
+ v->fpu_dirtied = 0;
+ }
stts();
}
--
1.7.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |