powerpc: Align vDSO base address
The ABI specifies a 64K alignment, we need to map the vDSO accordingly Signed-off-by: Andreas Schwab <schwab@linux-m68k.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
7de80284d6
Коммит
348aa30300
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче