parlib: Aggressively save and restore the FPU
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 26 Sep 2017 21:06:30 +0000 (17:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Sep 2017 15:11:05 +0000 (11:11 -0400)
commit5562ccb05015af83cc7a410e01ac9e6f56256462
treece031190a2003458f5bb134fbd1bc7799b3edcf8
parentd62de66d33cae8192d7ee022c42123aab5446ff8
parlib: Aggressively save and restore the FPU

Whenever we enter vcore context and the uthread's FP state might be
dirty (HW, VM ctxs, but not SW ctxs, which are cooperative), we
preemptively save the FP state, to include XMMs (on x86).

The rest of the patch is dealing with the consequences of that early
saving, notably that when we restart current_uthread, we'll have to
restore its FPU state.  There are also a few assertions that needed
flipped around.

The driver for this is that vcore context code continues to muck with
the XMM registers.  strlen(), snprintf(), memset(), and the list goes
on.  Until we can change glibc to be vcore-context-aware, this is the
best we can do.

The downside is that save/restore has noticeable costs.  On one machine,
the cost for a notify / software IPI is about 2850 cycles.  It's about
250 more when we do the save/restore too.  This affects every __notify
(event delivery), reflected trap, and vmexit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/uthread.h
user/parlib/uthread.c