diff options
Diffstat (limited to 'arch/x86/kernel/i387.c')
| -rw-r--r-- | arch/x86/kernel/i387.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 45723f1fe198..1f20608d4ca8 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -468,9 +468,23 @@ static int save_i387_fxsave(struct _fpstate_ia32 __user *buf) | |||
| 468 | 468 | ||
| 469 | static int save_i387_xsave(void __user *buf) | 469 | static int save_i387_xsave(void __user *buf) |
| 470 | { | 470 | { |
| 471 | struct task_struct *tsk = current; | ||
| 471 | struct _fpstate_ia32 __user *fx = buf; | 472 | struct _fpstate_ia32 __user *fx = buf; |
| 472 | int err = 0; | 473 | int err = 0; |
| 473 | 474 | ||
| 475 | /* | ||
| 476 | * For legacy compatible, we always set FP/SSE bits in the bit | ||
| 477 | * vector while saving the state to the user context. | ||
| 478 | * This will enable us capturing any changes(during sigreturn) to | ||
| 479 | * the FP/SSE bits by the legacy applications which don't touch | ||
| 480 | * xstate_bv in the xsave header. | ||
| 481 | * | ||
| 482 | * xsave aware applications can change the xstate_bv in the xsave | ||
| 483 | * header as well as change any contents in the memory layout. | ||
| 484 | * xrestore as part of sigreturn will capture all the changes. | ||
| 485 | */ | ||
| 486 | tsk->thread.xstate->xsave.xsave_hdr.xstate_bv |= XSTATE_FPSSE; | ||
| 487 | |||
| 474 | if (save_i387_fxsave(fx) < 0) | 488 | if (save_i387_fxsave(fx) < 0) |
| 475 | return -1; | 489 | return -1; |
| 476 | 490 | ||
