aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel/vdso.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ppc64/kernel/vdso.c')
-rw-r--r--arch/ppc64/kernel/vdso.c19
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;