Skip to content

Commit 63f01d8

Browse files
committed
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Will Deacon: "It's all straightforward apart from the changes to mmap()/mremap() in relation to their handling of address arguments from userspace with non-zero tag bits in the upper byte. The change to brk() is necessary to fix a nasty user-visible regression in malloc(), but we tightened up mmap() and mremap() at the same time because they also allow the user to create virtual aliases by accident. It's much less likely than brk() to matter in practice, but enforcing the principle of "don't permit the creation of mappings using tagged addresses" leads to a straightforward ABI without having to worry about the "but what if a crazy program did foo?" aspect of things. Summary: - Fix regression in malloc() caused by ignored address tags in brk() - Add missing brackets around argument to untagged_addr() macro - Fix clang build when using binutils assembler - Fix silly typo in virtual memory map documentation" * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: mm: Avoid creating virtual address aliases in brk()/mmap()/mremap() docs: arm64: fix trivial spelling enought to enough in memory.rst arm64: memory: Add missing brackets to untagged_addr() macro arm64: lse: Fix LSE atomics with LLVM
2 parents 2865936 + dcde237 commit 63f01d8

File tree

6 files changed

+12
-10
lines changed

6 files changed

+12
-10
lines changed

Documentation/arm64/memory.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ this logic.
129129

130130
As a single binary will need to support both 48-bit and 52-bit VA
131131
spaces, the VMEMMAP must be sized large enough for 52-bit VAs and
132-
also must be sized large enought to accommodate a fixed PAGE_OFFSET.
132+
also must be sized large enough to accommodate a fixed PAGE_OFFSET.
133133

134134
Most code in the kernel should not need to consider the VA_BITS, for
135135
code that does need to know the VA size the variables are

Documentation/arm64/tagged-address-abi.rst

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,15 @@ The AArch64 Tagged Address ABI has two stages of relaxation depending
4444
how the user addresses are used by the kernel:
4545

4646
1. User addresses not accessed by the kernel but used for address space
47-
management (e.g. ``mmap()``, ``mprotect()``, ``madvise()``). The use
48-
of valid tagged pointers in this context is always allowed.
47+
management (e.g. ``mprotect()``, ``madvise()``). The use of valid
48+
tagged pointers in this context is allowed with the exception of
49+
``brk()``, ``mmap()`` and the ``new_address`` argument to
50+
``mremap()`` as these have the potential to alias with existing
51+
user addresses.
52+
53+
NOTE: This behaviour changed in v5.6 and so some earlier kernels may
54+
incorrectly accept valid tagged pointers for the ``brk()``,
55+
``mmap()`` and ``mremap()`` system calls.
4956

5057
2. User addresses accessed by the kernel (e.g. ``write()``). This ABI
5158
relaxation is disabled by default and the application thread needs to

arch/arm64/include/asm/lse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#ifdef CONFIG_ARM64_LSE_ATOMICS
88

9-
#define __LSE_PREAMBLE ".arch armv8-a+lse\n"
9+
#define __LSE_PREAMBLE ".arch_extension lse\n"
1010

1111
#include <linux/compiler_types.h>
1212
#include <linux/export.h>

arch/arm64/include/asm/memory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static inline unsigned long kaslr_offset(void)
213213
((__force __typeof__(addr))sign_extend64((__force u64)(addr), 55))
214214

215215
#define untagged_addr(addr) ({ \
216-
u64 __addr = (__force u64)addr; \
216+
u64 __addr = (__force u64)(addr); \
217217
__addr &= __untagged_addr(__addr); \
218218
(__force __typeof__(addr))__addr; \
219219
})

mm/mmap.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,6 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
195195
bool downgraded = false;
196196
LIST_HEAD(uf);
197197

198-
brk = untagged_addr(brk);
199-
200198
if (down_write_killable(&mm->mmap_sem))
201199
return -EINTR;
202200

@@ -1557,8 +1555,6 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len,
15571555
struct file *file = NULL;
15581556
unsigned long retval;
15591557

1560-
addr = untagged_addr(addr);
1561-
15621558
if (!(flags & MAP_ANONYMOUS)) {
15631559
audit_mmap_fd(fd, flags);
15641560
file = fget(fd);

mm/mremap.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,6 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
607607
LIST_HEAD(uf_unmap);
608608

609609
addr = untagged_addr(addr);
610-
new_addr = untagged_addr(new_addr);
611610

612611
if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE))
613612
return ret;

0 commit comments

Comments
 (0)