* [PATCH 0/2] arm64: Allow AArch32 on arm64 with 64k PAGE_SIZE
@ 2015-03-16 16:32 Alexander Graf
2015-03-16 16:32 ` [PATCH 1/2] arm64: fix implementation of mmap2 compat syscall Alexander Graf
2015-03-16 16:32 ` [PATCH 2/2] arm64: Enable CONFIG_COMPAT also for 64k page size Alexander Graf
0 siblings, 2 replies; 3+ messages in thread
From: Alexander Graf @ 2015-03-16 16:32 UTC (permalink / raw)
To: linux-arm-kernel
With binutils 2.25 the default alignment for 32bit arm sections changed to
have everything 64k aligned. Armv7 binaries built with this binutils version
run successfully on an arm64 system with this patch set applied.
This provides the best of both worlds for some users. You get less page faults,
but can still run legacy broken code that might not be 64bit safe yet.
If you want to give this a try, you obviously need user space that was compiled
with 64k constraints fulfilled. For a working rootfs, just grab the latest
openSUSE Factory tree:
http://download.opensuse.org/ports/armv7hl/factory/images/openSUSE-Factory-ARM-JeOS.armv7-rootfs.armv7l-Current.tbz
Alex
Alexander Graf (1):
arm64: Enable CONFIG_COMPAT also for 64k page size
Andreas Schwab (1):
arm64: fix implementation of mmap2 compat syscall
arch/arm64/Kconfig | 6 +++++-
arch/arm64/include/asm/unistd32.h | 2 +-
arch/arm64/kernel/entry32.S | 18 ++++++++++++++++++
arch/arm64/kernel/sys32.c | 6 ++++++
4 files changed, 30 insertions(+), 2 deletions(-)
--
2.1.4
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] arm64: fix implementation of mmap2 compat syscall
2015-03-16 16:32 [PATCH 0/2] arm64: Allow AArch32 on arm64 with 64k PAGE_SIZE Alexander Graf
@ 2015-03-16 16:32 ` Alexander Graf
2015-03-16 16:32 ` [PATCH 2/2] arm64: Enable CONFIG_COMPAT also for 64k page size Alexander Graf
1 sibling, 0 replies; 3+ messages in thread
From: Alexander Graf @ 2015-03-16 16:32 UTC (permalink / raw)
To: linux-arm-kernel
From: Andreas Schwab <schwab@suse.de>
The arm mmap2 syscall takes the offset in units of 4K, thus with 64K pages
the offset needs to be scaled to units of pages.
Signed-off-by: Andreas Schwab <schwab@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
arch/arm64/include/asm/unistd32.h | 2 +-
arch/arm64/kernel/entry32.S | 18 ++++++++++++++++++
arch/arm64/kernel/sys32.c | 6 ++++++
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
index 2722442..cef934a 100644
--- a/arch/arm64/include/asm/unistd32.h
+++ b/arch/arm64/include/asm/unistd32.h
@@ -406,7 +406,7 @@ __SYSCALL(__NR_vfork, sys_vfork)
#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
__SYSCALL(__NR_ugetrlimit, compat_sys_getrlimit) /* SuS compliant getrlimit */
#define __NR_mmap2 192
-__SYSCALL(__NR_mmap2, sys_mmap_pgoff)
+__SYSCALL(__NR_mmap2, compat_sys_mmap2_wrapper)
#define __NR_truncate64 193
__SYSCALL(__NR_truncate64, compat_sys_truncate64_wrapper)
#define __NR_ftruncate64 194
diff --git a/arch/arm64/kernel/entry32.S b/arch/arm64/kernel/entry32.S
index 9a8f6ae..17f3296 100644
--- a/arch/arm64/kernel/entry32.S
+++ b/arch/arm64/kernel/entry32.S
@@ -19,9 +19,12 @@
*/
#include <linux/linkage.h>
+#include <linux/const.h>
#include <asm/assembler.h>
#include <asm/asm-offsets.h>
+#include <asm/errno.h>
+#include <asm/page.h>
/*
* System call wrappers for the AArch32 compatibility layer.
@@ -54,6 +57,21 @@ ENTRY(compat_sys_fstatfs64_wrapper)
ENDPROC(compat_sys_fstatfs64_wrapper)
/*
+ * Note: off_4k (w5) is always units of 4K. If we can't do the requested
+ * offset, we return EINVAL.
+ */
+#if PAGE_SHIFT > 12
+ENTRY(compat_sys_mmap2_wrapper)
+ tst w5, #~PAGE_MASK >> 12
+ b.ne 1f
+ lsr w5, w5, #PAGE_SHIFT - 12
+ b sys_mmap_pgoff
+1: mov x0, #-EINVAL
+ ret lr
+ENDPROC(compat_sys_mmap2_wrapper)
+#endif
+
+/*
* Wrappers for AArch32 syscalls that either take 64-bit parameters
* in registers or that take 32-bit parameters which require sign
* extension.
diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c
index 2d5ab3c..7800bb1 100644
--- a/arch/arm64/kernel/sys32.c
+++ b/arch/arm64/kernel/sys32.c
@@ -24,6 +24,7 @@
#include <linux/compiler.h>
#include <linux/syscalls.h>
+#include <asm/page.h>
asmlinkage long compat_sys_sigreturn_wrapper(void);
asmlinkage long compat_sys_rt_sigreturn_wrapper(void);
@@ -37,6 +38,11 @@ asmlinkage long compat_sys_readahead_wrapper(void);
asmlinkage long compat_sys_fadvise64_64_wrapper(void);
asmlinkage long compat_sys_sync_file_range2_wrapper(void);
asmlinkage long compat_sys_fallocate_wrapper(void);
+#if PAGE_SHIFT > 12
+asmlinkage long compat_sys_mmap2_wrapper(void);
+#else
+#define compat_sys_mmap2_wrapper sys_mmap_pgoff
+#endif
#undef __SYSCALL
#define __SYSCALL(nr, sym) [nr] = sym,
--
2.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] arm64: Enable CONFIG_COMPAT also for 64k page size
2015-03-16 16:32 [PATCH 0/2] arm64: Allow AArch32 on arm64 with 64k PAGE_SIZE Alexander Graf
2015-03-16 16:32 ` [PATCH 1/2] arm64: fix implementation of mmap2 compat syscall Alexander Graf
@ 2015-03-16 16:32 ` Alexander Graf
1 sibling, 0 replies; 3+ messages in thread
From: Alexander Graf @ 2015-03-16 16:32 UTC (permalink / raw)
To: linux-arm-kernel
With binutils 2.25 the default alignment for 32bit arm sections changed to
have everything 64k aligned. Armv7 binaries built with this binutils version
run successfully on an arm64 system.
Since effectively there is now the chance to run armv7 code on arm64 even
with 64k page size, it doesn't make sense to block people from enabling
CONFIG_COMPAT on those configurations.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
arch/arm64/Kconfig | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 1b8e973..14ff611 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -670,7 +670,7 @@ source "fs/Kconfig.binfmt"
config COMPAT
bool "Kernel support for 32-bit EL0"
- depends on !ARM64_64K_PAGES
+ depends on !ARM64_64K_PAGES || EXPERT
select COMPAT_BINFMT_ELF
select HAVE_UID16
select OLD_SIGSUSPEND3
@@ -681,6 +681,10 @@ config COMPAT
the user helper functions, VFP support and the ptrace interface are
handled appropriately by the kernel.
+ If you also enabled CONFIG_ARM64_64K_PAGES, please be aware that you
+ will only be able to execute AArch32 binaries that were compiled with
+ 64k aligned segments.
+
If you want to execute 32-bit userspace applications, say Y.
config SYSVIPC_COMPAT
--
2.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-03-16 16:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-16 16:32 [PATCH 0/2] arm64: Allow AArch32 on arm64 with 64k PAGE_SIZE Alexander Graf
2015-03-16 16:32 ` [PATCH 1/2] arm64: fix implementation of mmap2 compat syscall Alexander Graf
2015-03-16 16:32 ` [PATCH 2/2] arm64: Enable CONFIG_COMPAT also for 64k page size Alexander Graf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).