• J
    x86/entry/32: Handle Entry from Kernel-Mode on Entry-Stack · b92a165d
    Joerg Roedel 提交于
    It is possible that the kernel is entered from kernel-mode and on the
    entry-stack. The most common way this happens is when an exception is
    triggered while loading the user-space segment registers on the
    kernel-to-userspace exit path.
    
    The segment loading needs to be done after the entry-stack switch, because
    the stack-switch needs kernel %fs for per_cpu access.
    
    When this happens, make sure to leave the kernel with the entry-stack
    again, so that the interrupted code-path runs on the right stack when
    switching to the user-cr3.
    
    Detect this condition on kernel-entry by checking CS.RPL and %esp, and if
    it happens, copy over the complete content of the entry stack to the
    task-stack.  This needs to be done because once the exception handler is
    entereed, the task might be scheduled out or even migrated to a different
    CPU, so this cannot rely on the entry-stack contents. Leave a marker in the
    stack-frame to detect this condition on the exit path.
    
    On the exit path the copy is reversed, copy all of the remaining task-stack
    back to the entry-stack and switch to it.
    Signed-off-by: NJoerg Roedel <jroedel@suse.de>
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    Tested-by: NPavel Machek <pavel@ucw.cz>
    Cc: "H . Peter Anvin" <hpa@zytor.com>
    Cc: linux-mm@kvack.org
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: David Laight <David.Laight@aculab.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Eduardo Valentin <eduval@amazon.com>
    Cc: Greg KH <gregkh@linuxfoundation.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: aliguori@amazon.com
    Cc: daniel.gruss@iaik.tugraz.at
    Cc: hughd@google.com
    Cc: keescook@google.com
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Waiman Long <llong@redhat.com>
    Cc: "David H . Gutteridge" <dhgutteridge@sympatico.ca>
    Cc: joro@8bytes.org
    Link: https://lkml.kernel.org/r/1531906876-13451-11-git-send-email-joro@8bytes.org
    b92a165d
entry_32.S 33.7 KB