diff options
Diffstat (limited to 'arch/ppc64/kernel/vdso.c')
-rw-r--r-- | arch/ppc64/kernel/vdso.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/ppc64/kernel/vdso.c b/arch/ppc64/kernel/vdso.c index 8c4597224b71..4777676365fe 100644 --- a/arch/ppc64/kernel/vdso.c +++ b/arch/ppc64/kernel/vdso.c | |||
@@ -213,13 +213,14 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack) | |||
213 | vdso_base = VDSO64_MBASE; | 213 | vdso_base = VDSO64_MBASE; |
214 | } | 214 | } |
215 | 215 | ||
216 | current->thread.vdso_base = 0; | ||
217 | |||
216 | /* vDSO has a problem and was disabled, just don't "enable" it for the | 218 | /* vDSO has a problem and was disabled, just don't "enable" it for the |
217 | * process | 219 | * process |
218 | */ | 220 | */ |
219 | if (vdso_pages == 0) { | 221 | if (vdso_pages == 0) |
220 | current->thread.vdso_base = 0; | ||
221 | return 0; | 222 | return 0; |
222 | } | 223 | |
223 | vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); | 224 | vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); |
224 | if (vma == NULL) | 225 | if (vma == NULL) |
225 | return -ENOMEM; | 226 | return -ENOMEM; |
@@ -230,12 +231,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack) | |||
230 | memset(vma, 0, sizeof(*vma)); | 231 | memset(vma, 0, sizeof(*vma)); |
231 | 232 | ||
232 | /* | 233 | /* |
233 | * pick a base address for the vDSO in process space. We have a default | 234 | * pick a base address for the vDSO in process space. We try to put it |
234 | * base of 1Mb on which we had a random offset up to 1Mb. | 235 | * at vdso_base which is the "natural" base for it, but we might fail |
235 | * XXX: Add possibility for a program header to specify that location | 236 | * and end up putting it elsewhere. |
236 | */ | 237 | */ |
238 | vdso_base = get_unmapped_area(NULL, vdso_base, | ||
239 | vdso_pages << PAGE_SHIFT, 0, 0); | ||
240 | if (vdso_base & ~PAGE_MASK) | ||
241 | return (int)vdso_base; | ||
242 | |||
237 | current->thread.vdso_base = vdso_base; | 243 | current->thread.vdso_base = vdso_base; |
238 | /* + ((unsigned long)vma & 0x000ff000); */ | ||
239 | 244 | ||
240 | vma->vm_mm = mm; | 245 | vma->vm_mm = mm; |
241 | vma->vm_start = current->thread.vdso_base; | 246 | vma->vm_start = current->thread.vdso_base; |