Skip to content

Commit

Permalink
powerpc/vdso: Move vdso datapage up front
Browse files Browse the repository at this point in the history
Move the vdso datapage in front of the VDSO area,
before vdso test.

This will allow to remove the __kernel_datapage_offset symbol
and simplify __get_datapage() in following patches.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/b68c99b6e8ee0b1d99bfa4c7e34c359fc1bc1000.1601197618.git.christophe.leroy@csgroup.eu
  • Loading branch information
chleroy authored and mpe committed Dec 3, 2020
1 parent c102f07 commit 511157a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
2 changes: 1 addition & 1 deletion arch/powerpc/include/asm/mmu_context.h
Expand Up @@ -262,7 +262,7 @@ extern void arch_exit_mmap(struct mm_struct *mm);
static inline void arch_unmap(struct mm_struct *mm,
unsigned long start, unsigned long end)
{
unsigned long vdso_base = (unsigned long)mm->context.vdso;
unsigned long vdso_base = (unsigned long)mm->context.vdso - PAGE_SIZE;

if (start <= vdso_base && vdso_base < end)
mm->context.vdso = NULL;
Expand Down
14 changes: 7 additions & 7 deletions arch/powerpc/kernel/vdso.c
Expand Up @@ -123,7 +123,7 @@ static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struc
if (new_size != text_size + PAGE_SIZE)
return -EINVAL;

current->mm->context.vdso = (void __user *)new_vma->vm_start;
current->mm->context.vdso = (void __user *)new_vma->vm_start + PAGE_SIZE;

return 0;
}
Expand Down Expand Up @@ -198,7 +198,7 @@ static int __arch_setup_additional_pages(struct linux_binprm *bprm, int uses_int
* install_special_mapping or the perf counter mmap tracking code
* will fail to recognise it as a vDSO.
*/
mm->context.vdso = (void __user *)vdso_base;
mm->context.vdso = (void __user *)vdso_base + PAGE_SIZE;

/*
* our vma flags don't have VM_WRITE so by default, the process isn't
Expand Down Expand Up @@ -507,7 +507,7 @@ static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32,
return -1;
}
*((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) =
(vdso64_pages << PAGE_SHIFT) -
-PAGE_SIZE -
(sym64->st_value - VDSO64_LBASE);
#endif /* CONFIG_PPC64 */

Expand All @@ -519,7 +519,7 @@ static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32,
return -1;
}
*((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) =
(vdso32_pages << PAGE_SHIFT) -
-PAGE_SIZE -
(sym32->st_value - VDSO32_LBASE);
#endif

Expand Down Expand Up @@ -693,10 +693,10 @@ static struct page ** __init vdso_setup_pages(void *start, void *end)
if (!pagelist)
panic("%s: Cannot allocate page list for VDSO", __func__);

for (i = 0; i < pages; i++)
pagelist[i] = virt_to_page(start + i * PAGE_SIZE);
pagelist[0] = virt_to_page(vdso_data);

pagelist[i] = virt_to_page(vdso_data);
for (i = 0; i < pages; i++)
pagelist[i + 1] = virt_to_page(start + i * PAGE_SIZE);

return pagelist;
}
Expand Down

0 comments on commit 511157a

Please sign in to comment.