Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c8cd0c5 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

x86/asm/entry: Untangle 'ia32_sysenter_target' into two entry points:...


x86/asm/entry: Untangle 'ia32_sysenter_target' into two entry points: entry_SYSENTER_32 and entry_SYSENTER_compat

So the SYSENTER instruction is pretty quirky and it has different behavior
depending on bitness and CPU maker.

Yet we create a false sense of coherency by naming it 'ia32_sysenter_target'
in both of the cases.

Split the name into its two uses:

	ia32_sysenter_target (32)    -> entry_SYSENTER_32
	ia32_sysenter_target (64)    -> entry_SYSENTER_compat

As per the generic naming scheme for x86 system call entry points:

	entry_MNEMONIC_qualifier

where 'qualifier' is one of _32, _64 or _compat.

Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 2cd23553
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -307,7 +307,7 @@ END(resume_kernel)
   the vsyscall page.  See vsyscall-sysentry.S, which defines the symbol.  */
   the vsyscall page.  See vsyscall-sysentry.S, which defines the symbol.  */


	# sysenter call handler stub
	# sysenter call handler stub
ENTRY(ia32_sysenter_target)
ENTRY(entry_SYSENTER_32)
	movl TSS_sysenter_sp0(%esp),%esp
	movl TSS_sysenter_sp0(%esp),%esp
sysenter_past_esp:
sysenter_past_esp:
	/*
	/*
@@ -412,7 +412,7 @@ sysexit_audit:
.popsection
.popsection
	_ASM_EXTABLE(1b,2b)
	_ASM_EXTABLE(1b,2b)
	PTGS_TO_GS_EX
	PTGS_TO_GS_EX
ENDPROC(ia32_sysenter_target)
ENDPROC(entry_SYSENTER_32)


	# system call handler stub
	# system call handler stub
ENTRY(system_call)
ENTRY(system_call)
@@ -1135,7 +1135,7 @@ END(page_fault)


ENTRY(debug)
ENTRY(debug)
	ASM_CLAC
	ASM_CLAC
	cmpl $ia32_sysenter_target,(%esp)
	cmpl $entry_SYSENTER_32,(%esp)
	jne debug_stack_correct
	jne debug_stack_correct
	FIX_STACK 12, debug_stack_correct, debug_esp_fix_insn
	FIX_STACK 12, debug_stack_correct, debug_esp_fix_insn
debug_stack_correct:
debug_stack_correct:
@@ -1165,7 +1165,7 @@ ENTRY(nmi)
	popl %eax
	popl %eax
	je nmi_espfix_stack
	je nmi_espfix_stack
#endif
#endif
	cmpl $ia32_sysenter_target,(%esp)
	cmpl $entry_SYSENTER_32,(%esp)
	je nmi_stack_fixup
	je nmi_stack_fixup
	pushl %eax
	pushl %eax
	movl %esp,%eax
	movl %esp,%eax
@@ -1176,7 +1176,7 @@ ENTRY(nmi)
	cmpl $(THREAD_SIZE-20),%eax
	cmpl $(THREAD_SIZE-20),%eax
	popl %eax
	popl %eax
	jae nmi_stack_correct
	jae nmi_stack_correct
	cmpl $ia32_sysenter_target,12(%esp)
	cmpl $entry_SYSENTER_32,12(%esp)
	je nmi_debug_stack_check
	je nmi_debug_stack_check
nmi_stack_correct:
nmi_stack_correct:
	pushl %eax
	pushl %eax
+2 −2
Original line number Original line Diff line number Diff line
@@ -57,7 +57,7 @@ ENDPROC(native_usergs_sysret32)
 * path below. We set up a complete hardware stack frame to share code
 * path below. We set up a complete hardware stack frame to share code
 * with the int 0x80 path.
 * with the int 0x80 path.
 */
 */
ENTRY(ia32_sysenter_target)
ENTRY(entry_SYSENTER_compat)
	/*
	/*
	 * Interrupts are off on entry.
	 * Interrupts are off on entry.
	 * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
	 * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
@@ -256,7 +256,7 @@ sysenter_tracesys:


	RESTORE_EXTRA_REGS
	RESTORE_EXTRA_REGS
	jmp	sysenter_do_call
	jmp	sysenter_do_call
ENDPROC(ia32_sysenter_target)
ENDPROC(entry_SYSENTER_compat)


/*
/*
 * 32-bit SYSCALL instruction entry.
 * 32-bit SYSCALL instruction entry.
+2 −1
Original line number Original line Diff line number Diff line
@@ -10,7 +10,8 @@ void syscall_init(void);


void entry_INT80_compat(void);
void entry_INT80_compat(void);
void entry_SYSCALL_compat(void);
void entry_SYSCALL_compat(void);
void ia32_sysenter_target(void);
void entry_SYSENTER_32(void);
void entry_SYSENTER_compat(void);


void x86_configure_nx(void);
void x86_configure_nx(void);
void x86_report_nx(void);
void x86_report_nx(void);
+2 −2
Original line number Original line Diff line number Diff line
@@ -1026,7 +1026,7 @@ void enable_sep_cpu(void)
	      (unsigned long)tss + offsetofend(struct tss_struct, SYSENTER_stack),
	      (unsigned long)tss + offsetofend(struct tss_struct, SYSENTER_stack),
	      0);
	      0);


	wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long)ia32_sysenter_target, 0);
	wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long)entry_SYSENTER_32, 0);


out:
out:
	put_cpu();
	put_cpu();
@@ -1216,7 +1216,7 @@ void syscall_init(void)
	 */
	 */
	wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
	wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
	wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL);
	wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL);
	wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target);
	wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat);
#else
#else
	wrmsrl(MSR_CSTAR, ignore_sysret);
	wrmsrl(MSR_CSTAR, ignore_sysret);
	wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG);
	wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG);
+1 −1
Original line number Original line Diff line number Diff line
@@ -128,7 +128,7 @@ ENDPROC(xen_syscall32_target)
/* 32-bit compat sysenter target */
/* 32-bit compat sysenter target */
ENTRY(xen_sysenter_target)
ENTRY(xen_sysenter_target)
	undo_xen_syscall
	undo_xen_syscall
	jmp ia32_sysenter_target
	jmp entry_SYSENTER_compat
ENDPROC(xen_sysenter_target)
ENDPROC(xen_sysenter_target)


#else /* !CONFIG_IA32_EMULATION */
#else /* !CONFIG_IA32_EMULATION */