ptrace && fpu_lazy_restore

From: Oleg Nesterov
Date: Sat Apr 14 2012 - 19:53:21 EST


Credits to Jan and Chuck, see

https://bugzilla.redhat.com/show_bug.cgi?id=810668

with reproducer:

https://bugzilla.redhat.com/attachment.cgi?id=577270

But afaics the root of the problem is clear. Once PTRACE_SETFPREGS
changes fpu.state->fxsave the task obviously needs restore_fpu_checking()
on context switch.

But I am not sure about the fix, and in any case I need more time
to read this new code.

Oleg.

--- x/arch/x86/kernel/i387.c~ 2012-04-09 20:12:12.000000000 +0200
+++ x/arch/x86/kernel/i387.c 2012-04-15 01:34:09.000000000 +0200
@@ -301,6 +301,8 @@ int xfpregs_set(struct task_struct *targ

sanitize_i387_state(target);

+ target->thread.fpu.last_cpu = ~0;
+
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.fpu.state->fxsave, 0, -1);

@@ -563,6 +565,8 @@ int fpregs_set(struct task_struct *targe

sanitize_i387_state(target);

+ target->thread.fpu.last_cpu = ~0;
+
if (!HAVE_HWFP)
return fpregs_soft_set(target, regset, pos, count, kbuf, ubuf);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/