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 struct ctl_table abi_table2[] = {
  69        {
  70                .procname       = "vsyscall32",
  71                .data           = &vdso32_enabled,
  72                .maxlen         = sizeof(int),
  73                .mode           = 0644,
  74                .proc_handler   = proc_dointvec_minmax,
  75                .extra1         = SYSCTL_ZERO,
  76                .extra2         = SYSCTL_ONE,
  77        },
  78        {}
  79};
  80
  81static struct ctl_table abi_root_table2[] = {
  82        {
  83                .procname = "abi",
  84                .mode = 0555,
  85                .child = abi_table2
  86        },
  87        {}
  88};
  89
  90static __init int ia32_binfmt_init(void)
  91{
  92        register_sysctl_table(abi_root_table2);
  93        return 0;
  94}
  95__initcall(ia32_binfmt_init);
  96#endif /* CONFIG_SYSCTL */
  97
  98#endif  /* CONFIG_X86_64 */
  99