x86: Use partial contexts for all entries [2/2]
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 2 Dec 2015 18:39:28 +0000 (13:39 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Dec 2015 20:59:08 +0000 (15:59 -0500)
commita919327b086035f8d0dcf4484c90bbff83665277
treeef28c6bd8b397d8c7f2bd1aa1b682e95c852f242
parentc420c418ab338667387909bb4116cc2c61088f2c
x86: Use partial contexts for all entries [2/2]

Syscalls, traps, and IRQs all use partial contexts when entering from
userspace.  Note that the traps and IRQs that occur while a kernel context
is running does not mess with swapgs or partial contexts.  Partial contexts
(and pcpui current_ctx in general) has nothing to do with the kernel's
context / HW TF.  They are for user contexts.

This change takes about 260ns off of a sys_null() call, and we're down to
about 220ns (on my devbox).  Quite an improvement.  The expensive bit was
messing with the TLS MSRs, since those operations are unfortunately slow.
This isn't true on more recent x86 machines, which have support for fast
instructions to change the GS and FS base.  However, many machines,
(notable Qemu) do not support those instructions, and we'd need the kernel
and userland to decide which method of changing GS/FS to use, either during
compilation or at runtime.

In the long run, with support for quickly changing the TLS, the hardware
and software partial contexts savings won't be as important.  But partial
contexts are likely to be important for the upcoming virtual machine
context type.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/trap64.c
kern/arch/x86/trapentry64.S