x86/asm/entry: Untangle 'system_call' into two entry points: entry_SYSCALL_64 and...
authorIngo Molnar <mingo@kernel.org>
Mon, 8 Jun 2015 06:42:03 +0000 (08:42 +0200)
committerIngo Molnar <mingo@kernel.org>
Mon, 8 Jun 2015 07:14:21 +0000 (09:14 +0200)
The 'system_call' entry points differ starkly between native 32-bit and 64-bit
kernels: on 32-bit kernels it defines the INT 0x80 entry point, while on
64-bit it's the SYSCALL entry point.

This is pretty confusing when looking at generic code, and it also obscures
the nature of the entry point at the assembly level.

So unangle this by splitting the name into its two uses:

system_call (32) -> entry_INT80_32
system_call (64) -> entry_SYSCALL_64

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: Ingo Molnar <mingo@kernel.org>
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64.S
arch/x86/include/asm/proto.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/traps.c
arch/x86/xen/xen-asm_64.S

index a65f46c3b8e1f5bc2c07213684ae1bab41b2efa9..d59461032625e34829bc2c3b4b1a24fe3567a000 100644 (file)
@@ -415,7 +415,7 @@ sysexit_audit:
 ENDPROC(entry_SYSENTER_32)
 
        # system call handler stub
-ENTRY(system_call)
+ENTRY(entry_INT80_32)
        ASM_CLAC
        pushl %eax                      # save orig_eax
        SAVE_ALL
@@ -508,7 +508,7 @@ ldt_ss:
        lss (%esp), %esp                /* switch to espfix segment */
        jmp restore_nocheck
 #endif
-ENDPROC(system_call)
+ENDPROC(entry_INT80_32)
 
        # perform work that needs to be done immediately before resumption
        ALIGN
index 4cf3dd36aa0d3759760acf95f37ff88df90d832d..e1852c4071557a0df39e4ad2a8fcd2e9c003dba6 100644 (file)
@@ -137,7 +137,7 @@ ENDPROC(native_usergs_sysret64)
  * with them due to bugs in both AMD and Intel CPUs.
  */
 
-ENTRY(system_call)
+ENTRY(entry_SYSCALL_64)
        /*
         * Interrupts are off on entry.
         * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
@@ -149,7 +149,7 @@ ENTRY(system_call)
         * after the swapgs, so that it can do the swapgs
         * for the guest and jump here on syscall.
         */
-GLOBAL(system_call_after_swapgs)
+GLOBAL(entry_SYSCALL_64_after_swapgs)
 
        movq    %rsp,PER_CPU_VAR(rsp_scratch)
        movq    PER_CPU_VAR(cpu_current_top_of_stack),%rsp
@@ -182,7 +182,7 @@ GLOBAL(system_call_after_swapgs)
 
        testl $_TIF_WORK_SYSCALL_ENTRY, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
        jnz tracesys
-system_call_fastpath:
+entry_SYSCALL_64_fastpath:
 #if __SYSCALL_MASK == ~0
        cmpq $__NR_syscall_max,%rax
 #else
@@ -246,7 +246,7 @@ tracesys:
        jnz tracesys_phase2             /* if needed, run the slow path */
        RESTORE_C_REGS_EXCEPT_RAX       /* else restore clobbered regs */
        movq ORIG_RAX(%rsp), %rax
-       jmp system_call_fastpath        /*      and return to the fast path */
+       jmp entry_SYSCALL_64_fastpath   /*      and return to the fast path */
 
 tracesys_phase2:
        SAVE_EXTRA_REGS
@@ -411,7 +411,7 @@ syscall_return_via_sysret:
 opportunistic_sysret_failed:
        SWAPGS
        jmp     restore_c_regs_and_iret
-END(system_call)
+END(entry_SYSCALL_64)
 
 
        .macro FORK_LIKE func
index 83a7f8227949b9178a475ee89bd1657d11ecb748..a4a77286cb1ddf68b466e934e9f69cb1785f3062 100644 (file)
@@ -5,11 +5,12 @@
 
 /* misc architecture specific prototypes */
 
-void system_call(void);
 void syscall_init(void);
 
-void entry_INT80_compat(void);
+void entry_SYSCALL_64(void);
 void entry_SYSCALL_compat(void);
+void entry_INT80_32(void);
+void entry_INT80_compat(void);
 void entry_SYSENTER_32(void);
 void entry_SYSENTER_compat(void);
 
index b2ae7cec33ca5b6e6db25b70571eeb89c6db022e..914be4bbc2e5386732ae945ce6e8b1d07178cd10 100644 (file)
@@ -1204,7 +1204,7 @@ void syscall_init(void)
         * set CS/DS but only a 32bit target. LSTAR sets the 64bit rip.
         */
        wrmsrl(MSR_STAR,  ((u64)__USER32_CS)<<48  | ((u64)__KERNEL_CS)<<32);
-       wrmsrl(MSR_LSTAR, system_call);
+       wrmsrl(MSR_LSTAR, entry_SYSCALL_64);
 
 #ifdef CONFIG_IA32_EMULATION
        wrmsrl(MSR_CSTAR, entry_SYSCALL_compat);
index edf97986a53d7acac68985276ebfdf94b8ed9cd5..001ddac221a113f93c36396df42df99ed853ecec 100644 (file)
@@ -72,8 +72,7 @@ gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss;
 #else
 #include <asm/processor-flags.h>
 #include <asm/setup.h>
-
-asmlinkage int system_call(void);
+#include <asm/proto.h>
 #endif
 
 /* Must be page-aligned because the real IDT is used in a fixmap. */
@@ -997,7 +996,7 @@ void __init trap_init(void)
 #endif
 
 #ifdef CONFIG_X86_32
-       set_system_trap_gate(IA32_SYSCALL_VECTOR, &system_call);
+       set_system_trap_gate(IA32_SYSCALL_VECTOR, entry_INT80_32);
        set_bit(IA32_SYSCALL_VECTOR, used_vectors);
 #endif
 
index ccac1b1e6e9353369e98a4429574792f54aa9399..f22667abf7b9d54d475edd08ffcdac8ba79b4cf3 100644 (file)
@@ -114,7 +114,7 @@ RELOC(xen_sysret32, 1b+1)
 /* Normal 64-bit system call target */
 ENTRY(xen_syscall_target)
        undo_xen_syscall
-       jmp system_call_after_swapgs
+       jmp entry_SYSCALL_64_after_swapgs
 ENDPROC(xen_syscall_target)
 
 #ifdef CONFIG_IA32_EMULATION