linux/arch/x86/entry/vdso/vdso32-setup.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * (C) Copyright 2002 Linus Torvalds
   4 * Portions based on the vdso-randomization code from exec-shield:
   5 * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar
   6 *
   7 * This file contains the needed initializations to support sysenter.
   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 * Should the kernel map a VDSO page into processes and pass its
  26 * address down to glibc upon exec()?
  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 * For consistency, the argument vdso32=[012] affects the 32-bit vDSO
  44 * behavior on both 64-bit and 32-bit kernels.
  45 * On 32-bit kernels, vdso=[012] means the same thing.
  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/* Register vsyscall32 into the ABI table */
  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 /* CONFIG_SYSCTL */
 100
 101#endif  /* CONFIG_X86_64 */
 102