diff options
author | Joerg Roedel <jroedel@suse.de> | 2018-07-18 05:40:46 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-07-19 19:11:38 -0400 |
commit | 8b376fae0514dc7ee04786e2327169e39d12e51b (patch) | |
tree | 14a391b28ada310e5564b49582e61f6dbba859ae | |
parent | e5862d0515ad970ccec6208ecf5bb0cffe291ea3 (diff) |
x86/entry/32: Introduce SAVE_ALL_NMI and RESTORE_ALL_NMI
These macros will be used in the NMI handler code and replace plain
SAVE_ALL and RESTORE_REGS there.
The NMI-specific CR3-switch will be added to these macros later.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Pavel 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-10-git-send-email-joro@8bytes.org
-rw-r--r-- | arch/x86/entry/entry_32.S | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index a905e6215ea9..763592596727 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S | |||
@@ -181,6 +181,9 @@ | |||
181 | 181 | ||
182 | .endm | 182 | .endm |
183 | 183 | ||
184 | .macro SAVE_ALL_NMI | ||
185 | SAVE_ALL | ||
186 | .endm | ||
184 | /* | 187 | /* |
185 | * This is a sneaky trick to help the unwinder find pt_regs on the stack. The | 188 | * This is a sneaky trick to help the unwinder find pt_regs on the stack. The |
186 | * frame pointer is replaced with an encoded pointer to pt_regs. The encoding | 189 | * frame pointer is replaced with an encoded pointer to pt_regs. The encoding |
@@ -227,6 +230,10 @@ | |||
227 | POP_GS_EX | 230 | POP_GS_EX |
228 | .endm | 231 | .endm |
229 | 232 | ||
233 | .macro RESTORE_ALL_NMI pop=0 | ||
234 | RESTORE_REGS pop=\pop | ||
235 | .endm | ||
236 | |||
230 | .macro CHECK_AND_APPLY_ESPFIX | 237 | .macro CHECK_AND_APPLY_ESPFIX |
231 | #ifdef CONFIG_X86_ESPFIX32 | 238 | #ifdef CONFIG_X86_ESPFIX32 |
232 | #define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8) | 239 | #define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8) |
@@ -1161,7 +1168,7 @@ ENTRY(nmi) | |||
1161 | #endif | 1168 | #endif |
1162 | 1169 | ||
1163 | pushl %eax # pt_regs->orig_ax | 1170 | pushl %eax # pt_regs->orig_ax |
1164 | SAVE_ALL | 1171 | SAVE_ALL_NMI |
1165 | ENCODE_FRAME_POINTER | 1172 | ENCODE_FRAME_POINTER |
1166 | xorl %edx, %edx # zero error code | 1173 | xorl %edx, %edx # zero error code |
1167 | movl %esp, %eax # pt_regs pointer | 1174 | movl %esp, %eax # pt_regs pointer |
@@ -1189,7 +1196,7 @@ ENTRY(nmi) | |||
1189 | 1196 | ||
1190 | .Lnmi_return: | 1197 | .Lnmi_return: |
1191 | CHECK_AND_APPLY_ESPFIX | 1198 | CHECK_AND_APPLY_ESPFIX |
1192 | RESTORE_REGS 4 | 1199 | RESTORE_ALL_NMI pop=4 |
1193 | jmp .Lirq_return | 1200 | jmp .Lirq_return |
1194 | 1201 | ||
1195 | #ifdef CONFIG_X86_ESPFIX32 | 1202 | #ifdef CONFIG_X86_ESPFIX32 |
@@ -1205,12 +1212,12 @@ ENTRY(nmi) | |||
1205 | pushl 16(%esp) | 1212 | pushl 16(%esp) |
1206 | .endr | 1213 | .endr |
1207 | pushl %eax | 1214 | pushl %eax |
1208 | SAVE_ALL | 1215 | SAVE_ALL_NMI |
1209 | ENCODE_FRAME_POINTER | 1216 | ENCODE_FRAME_POINTER |
1210 | FIXUP_ESPFIX_STACK # %eax == %esp | 1217 | FIXUP_ESPFIX_STACK # %eax == %esp |
1211 | xorl %edx, %edx # zero error code | 1218 | xorl %edx, %edx # zero error code |
1212 | call do_nmi | 1219 | call do_nmi |
1213 | RESTORE_REGS | 1220 | RESTORE_ALL_NMI |
1214 | lss 12+4(%esp), %esp # back to espfix stack | 1221 | lss 12+4(%esp), %esp # back to espfix stack |
1215 | jmp .Lirq_return | 1222 | jmp .Lirq_return |
1216 | #endif | 1223 | #endif |