1
2
3
4
5
6
7
8
9
10#include <linux/init.h>
11#include <linux/smp.h>
12#include <linux/kernel.h>
13#include <linux/mm_types.h>
14
15#include <asm/processor.h>
16#include <asm/vdso.h>
17
18#ifdef CONFIG_COMPAT_VDSO
19#define VDSO_DEFAULT 0
20#else
21#define VDSO_DEFAULT 1
22#endif
23
24
25
26
27
28unsigned int __read_mostly vdso32_enabled = VDSO_DEFAULT;
29
30static int __init vdso32_setup(char *s)
31{
32 vdso32_enabled = simple_strtoul(s, NULL, 0);
33
34 if (vdso32_enabled > 1) {
35 pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n");
36 vdso32_enabled = 0;
37 }
38
39 return 1;
40}
41
42
43
44
45
46
47__setup("vdso32=", vdso32_setup);
48
49#ifdef CONFIG_X86_32
50__setup_param("vdso=", vdso_setup, vdso32_setup, 0);
51#endif
52
53int __init sysenter_setup(void)
54{
55 init_vdso_image(&vdso_image_32);
56
57 return 0;
58}
59
60#ifdef CONFIG_X86_64
61
62subsys_initcall(sysenter_setup);
63
64#ifdef CONFIG_SYSCTL
65
66#include <linux/sysctl.h>
67
68static const int zero;
69static const int one = 1;
70
71static struct ctl_table abi_table2[] = {
72 {
73 .procname = "vsyscall32",
74 .data = &vdso32_enabled,
75 .maxlen = sizeof(int),
76 .mode = 0644,
77 .proc_handler = proc_dointvec_minmax,
78 .extra1 = (int *)&zero,
79 .extra2 = (int *)&one,
80 },
81 {}
82};
83
84static struct ctl_table abi_root_table2[] = {
85 {
86 .procname = "abi",
87 .mode = 0555,
88 .child = abi_table2
89 },
90 {}
91};
92
93static __init int ia32_binfmt_init(void)
94{
95 register_sysctl_table(abi_root_table2);
96 return 0;
97}
98__initcall(ia32_binfmt_init);
99#endif
100
101#endif
102