x86: Add protection from NMI contexts that trap
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 28 Jul 2016 19:29:38 +0000 (15:29 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 29 Jul 2016 21:43:07 +0000 (17:43 -0400)
commit448ced41ad3bfb60c83a583af8291909d6ea9543
tree96c11b0298544a568cb5da054b70a566ef0c6e84
parentd34cfceff45f21a2d566b78ccf6116bb30a13095
x86: Add protection from NMI contexts that trap

Remember the rules.  Among other things, NMI context code must be careful
when writing.  They can never grab locks.  These rules apply to faults
triggered by NMI context code.  This includes faults for things like
copy_from_user().

To limit the potential code of a faulting NMI's fault handler, I limited
the PF handler to just trying fixups.  The only code there is lock-free and
write-free.

To fix this up, I needed to clean up trap_dispatch a little.  Now we are
very explicit about what faults we handle (we had been handing T_GPF, which
wasn't on the list through the "default" handler).  Not a fan of that old
style.

I considered not adjusting the ktrap_depth during fault handlers from NMI
context.  The NMI could have interrupted another fault handler right when
it was in the read-modify-write process.  However, since the fault handler
returns the depth variable to its previous value, this interruption is
harmless.  I think.

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