Messages in this thread | | | Date | Thu, 15 Jul 2010 15:46:45 -0700 | From | "H. Peter Anvin" <> | Subject | Re: [patch 1/2] x86_64 page fault NMI-safe |
| |
On 07/15/2010 03:26 PM, Linus Torvalds wrote: > On Thu, Jul 15, 2010 at 3:16 PM, Linus Torvalds > <torvalds@linux-foundation.org> wrote: >> >> Then you could in fact possibly test the stack pointer for whether it >> is in the NMI stack area, and use the value of %rsp itself as the >> flag. So you could avoid the flag entirely. Because testing %rsp is >> valid - testing %rip is not. >> >> That would also avoid the race, because %rsp (as a flag) now gets >> cleared atomically by the "iret". So that might actually solve things. > > Hmm. So on x86-32, it's easy: if the NMI is nested, you can literally > look at the current %rsp value, and see if it's within the NMI stack > region. > > But on x86-64, due to IST, you need to look at the saved-rsp value on > the stack, since the %rsp always gets reset to the NMI stack region > regardless of where it was before. > > Why do we force IST use for NMI, btw? Maybe we shouldn't, and just use > the normal kernel stack mechanisms? >
The reasons for using TSS (32 bits) or IST (64 bits) are: concern about the size of the regular kernel stack, and a concern that the kernel stack pointer may not be in a usable state. The former is not a problem here: we're doing a stack switch anyway, and so the additional overhead on the main stack is pretty minimal, but the latter may be.
-hpa
-- H. Peter Anvin, Intel Open Source Technology Center I work for Intel. I don't speak on their behalf.
| |