| // SPDX-License-Identifier: GPL-2.0-only |
| * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> |
| static unsigned int __read_mostly vdso_enabled = 1; |
| unsigned long um_vdso_addr; |
| extern unsigned long task_size; |
| extern char vdso_start[], vdso_end[]; |
| static struct page **vdsop; |
| static int __init init_vdso(void) |
| BUG_ON(vdso_end - vdso_start > PAGE_SIZE); |
| um_vdso_addr = task_size - PAGE_SIZE; |
| vdsop = kmalloc(sizeof(struct page *), GFP_KERNEL); |
| um_vdso = alloc_page(GFP_KERNEL); |
| copy_page(page_address(um_vdso), vdso_start); |
| printk(KERN_ERR "Cannot allocate vdso\n"); |
| subsys_initcall(init_vdso); |
| int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) |
| struct mm_struct *mm = current->mm; |
| if (mmap_write_lock_killable(mm)) |
| err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE, |
| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, |