1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2d603c8e1SIngo Molnar /*
3d603c8e1SIngo Molnar * (C) Copyright 2002 Linus Torvalds
4d603c8e1SIngo Molnar * Portions based on the vdso-randomization code from exec-shield:
5d603c8e1SIngo Molnar * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar
6d603c8e1SIngo Molnar *
7d603c8e1SIngo Molnar * This file contains the needed initializations to support sysenter.
8d603c8e1SIngo Molnar */
9d603c8e1SIngo Molnar
10d603c8e1SIngo Molnar #include <linux/init.h>
11d603c8e1SIngo Molnar #include <linux/smp.h>
12d603c8e1SIngo Molnar #include <linux/kernel.h>
13d603c8e1SIngo Molnar #include <linux/mm_types.h>
14bff47c23SValdis Klētnieks #include <linux/elf.h>
15d603c8e1SIngo Molnar
16d603c8e1SIngo Molnar #include <asm/processor.h>
17d603c8e1SIngo Molnar #include <asm/vdso.h>
18d603c8e1SIngo Molnar
19d603c8e1SIngo Molnar #ifdef CONFIG_COMPAT_VDSO
20d603c8e1SIngo Molnar #define VDSO_DEFAULT 0
21d603c8e1SIngo Molnar #else
22d603c8e1SIngo Molnar #define VDSO_DEFAULT 1
23d603c8e1SIngo Molnar #endif
24d603c8e1SIngo Molnar
25d603c8e1SIngo Molnar /*
26d603c8e1SIngo Molnar * Should the kernel map a VDSO page into processes and pass its
27d603c8e1SIngo Molnar * address down to glibc upon exec()?
28d603c8e1SIngo Molnar */
29d603c8e1SIngo Molnar unsigned int __read_mostly vdso32_enabled = VDSO_DEFAULT;
30d603c8e1SIngo Molnar
vdso32_setup(char * s)31d603c8e1SIngo Molnar static int __init vdso32_setup(char *s)
32d603c8e1SIngo Molnar {
33d603c8e1SIngo Molnar vdso32_enabled = simple_strtoul(s, NULL, 0);
34d603c8e1SIngo Molnar
35c06989daSMathias Krause if (vdso32_enabled > 1) {
36d603c8e1SIngo Molnar pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n");
37c06989daSMathias Krause vdso32_enabled = 0;
38c06989daSMathias Krause }
39d603c8e1SIngo Molnar
40d603c8e1SIngo Molnar return 1;
41d603c8e1SIngo Molnar }
42d603c8e1SIngo Molnar
43d603c8e1SIngo Molnar /*
44d603c8e1SIngo Molnar * For consistency, the argument vdso32=[012] affects the 32-bit vDSO
45d603c8e1SIngo Molnar * behavior on both 64-bit and 32-bit kernels.
46d603c8e1SIngo Molnar * On 32-bit kernels, vdso=[012] means the same thing.
47d603c8e1SIngo Molnar */
48d603c8e1SIngo Molnar __setup("vdso32=", vdso32_setup);
49d603c8e1SIngo Molnar
50d603c8e1SIngo Molnar #ifdef CONFIG_X86_32
51d603c8e1SIngo Molnar __setup_param("vdso=", vdso_setup, vdso32_setup, 0);
52d603c8e1SIngo Molnar #endif
53d603c8e1SIngo Molnar
54d603c8e1SIngo Molnar #ifdef CONFIG_X86_64
55d603c8e1SIngo Molnar
56d603c8e1SIngo Molnar #ifdef CONFIG_SYSCTL
57d603c8e1SIngo Molnar /* Register vsyscall32 into the ABI table */
58d603c8e1SIngo Molnar #include <linux/sysctl.h>
59d603c8e1SIngo Molnar
60d603c8e1SIngo Molnar static struct ctl_table abi_table2[] = {
61d603c8e1SIngo Molnar {
62d603c8e1SIngo Molnar .procname = "vsyscall32",
63d603c8e1SIngo Molnar .data = &vdso32_enabled,
64d603c8e1SIngo Molnar .maxlen = sizeof(int),
65d603c8e1SIngo Molnar .mode = 0644,
66c06989daSMathias Krause .proc_handler = proc_dointvec_minmax,
67eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO,
68eec4844fSMatteo Croce .extra2 = SYSCTL_ONE,
69d603c8e1SIngo Molnar },
70d603c8e1SIngo Molnar {}
71d603c8e1SIngo Molnar };
72d603c8e1SIngo Molnar
ia32_binfmt_init(void)73d603c8e1SIngo Molnar static __init int ia32_binfmt_init(void)
74d603c8e1SIngo Molnar {
75*3f6cc47fSLuis Chamberlain register_sysctl("abi", abi_table2);
76d603c8e1SIngo Molnar return 0;
77d603c8e1SIngo Molnar }
78d603c8e1SIngo Molnar __initcall(ia32_binfmt_init);
79d603c8e1SIngo Molnar #endif /* CONFIG_SYSCTL */
80d603c8e1SIngo Molnar
81d603c8e1SIngo Molnar #endif /* CONFIG_X86_64 */
82