|
@@ -50,6 +50,9 @@
|
|
|
/* Max supported size for symbol names */
|
|
|
#define MAX_SYMNAME 64
|
|
|
|
|
|
+/* The alignment of the vDSO */
|
|
|
+#define VDSO_ALIGNMENT (1 << 16)
|
|
|
+
|
|
|
extern char vdso32_start, vdso32_end;
|
|
|
static void *vdso32_kbase = &vdso32_start;
|
|
|
static unsigned int vdso32_pages;
|
|
@@ -231,15 +234,21 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|
|
* pick a base address for the vDSO in process space. We try to put it
|
|
|
* at vdso_base which is the "natural" base for it, but we might fail
|
|
|
* and end up putting it elsewhere.
|
|
|
+ * Add enough to the size so that the result can be aligned.
|
|
|
*/
|
|
|
down_write(&mm->mmap_sem);
|
|
|
vdso_base = get_unmapped_area(NULL, vdso_base,
|
|
|
- vdso_pages << PAGE_SHIFT, 0, 0);
|
|
|
+ (vdso_pages << PAGE_SHIFT) +
|
|
|
+ ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
|
|
|
+ 0, 0);
|
|
|
if (IS_ERR_VALUE(vdso_base)) {
|
|
|
rc = vdso_base;
|
|
|
goto fail_mmapsem;
|
|
|
}
|
|
|
|
|
|
+ /* Add required alignment. */
|
|
|
+ vdso_base = ALIGN(vdso_base, VDSO_ALIGNMENT);
|
|
|
+
|
|
|
/*
|
|
|
* Put vDSO base into mm struct. We need to do this before calling
|
|
|
* install_special_mapping or the perf counter mmap tracking code
|