]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
arm64: mm: Allow forcing all userspace addresses to 52-bit
authorSteve Capper <steve.capper@arm.com>
Thu, 6 Dec 2018 22:50:42 +0000 (22:50 +0000)
committerWill Deacon <will.deacon@arm.com>
Mon, 10 Dec 2018 18:42:18 +0000 (18:42 +0000)
On arm64 52-bit VAs are provided to userspace when a hint is supplied to
mmap. This helps maintain compatibility with software that expects at
most 48-bit VAs to be returned.

In order to help identify software that has 48-bit VA assumptions, this
patch allows one to compile a kernel where 52-bit VAs are returned by
default on HW that supports it.

This feature is intended to be for development systems only.

Signed-off-by: Steve Capper <steve.capper@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/Kconfig
arch/arm64/include/asm/elf.h
arch/arm64/include/asm/processor.h

index 858e353b2f40531b31c63d1980b8c480bdd75c49..ca1f93233b22b6c916bb639d88320c9f3230b2ec 100644 (file)
@@ -1186,6 +1186,19 @@ config ARM64_CNP
          at runtime, and does not affect PEs that do not implement
          this feature.
 
+config ARM64_FORCE_52BIT
+       bool "Force 52-bit virtual addresses for userspace"
+       depends on ARM64_52BIT_VA && EXPERT
+       help
+         For systems with 52-bit userspace VAs enabled, the kernel will attempt
+         to maintain compatibility with older software by providing 48-bit VAs
+         unless a hint is supplied to mmap.
+
+         This configuration option disables the 48-bit compatibility logic, and
+         forces all userspace addresses to be 52-bit on HW that supports it. One
+         should only enable this configuration option for stress testing userspace
+         memory management code. If unsure say N here.
+
 endmenu
 
 config ARM64_SVE
index bc9bd9e77d9dc09da0d8bdfb3c5657a3ab84890b..6adc1a90e7e6b62b752e4da7a433bb5163517598 100644 (file)
  * 64-bit, this is above 4GB to leave the entire 32-bit address
  * space open for things that want to use the area for 32-bit pointers.
  */
+#ifdef CONFIG_ARM64_FORCE_52BIT
+#define ELF_ET_DYN_BASE                (2 * TASK_SIZE_64 / 3)
+#else
 #define ELF_ET_DYN_BASE                (2 * DEFAULT_MAP_WINDOW_64 / 3)
+#endif /* CONFIG_ARM64_FORCE_52BIT */
 
 #ifndef __ASSEMBLY__
 
index 7ff75e52b76264c4ef87b3fb7dc5626f3f40dd39..efa0210cf927955902f6ce959c34d397facba546 100644 (file)
@@ -74,8 +74,13 @@ extern u64 vabits_user;
 #define DEFAULT_MAP_WINDOW     DEFAULT_MAP_WINDOW_64
 #endif /* CONFIG_COMPAT */
 
-#define TASK_UNMAPPED_BASE     (PAGE_ALIGN(DEFAULT_MAP_WINDOW / 4))
+#ifdef CONFIG_ARM64_FORCE_52BIT
+#define STACK_TOP_MAX          TASK_SIZE_64
+#define TASK_UNMAPPED_BASE     (PAGE_ALIGN(TASK_SIZE / 4))
+#else
 #define STACK_TOP_MAX          DEFAULT_MAP_WINDOW_64
+#define TASK_UNMAPPED_BASE     (PAGE_ALIGN(DEFAULT_MAP_WINDOW / 4))
+#endif /* CONFIG_ARM64_FORCE_52BIT */
 
 #ifdef CONFIG_COMPAT
 #define AARCH32_VECTORS_BASE   0xffff0000
@@ -85,12 +90,14 @@ extern u64 vabits_user;
 #define STACK_TOP              STACK_TOP_MAX
 #endif /* CONFIG_COMPAT */
 
+#ifndef CONFIG_ARM64_FORCE_52BIT
 #define arch_get_mmap_end(addr) ((addr > DEFAULT_MAP_WINDOW) ? TASK_SIZE :\
                                DEFAULT_MAP_WINDOW)
 
 #define arch_get_mmap_base(addr, base) ((addr > DEFAULT_MAP_WINDOW) ? \
                                        base + TASK_SIZE - DEFAULT_MAP_WINDOW :\
                                        base)
+#endif /* CONFIG_ARM64_FORCE_52BIT */
 
 extern phys_addr_t arm64_dma_phys_limit;
 #define ARCH_LOW_ADDRESS_LIMIT (arm64_dma_phys_limit - 1)