Skip to content

Commit cfda7bb

Browse files
amlutoH. Peter Anvin
authored andcommitted
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>
1 parent 3d7ee96 commit cfda7bb

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

arch/x86/include/asm/proto.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ void ia32_syscall(void);
1212
void ia32_cstar_target(void);
1313
void ia32_sysenter_target(void);
1414

15-
void syscall32_cpu_init(void);
16-
1715
void x86_configure_nx(void);
1816
void x86_report_nx(void);
1917

arch/x86/kernel/cpu/common.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,38 @@ static void vgetcpu_set_mode(void)
953953
else
954954
vgetcpu_mode = VGETCPU_LSL;
955955
}
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+
}
956988
#endif
957989

958990
void __init identify_boot_cpu(void)

arch/x86/vdso/vdso32-setup.c

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -75,41 +75,11 @@ static unsigned vdso32_size;
7575
#define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SYSENTER32))
7676
#define vdso32_syscall() (boot_cpu_has(X86_FEATURE_SYSCALL32))
7777

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-
9078
#else /* CONFIG_X86_32 */
9179

9280
#define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SEP))
9381
#define vdso32_syscall() (0)
9482

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-
11383
#endif /* CONFIG_X86_64 */
11484

11585
int __init sysenter_setup(void)

0 commit comments

Comments
 (0)