Instead of providing compat_arch_setup_additional_pages(), check if the
task is compatible from personality, which is set earlier in
load_elf_binary(). That will align code with powerpc and sparc, also
it'll allow to completely remove compat_arch_setyp_addtional_pages()
macro after doing the same for x86, simiplifying the binfmt code
in the end.

Cc: linux-arm-ker...@lists.infradead.org
Signed-off-by: Dmitry Safonov <d...@arista.com>
---
 arch/arm64/include/asm/elf.h |  5 -----
 arch/arm64/kernel/vdso.c     | 21 ++++++++++-----------
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
index d1073ffa7f24..a81953bcc1cf 100644
--- a/arch/arm64/include/asm/elf.h
+++ b/arch/arm64/include/asm/elf.h
@@ -237,11 +237,6 @@ do {                                                       
                \
 #else
 #define COMPAT_ARCH_DLINFO
 #endif
-struct linux_binprm;
-extern int aarch32_setup_additional_pages(struct linux_binprm *bprm,
-                                         int uses_interp);
-#define compat_arch_setup_additional_pages \
-                                       aarch32_setup_additional_pages
 
 #endif /* CONFIG_COMPAT */
 
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index cee5d04ea9ad..1b710deb84d6 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -401,29 +401,24 @@ static int aarch32_sigreturn_setup(struct mm_struct *mm)
        return PTR_ERR_OR_ZERO(ret);
 }
 
-int aarch32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
+static int aarch32_setup_additional_pages(struct linux_binprm *bprm,
+                                         int uses_interp)
 {
        struct mm_struct *mm = current->mm;
        int ret;
 
-       if (mmap_write_lock_killable(mm))
-               return -EINTR;
-
        ret = aarch32_kuser_helpers_setup(mm);
        if (ret)
-               goto out;
+               return ret;
 
        if (IS_ENABLED(CONFIG_COMPAT_VDSO)) {
                ret = __setup_additional_pages(VDSO_ABI_AA32, mm, bprm,
                                               uses_interp);
                if (ret)
-                       goto out;
+                       return ret;
        }
 
-       ret = aarch32_sigreturn_setup(mm);
-out:
-       mmap_write_unlock(mm);
-       return ret;
+       return aarch32_sigreturn_setup(mm);
 }
 #endif /* CONFIG_COMPAT */
 
@@ -460,7 +455,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, 
int uses_interp)
        if (mmap_write_lock_killable(mm))
                return -EINTR;
 
-       ret = __setup_additional_pages(VDSO_ABI_AA64, mm, bprm, uses_interp);
+       if (is_compat_task())
+               ret = aarch32_setup_additional_pages(bprm, uses_interp);
+       else
+               ret = __setup_additional_pages(VDSO_ABI_AA64, mm, bprm, 
uses_interp);
+
        mmap_write_unlock(mm);
 
        return ret;
-- 
2.28.0

Reply via email to