Ivan T. Ivanov 04e4a5
From: Vincenzo Frascino <vincenzo.frascino@arm.com>
Ivan T. Ivanov 04e4a5
Date: Mon, 1 Apr 2019 12:30:14 +0100
Ivan T. Ivanov 04e4a5
Subject: arm64: compat: Reduce address limit
Ivan T. Ivanov 04e4a5
Git-commit: d263119387de9975d2acba1dfd3392f7c5979c18
Ivan T. Ivanov 04e4a5
Patch-mainline: v5.2-rc1
Ivan T. Ivanov 04e4a5
References: git-fixes
Ivan T. Ivanov 04e4a5
Ivan T. Ivanov 04e4a5
Currently, compat tasks running on arm64 can allocate memory up to
Ivan T. Ivanov 04e4a5
TASK_SIZE_32 (UL(0x100000000)).
Ivan T. Ivanov 04e4a5
Ivan T. Ivanov 04e4a5
This means that mmap() allocations, if we treat them as returning an
Ivan T. Ivanov 04e4a5
array, are not compliant with the sections 6.5.8 of the C standard
Ivan T. Ivanov 04e4a5
(C99) which states that: "If the expression P points to an element of
Ivan T. Ivanov 04e4a5
an array object and the expression Q points to the last element of the
Ivan T. Ivanov 04e4a5
same array object, the pointer expression Q+1 compares greater than P".
Ivan T. Ivanov 04e4a5
Ivan T. Ivanov 04e4a5
Redefine TASK_SIZE_32 to address the issue.
Ivan T. Ivanov 04e4a5
Ivan T. Ivanov 04e4a5
Cc: Catalin Marinas <catalin.marinas@arm.com>
Ivan T. Ivanov 04e4a5
Cc: Will Deacon <will.deacon@arm.com>
Ivan T. Ivanov 04e4a5
Cc: Jann Horn <jannh@google.com>
Ivan T. Ivanov 04e4a5
Cc: <stable@vger.kernel.org>
Ivan T. Ivanov 04e4a5
Reported-by: Jann Horn <jannh@google.com>
Ivan T. Ivanov 04e4a5
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Ivan T. Ivanov 04e4a5
[will: fixed typo in comment]
Ivan T. Ivanov 04e4a5
Signed-off-by: Will Deacon <will.deacon@arm.com>
Ivan T. Ivanov 04e4a5
Acked-by: Ivan T. Ivanov <iivanov@suse.de>
Ivan T. Ivanov 04e4a5
---
Ivan T. Ivanov 04e4a5
 arch/arm64/include/asm/processor.h |    8 ++++++++
Ivan T. Ivanov 04e4a5
 1 file changed, 8 insertions(+)
Ivan T. Ivanov 04e4a5
Ivan T. Ivanov 04e4a5
--- a/arch/arm64/include/asm/processor.h
Ivan T. Ivanov 04e4a5
+++ b/arch/arm64/include/asm/processor.h
Ivan T. Ivanov 04e4a5
@@ -51,7 +51,15 @@
Ivan T. Ivanov 04e4a5
  * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area.
Ivan T. Ivanov 04e4a5
  */
Ivan T. Ivanov 04e4a5
 #ifdef CONFIG_COMPAT
Ivan T. Ivanov 04e4a5
+#ifdef CONFIG_ARM64_64K_PAGES
Ivan T. Ivanov 04e4a5
+/*
Ivan T. Ivanov 04e4a5
+ * With CONFIG_ARM64_64K_PAGES enabled, the last page is occupied
Ivan T. Ivanov 04e4a5
+ * by the compat vectors page.
Ivan T. Ivanov 04e4a5
+ */
Ivan T. Ivanov 04e4a5
 #define TASK_SIZE_32		UL(0x100000000)
Ivan T. Ivanov 04e4a5
+#else
Ivan T. Ivanov 04e4a5
+#define TASK_SIZE_32		(UL(0x100000000) - PAGE_SIZE)
Ivan T. Ivanov 04e4a5
+#endif /* CONFIG_ARM64_64K_PAGES */
Ivan T. Ivanov 04e4a5
 #define TASK_SIZE		(test_thread_flag(TIF_32BIT) ? \
Ivan T. Ivanov 04e4a5
 				TASK_SIZE_32 : TASK_SIZE_64)
Ivan T. Ivanov 04e4a5
 #define TASK_SIZE_OF(tsk)	(test_tsk_thread_flag(tsk, TIF_32BIT) ? \