Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26bef131 authored by Linus Torvalds's avatar Linus Torvalds Committed by H. Peter Anvin
Browse files

x86, fpu, amd: Clear exceptions in AMD FXSAVE workaround



Before we do an EMMS in the AMD FXSAVE information leak workaround we
need to clear any pending exceptions, otherwise we trap with a
floating-point exception inside this code.

Reported-by: default avatarhalfdog <me@halfdog.net>
Tested-by: default avatarBorislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/CA%2B55aFxQnY_PCG_n4=0w-VG=YLXL-yr7oMxyy0WU2gCBAf3ydg@mail.gmail.com


Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 1739f09e
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
	   is pending.  Clear the x87 state here by setting it to fixed
	   values. "m" is a random variable that should be in L1 */
	alternative_input(
		ASM_NOP8 ASM_NOP2,
		"emms\n\t"		/* clear stack tags */
		"fildl %P[addr]",	/* set F?P to defined value */
		X86_FEATURE_FXSAVE_LEAK,
		[addr] "m" (tsk->thread.fpu.has_fpu));
	if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) {
		asm volatile(
			"fnclex\n\t"
			"emms\n\t"
			"fildl %P[addr]"	/* set F?P to defined value */
			: : [addr] "m" (tsk->thread.fpu.has_fpu));
	}

	return fpu_restore_checking(&tsk->thread.fpu);
}