xref: /openbmc/linux/arch/x86/entry/vdso/vdso32-setup.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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