.endm
 
+.macro SAVE_ALL_NMI
+       SAVE_ALL
+.endm
 /*
  * This is a sneaky trick to help the unwinder find pt_regs on the stack.  The
  * frame pointer is replaced with an encoded pointer to pt_regs.  The encoding
        POP_GS_EX
 .endm
 
+.macro RESTORE_ALL_NMI pop=0
+       RESTORE_REGS pop=\pop
+.endm
+
 .macro CHECK_AND_APPLY_ESPFIX
 #ifdef CONFIG_X86_ESPFIX32
 #define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8)
 #endif
 
        pushl   %eax                            # pt_regs->orig_ax
-       SAVE_ALL
+       SAVE_ALL_NMI
        ENCODE_FRAME_POINTER
        xorl    %edx, %edx                      # zero error code
        movl    %esp, %eax                      # pt_regs pointer
 
 .Lnmi_return:
        CHECK_AND_APPLY_ESPFIX
-       RESTORE_REGS 4
+       RESTORE_ALL_NMI pop=4
        jmp     .Lirq_return
 
 #ifdef CONFIG_X86_ESPFIX32
        pushl   16(%esp)
        .endr
        pushl   %eax
-       SAVE_ALL
+       SAVE_ALL_NMI
        ENCODE_FRAME_POINTER
        FIXUP_ESPFIX_STACK                      # %eax == %esp
        xorl    %edx, %edx                      # zero error code
        call    do_nmi
-       RESTORE_REGS
+       RESTORE_ALL_NMI
        lss     12+4(%esp), %esp                # back to espfix stack
        jmp     .Lirq_return
 #endif