Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 | 2 | * (C) Copyright 2002 Linus Torvalds |
e6e5494c IM |
3 | * Portions based on the vdso-randomization code from exec-shield: |
4 | * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar | |
1da177e4 LT |
5 | * |
6 | * This file contains the needed initializations to support sysenter. | |
7 | */ | |
8 | ||
9 | #include <linux/init.h> | |
10 | #include <linux/smp.h> | |
18d0a6fd AL |
11 | #include <linux/kernel.h> |
12 | #include <linux/mm_types.h> | |
1da177e4 LT |
13 | |
14 | #include <asm/cpufeature.h> | |
18d0a6fd | 15 | #include <asm/processor.h> |
6c3652ef | 16 | #include <asm/vdso.h> |
1dbf527c | 17 | |
1dbf527c | 18 | #ifdef CONFIG_COMPAT_VDSO |
b0b49f26 | 19 | #define VDSO_DEFAULT 0 |
1dbf527c | 20 | #else |
b0b49f26 | 21 | #define VDSO_DEFAULT 1 |
1dbf527c | 22 | #endif |
1da177e4 | 23 | |
e6e5494c IM |
24 | /* |
25 | * Should the kernel map a VDSO page into processes and pass its | |
26 | * address down to glibc upon exec()? | |
27 | */ | |
3d7ee969 | 28 | unsigned int __read_mostly vdso32_enabled = VDSO_DEFAULT; |
e6e5494c | 29 | |
3d7ee969 | 30 | static int __init vdso32_setup(char *s) |
e6e5494c | 31 | { |
3d7ee969 | 32 | vdso32_enabled = simple_strtoul(s, NULL, 0); |
e6e5494c | 33 | |
3d7ee969 | 34 | if (vdso32_enabled > 1) |
b0b49f26 AL |
35 | pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n"); |
36 | ||
e6e5494c IM |
37 | return 1; |
38 | } | |
39 | ||
af65d648 RM |
40 | /* |
41 | * For consistency, the argument vdso32=[012] affects the 32-bit vDSO | |
42 | * behavior on both 64-bit and 32-bit kernels. | |
43 | * On 32-bit kernels, vdso=[012] means the same thing. | |
44 | */ | |
3d7ee969 | 45 | __setup("vdso32=", vdso32_setup); |
e6e5494c | 46 | |
af65d648 | 47 | #ifdef CONFIG_X86_32 |
3d7ee969 | 48 | __setup_param("vdso=", vdso_setup, vdso32_setup, 0); |
af65d648 | 49 | #endif |
1da177e4 | 50 | |
af65d648 RM |
51 | #ifdef CONFIG_X86_64 |
52 | ||
b6ad92d4 | 53 | #define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SYSENTER32)) |
6a52e4b1 | 54 | #define vdso32_syscall() (boot_cpu_has(X86_FEATURE_SYSCALL32)) |
af65d648 | 55 | |
af65d648 RM |
56 | #else /* CONFIG_X86_32 */ |
57 | ||
58 | #define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SEP)) | |
6a52e4b1 | 59 | #define vdso32_syscall() (0) |
af65d648 | 60 | |
af65d648 RM |
61 | #endif /* CONFIG_X86_64 */ |
62 | ||
6f121e54 AL |
63 | #if defined(CONFIG_X86_32) || defined(CONFIG_COMPAT) |
64 | const struct vdso_image *selected_vdso32; | |
65 | #endif | |
66 | ||
a6c4e076 | 67 | int __init sysenter_setup(void) |
1da177e4 | 68 | { |
b67e612c | 69 | #ifdef CONFIG_COMPAT |
6f121e54 AL |
70 | if (vdso32_syscall()) |
71 | selected_vdso32 = &vdso_image_32_syscall; | |
72 | else | |
b67e612c | 73 | #endif |
6f121e54 AL |
74 | if (vdso32_sysenter()) |
75 | selected_vdso32 = &vdso_image_32_sysenter; | |
76 | else | |
77 | selected_vdso32 = &vdso_image_32_int80; | |
4e40112c | 78 | |
6f121e54 | 79 | init_vdso_image(selected_vdso32); |
1da177e4 | 80 | |
1da177e4 LT |
81 | return 0; |
82 | } | |
e6e5494c | 83 | |
af65d648 RM |
84 | #ifdef CONFIG_X86_64 |
85 | ||
d7a0380d | 86 | subsys_initcall(sysenter_setup); |
af65d648 | 87 | |
a97f52e6 RM |
88 | #ifdef CONFIG_SYSCTL |
89 | /* Register vsyscall32 into the ABI table */ | |
90 | #include <linux/sysctl.h> | |
91 | ||
f07d91ed | 92 | static struct ctl_table abi_table2[] = { |
a97f52e6 RM |
93 | { |
94 | .procname = "vsyscall32", | |
3d7ee969 | 95 | .data = &vdso32_enabled, |
a97f52e6 RM |
96 | .maxlen = sizeof(int), |
97 | .mode = 0644, | |
98 | .proc_handler = proc_dointvec | |
99 | }, | |
100 | {} | |
101 | }; | |
102 | ||
f07d91ed | 103 | static struct ctl_table abi_root_table2[] = { |
a97f52e6 | 104 | { |
a97f52e6 RM |
105 | .procname = "abi", |
106 | .mode = 0555, | |
107 | .child = abi_table2 | |
108 | }, | |
109 | {} | |
110 | }; | |
111 | ||
112 | static __init int ia32_binfmt_init(void) | |
113 | { | |
114 | register_sysctl_table(abi_root_table2); | |
115 | return 0; | |
116 | } | |
117 | __initcall(ia32_binfmt_init); | |
a6c19dfe | 118 | #endif /* CONFIG_SYSCTL */ |
af65d648 RM |
119 | |
120 | #endif /* CONFIG_X86_64 */ |