[patch V4 part 3 08/29] x86/entry/64: Provide sane error entry/exit

From: Thomas Gleixner
Date: Tue May 05 2020 - 10:21:39 EST


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: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
arch/x86/entry/entry_64.S | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)

--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -500,8 +500,9 @@ SYM_CODE_END(spurious_entries_start)
* @vector: Vector number
* @cfunc: C function to be called
* @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
UNWIND_HINT_REGS
@@ -515,6 +516,7 @@ SYM_CODE_END(spurious_entries_start)
GET_CR2_INTO(%r12);
.endif

+ .if \sane == 0
TRACE_IRQS_OFF

#ifdef CONFIG_CONTEXT_TRACKING
@@ -523,6 +525,7 @@ SYM_CODE_END(spurious_entries_start)
CALL_enter_from_user_mode
.Lfrom_kernel_no_ctxt_tracking_\@:
#endif
+ .endif

movq %rsp, %rdi /* pt_regs pointer into 1st argument*/

@@ -539,7 +542,11 @@ SYM_CODE_END(spurious_entries_start)

call \cfunc

+ .if \sane == 0
jmp error_exit
+ .else
+ jmp error_return
+ .endif
.endm

/**
@@ -548,11 +555,12 @@ SYM_CODE_END(spurious_entries_start)
* @asmsym: ASM symbol for the entry point
* @cfunc: C function to be called
* @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
* 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)
UNWIND_HINT_IRET_REGS offset=\has_error_code*8
ASM_CLAC
@@ -575,7 +583,7 @@ SYM_CODE_START(\asmsym)
.Lfrom_usermode_no_gap_\@:
.endif

- idtentry_body \vector \cfunc \has_error_code
+ idtentry_body \vector \cfunc \has_error_code \sane

_ASM_NOKPROBE(\asmsym)
SYM_CODE_END(\asmsym)
@@ -1405,6 +1413,14 @@ SYM_CODE_START_LOCAL(error_exit)
jmp .Lretint_user
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,
* so we can use real assembly here.