Messages in this thread | | | Subject | Re: [tip:x86/urgent] x86/nmi: Test saved %cs in NMI to determine nested NMI case | From | Steven Rostedt <> | Date | Mon, 20 Feb 2012 11:51:41 -0500 |
| |
On Mon, 2012-02-20 at 03:47 -0800, tip-bot for Steven Rostedt wrote: > Commit-ID: 45d5a1683c04be28abdf5c04c27b1417e0374486 > Gitweb: http://git.kernel.org/tip/45d5a1683c04be28abdf5c04c27b1417e0374486 > Author: Steven Rostedt <rostedt@goodmis.org> > AuthorDate: Sun, 19 Feb 2012 16:43:37 -0500 > Committer: Ingo Molnar <mingo@elte.hu> > CommitDate: Mon, 20 Feb 2012 09:09:57 +0100 > > x86/nmi: Test saved %cs in NMI to determine nested NMI case > > Currently, the NMI handler tests if it is nested by checking the > special variable saved on the stack (set during NMI handling) > and whether the saved stack is the NMI stack as well (to prevent > the race when the variable is set to zero). > > But userspace may set their %rsp to any value as long as they do > not derefence it, and it may make it point to the NMI stack, > which will prevent NMIs from triggering while the userspace app > is running. (I tested this, and it is indeed the case) > > Add another check to determine nested NMIs by looking at the > saved %cs (code segment register) and making sure that it is the > kernel code segment. > > Signed-off-by: Steven Rostedt <rostedt@goodmis.org> > Cc: H. Peter Anvin <hpa@zytor.com> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> > Cc: Linus Torvalds <torvalds@linux-foundation.org> > Cc: <stable@kernel.org>
Just so that we do not confuse Greg, the bug was introduced in the 3.3 merge window. It does not exist in 3.2 or earlier.
-- Steve
> Link: http://lkml.kernel.org/r/1329687817.1561.27.camel@acer.local.home > Signed-off-by: Ingo Molnar <mingo@elte.hu> > --- > arch/x86/kernel/entry_64.S | 7 +++++++ > 1 files changed, 7 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S > index 3fe8239..debd851 100644 > --- a/arch/x86/kernel/entry_64.S > +++ b/arch/x86/kernel/entry_64.S > @@ -1532,6 +1532,13 @@ ENTRY(nmi) > pushq_cfi %rdx > > /* > + * If %cs was not the kernel segment, then the NMI triggered in user > + * space, which means it is definitely not nested. > + */ > + cmp $__KERNEL_CS, 16(%rsp) > + jne first_nmi > + > + /* > * Check the special variable on the stack to see if NMIs are > * executing. > */
| |