]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/x86/kernel/entry_64.S
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
[linux.git] / arch / x86 / kernel / entry_64.S
index 86d81199bbde026e3046bb6ba721ceed23aa7199..07a7a04529bc5d7849ffc21b79819edd7b23ffd9 100644 (file)
@@ -56,7 +56,7 @@
 #include <asm/ftrace.h>
 #include <asm/percpu.h>
 #include <asm/asm.h>
-#include <asm/rcu.h>
+#include <asm/context_tracking.h>
 #include <asm/smap.h>
 #include <linux/err.h>
 
@@ -1712,9 +1712,10 @@ nested_nmi:
 
 1:
        /* Set up the interrupted NMIs stack to jump to repeat_nmi */
-       leaq -6*8(%rsp), %rdx
+       leaq -1*8(%rsp), %rdx
        movq %rdx, %rsp
-       CFI_ADJUST_CFA_OFFSET 6*8
+       CFI_ADJUST_CFA_OFFSET 1*8
+       leaq -10*8(%rsp), %rdx
        pushq_cfi $__KERNEL_DS
        pushq_cfi %rdx
        pushfq_cfi
@@ -1722,8 +1723,8 @@ nested_nmi:
        pushq_cfi $repeat_nmi
 
        /* Put stack back */
-       addq $(11*8), %rsp
-       CFI_ADJUST_CFA_OFFSET -11*8
+       addq $(6*8), %rsp
+       CFI_ADJUST_CFA_OFFSET -6*8
 
 nested_nmi_out:
        popq_cfi %rdx
@@ -1749,18 +1750,18 @@ first_nmi:
         * +-------------------------+
         * | NMI executing variable  |
         * +-------------------------+
-        * | Saved SS                |
-        * | Saved Return RSP        |
-        * | Saved RFLAGS            |
-        * | Saved CS                |
-        * | Saved RIP               |
-        * +-------------------------+
         * | copied SS               |
         * | copied Return RSP       |
         * | copied RFLAGS           |
         * | copied CS               |
         * | copied RIP              |
         * +-------------------------+
+        * | Saved SS                |
+        * | Saved Return RSP        |
+        * | Saved RFLAGS            |
+        * | Saved CS                |
+        * | Saved RIP               |
+        * +-------------------------+
         * | pt_regs                 |
         * +-------------------------+
         *
@@ -1776,9 +1777,14 @@ first_nmi:
        /* Set the NMI executing variable on the stack. */
        pushq_cfi $1
 
+       /*
+        * Leave room for the "copied" frame
+        */
+       subq $(5*8), %rsp
+
        /* Copy the stack frame to the Saved frame */
        .rept 5
-       pushq_cfi 6*8(%rsp)
+       pushq_cfi 11*8(%rsp)
        .endr
        CFI_DEF_CFA_OFFSET SS+8-RIP
 
@@ -1799,12 +1805,15 @@ repeat_nmi:
         * is benign for the non-repeat case, where 1 was pushed just above
         * to this very stack slot).
         */
-       movq $1, 5*8(%rsp)
+       movq $1, 10*8(%rsp)
 
        /* Make another copy, this one may be modified by nested NMIs */
+       addq $(10*8), %rsp
+       CFI_ADJUST_CFA_OFFSET -10*8
        .rept 5
-       pushq_cfi 4*8(%rsp)
+       pushq_cfi -6*8(%rsp)
        .endr
+       subq $(5*8), %rsp
        CFI_DEF_CFA_OFFSET SS+8-RIP
 end_repeat_nmi:
 
@@ -1855,8 +1864,12 @@ nmi_swapgs:
        SWAPGS_UNSAFE_STACK
 nmi_restore:
        RESTORE_ALL 8
+
+       /* Pop the extra iret frame */
+       addq $(5*8), %rsp
+
        /* Clear the NMI executing stack variable */
-       movq $0, 10*8(%rsp)
+       movq $0, 5*8(%rsp)
        jmp irq_return
        CFI_ENDPROC
 END(nmi)