Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, vdso: Move syscall and sysenter setup into kernel/cpu/common.c

This code is used during CPU setup, and it isn't strictly speaking
related to the 32-bit vdso. It's easier to understand how this
works when the code is closer to its callers.

This also lets syscall32_cpu_init be static, which might save some
trivial amount of kernel text.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/4e466987204e232d7b55a53ff6b9739f12237461.1399317206.git.luto@amacapital.net
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

authored by

Andy Lutomirski and committed by
H. Peter Anvin
cfda7bb9 3d7ee969

+32 -32
-2
arch/x86/include/asm/proto.h
··· 12 12 void ia32_cstar_target(void); 13 13 void ia32_sysenter_target(void); 14 14 15 - void syscall32_cpu_init(void); 16 - 17 15 void x86_configure_nx(void); 18 16 void x86_report_nx(void); 19 17
+32
arch/x86/kernel/cpu/common.c
··· 953 953 else 954 954 vgetcpu_mode = VGETCPU_LSL; 955 955 } 956 + 957 + /* May not be __init: called during resume */ 958 + static void syscall32_cpu_init(void) 959 + { 960 + /* Load these always in case some future AMD CPU supports 961 + SYSENTER from compat mode too. */ 962 + wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS); 963 + wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); 964 + wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target); 965 + 966 + wrmsrl(MSR_CSTAR, ia32_cstar_target); 967 + } 968 + #endif 969 + 970 + #ifdef CONFIG_X86_32 971 + void enable_sep_cpu(void) 972 + { 973 + int cpu = get_cpu(); 974 + struct tss_struct *tss = &per_cpu(init_tss, cpu); 975 + 976 + if (!boot_cpu_has(X86_FEATURE_SEP)) { 977 + put_cpu(); 978 + return; 979 + } 980 + 981 + tss->x86_tss.ss1 = __KERNEL_CS; 982 + tss->x86_tss.sp1 = sizeof(struct tss_struct) + (unsigned long) tss; 983 + wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); 984 + wrmsr(MSR_IA32_SYSENTER_ESP, tss->x86_tss.sp1, 0); 985 + wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) ia32_sysenter_target, 0); 986 + put_cpu(); 987 + } 956 988 #endif 957 989 958 990 void __init identify_boot_cpu(void)
-30
arch/x86/vdso/vdso32-setup.c
··· 75 75 #define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SYSENTER32)) 76 76 #define vdso32_syscall() (boot_cpu_has(X86_FEATURE_SYSCALL32)) 77 77 78 - /* May not be __init: called during resume */ 79 - void syscall32_cpu_init(void) 80 - { 81 - /* Load these always in case some future AMD CPU supports 82 - SYSENTER from compat mode too. */ 83 - wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS); 84 - wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); 85 - wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target); 86 - 87 - wrmsrl(MSR_CSTAR, ia32_cstar_target); 88 - } 89 - 90 78 #else /* CONFIG_X86_32 */ 91 79 92 80 #define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SEP)) 93 81 #define vdso32_syscall() (0) 94 - 95 - void enable_sep_cpu(void) 96 - { 97 - int cpu = get_cpu(); 98 - struct tss_struct *tss = &per_cpu(init_tss, cpu); 99 - 100 - if (!boot_cpu_has(X86_FEATURE_SEP)) { 101 - put_cpu(); 102 - return; 103 - } 104 - 105 - tss->x86_tss.ss1 = __KERNEL_CS; 106 - tss->x86_tss.sp1 = sizeof(struct tss_struct) + (unsigned long) tss; 107 - wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); 108 - wrmsr(MSR_IA32_SYSENTER_ESP, tss->x86_tss.sp1, 0); 109 - wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) ia32_sysenter_target, 0); 110 - put_cpu(); 111 - } 112 82 113 83 #endif /* CONFIG_X86_64 */ 114 84