Commit 424c7d0a authored by Thomas Gleixner's avatar Thomas Gleixner

x86/entry/64: Provide sane error entry/exit

For gradual conversion provide a macro parameter and the required code
which allows to handle instrumentation and interrupt flags tracking in C.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarAlexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
Acked-by: default avatarAndy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200505134904.058904490@linutronix.de


parent cfa82a00
...@@ -499,8 +499,9 @@ SYM_CODE_END(spurious_entries_start) ...@@ -499,8 +499,9 @@ SYM_CODE_END(spurious_entries_start)
* @vector: Vector number * @vector: Vector number
* @cfunc: C function to be called * @cfunc: C function to be called
* @has_error_code: Hardware pushed error code on stack * @has_error_code: Hardware pushed error code on stack
* @sane: Sane variant which handles irq tracing, context tracking in C
*/ */
.macro idtentry_body vector cfunc has_error_code:req .macro idtentry_body vector cfunc has_error_code:req sane=0
call error_entry call error_entry
UNWIND_HINT_REGS UNWIND_HINT_REGS
...@@ -514,6 +515,7 @@ SYM_CODE_END(spurious_entries_start) ...@@ -514,6 +515,7 @@ SYM_CODE_END(spurious_entries_start)
GET_CR2_INTO(%r12); GET_CR2_INTO(%r12);
.endif .endif
.if \sane == 0
TRACE_IRQS_OFF TRACE_IRQS_OFF
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING
...@@ -522,6 +524,7 @@ SYM_CODE_END(spurious_entries_start) ...@@ -522,6 +524,7 @@ SYM_CODE_END(spurious_entries_start)
CALL_enter_from_user_mode CALL_enter_from_user_mode
.Lfrom_kernel_no_ctxt_tracking_\@: .Lfrom_kernel_no_ctxt_tracking_\@:
#endif #endif
.endif
movq %rsp, %rdi /* pt_regs pointer into 1st argument*/ movq %rsp, %rdi /* pt_regs pointer into 1st argument*/
...@@ -538,7 +541,11 @@ SYM_CODE_END(spurious_entries_start) ...@@ -538,7 +541,11 @@ SYM_CODE_END(spurious_entries_start)
call \cfunc call \cfunc
.if \sane == 0
jmp error_exit jmp error_exit
.else
jmp error_return
.endif
.endm .endm
/** /**
...@@ -547,11 +554,12 @@ SYM_CODE_END(spurious_entries_start) ...@@ -547,11 +554,12 @@ SYM_CODE_END(spurious_entries_start)
* @asmsym: ASM symbol for the entry point * @asmsym: ASM symbol for the entry point
* @cfunc: C function to be called * @cfunc: C function to be called
* @has_error_code: Hardware pushed error code on stack * @has_error_code: Hardware pushed error code on stack
* @sane: Sane variant which handles irq tracing, context tracking in C
* *
* The macro emits code to set up the kernel context for straight forward * The macro emits code to set up the kernel context for straight forward
* and simple IDT entries. No IST stack, no paranoid entry checks. * and simple IDT entries. No IST stack, no paranoid entry checks.
*/ */
.macro idtentry vector asmsym cfunc has_error_code:req .macro idtentry vector asmsym cfunc has_error_code:req sane=0
SYM_CODE_START(\asmsym) SYM_CODE_START(\asmsym)
UNWIND_HINT_IRET_REGS offset=\has_error_code*8 UNWIND_HINT_IRET_REGS offset=\has_error_code*8
ASM_CLAC ASM_CLAC
...@@ -574,7 +582,7 @@ SYM_CODE_START(\asmsym) ...@@ -574,7 +582,7 @@ SYM_CODE_START(\asmsym)
.Lfrom_usermode_no_gap_\@: .Lfrom_usermode_no_gap_\@:
.endif .endif
idtentry_body \vector \cfunc \has_error_code idtentry_body \vector \cfunc \has_error_code \sane
_ASM_NOKPROBE(\asmsym) _ASM_NOKPROBE(\asmsym)
SYM_CODE_END(\asmsym) SYM_CODE_END(\asmsym)
...@@ -1403,6 +1411,14 @@ SYM_CODE_START_LOCAL(error_exit) ...@@ -1403,6 +1411,14 @@ SYM_CODE_START_LOCAL(error_exit)
jmp .Lretint_user jmp .Lretint_user
SYM_CODE_END(error_exit) SYM_CODE_END(error_exit)
SYM_CODE_START_LOCAL(error_return)
UNWIND_HINT_REGS
DEBUG_ENTRY_ASSERT_IRQS_OFF
testb $3, CS(%rsp)
jz restore_regs_and_return_to_kernel
jmp swapgs_restore_regs_and_return_to_usermode
SYM_CODE_END(error_return)
/* /*
* Runs on exception stack. Xen PV does not go through this path at all, * Runs on exception stack. Xen PV does not go through this path at all,
* so we can use real assembly here. * so we can use real assembly here.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment