Skip to content

Commit

Permalink
x86/vdso: Replace calculate_addr in map_vdso() with addr
Browse files Browse the repository at this point in the history
That will allow to specify address where to map vDSO blob.
For the randomized vDSO mappings introduce map_vdso_randomized()
which will simplify calls to map_vdso.

Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Acked-by: Andy Lutomirski <luto@kernel.org>
Cc: 0x7f454c46@gmail.com
Cc: oleg@redhat.com
Cc: linux-mm@kvack.org
Cc: gorcunov@openvz.org
Cc: xemul@virtuozzo.com
Link: http://lkml.kernel.org/r/20160905133308.28234-3-dsafonov@virtuozzo.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Dmitry Safonov authored and Thomas Gleixner committed Sep 14, 2016
1 parent e38447e commit 576ebfe
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions arch/x86/entry/vdso/vma.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,16 @@ static int vvar_fault(const struct vm_special_mapping *sm,
return VM_FAULT_SIGBUS;
}

static int map_vdso(const struct vdso_image *image, bool calculate_addr)
/*
* Add vdso and vvar mappings to current process.
* @image - blob to map
* @addr - request a specific address (zero to map at free addr)
*/
static int map_vdso(const struct vdso_image *image, unsigned long addr)
{
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
unsigned long addr, text_start;
unsigned long text_start;
int ret = 0;

static const struct vm_special_mapping vdso_mapping = {
Expand All @@ -193,13 +198,6 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
.fault = vvar_fault,
};

if (calculate_addr) {
addr = vdso_addr(current->mm->start_stack,
image->size - image->sym_vvar_start);
} else {
addr = 0;
}

if (down_write_killable(&mm->mmap_sem))
return -EINTR;

Expand Down Expand Up @@ -251,13 +249,20 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
return ret;
}

static int map_vdso_randomized(const struct vdso_image *image)
{
unsigned long addr = vdso_addr(current->mm->start_stack,
image->size - image->sym_vvar_start);
return map_vdso(image, addr);
}

#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
static int load_vdso32(void)
{
if (vdso32_enabled != 1) /* Other values all mean "disabled" */
return 0;

return map_vdso(&vdso_image_32, false);
return map_vdso(&vdso_image_32, 0);
}
#endif

Expand All @@ -267,7 +272,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
if (!vdso64_enabled)
return 0;

return map_vdso(&vdso_image_64, true);
return map_vdso_randomized(&vdso_image_64);
}

#ifdef CONFIG_COMPAT
Expand All @@ -278,8 +283,7 @@ int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
if (test_thread_flag(TIF_X32)) {
if (!vdso64_enabled)
return 0;

return map_vdso(&vdso_image_x32, true);
return map_vdso_randomized(&vdso_image_x32);
}
#endif
#ifdef CONFIG_IA32_EMULATION
Expand Down

0 comments on commit 576ebfe

Please sign in to comment.