@@ -251,33 +251,27 @@ sanitize_restored_user_xstate(union fpregs_state *state,
251
251
}
252
252
253
253
/*
254
- * Restore the extended state if present. Otherwise, restore the FP/SSE state .
254
+ * Restore the FPU state directly from the userspace signal frame .
255
255
*/
256
- static int copy_user_to_fpregs_zeroing (void __user * buf , u64 xbv , int fx_only )
256
+ static int restore_fpregs_from_user (void __user * buf , u64 xrestore , bool fx_only )
257
257
{
258
- u64 init_bv ;
259
- int r ;
260
-
261
258
if (use_xsave ()) {
262
- if ( fx_only ) {
263
- init_bv = xfeatures_mask_uabi () & ~ XFEATURE_MASK_FPSSE ;
259
+ u64 init_bv = xfeatures_mask_uabi () & ~ xrestore ;
260
+ int ret ;
264
261
265
- r = fxrstor_from_user_sigframe (buf );
266
- if (!r )
267
- os_xrstor (& init_fpstate .xsave , init_bv );
268
- return r ;
269
- } else {
270
- init_bv = xfeatures_mask_uabi () & ~xbv ;
271
-
272
- r = xrstor_from_user_sigframe (buf , xbv );
273
- if (!r && unlikely (init_bv ))
274
- os_xrstor (& init_fpstate .xsave , init_bv );
275
- return r ;
276
- }
262
+ if (likely (!fx_only ))
263
+ ret = xrstor_from_user_sigframe (buf , xrestore );
264
+ else
265
+ ret = fxrstor_from_user_sigframe (buf );
266
+
267
+ if (!ret && unlikely (init_bv ))
268
+ os_xrstor (& init_fpstate .xsave , init_bv );
269
+ return ret ;
277
270
} else if (use_fxsr ()) {
278
271
return fxrstor_from_user_sigframe (buf );
279
- } else
272
+ } else {
280
273
return frstor_from_user_sigframe (buf );
274
+ }
281
275
}
282
276
283
277
static int __fpu_restore_sig (void __user * buf , void __user * buf_fx ,
@@ -314,7 +308,7 @@ static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
314
308
*/
315
309
fpregs_lock ();
316
310
pagefault_disable ();
317
- ret = copy_user_to_fpregs_zeroing (buf_fx , user_xfeatures , fx_only );
311
+ ret = restore_fpregs_from_user (buf_fx , user_xfeatures , fx_only );
318
312
pagefault_enable ();
319
313
if (!ret ) {
320
314
0 commit comments