Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+12 -10
+1 -1
Documentation/arm64/memory.rst
··· 129 129 130 130 As a single binary will need to support both 48-bit and 52-bit VA 131 131 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. 133 133 134 134 Most code in the kernel should not need to consider the VA_BITS, for 135 135 code that does need to know the VA size the variables are
+9 -2
Documentation/arm64/tagged-address-abi.rst
··· 44 44 how the user addresses are used by the kernel: 45 45 46 46 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. 49 56 50 57 2. User addresses accessed by the kernel (e.g. ``write()``). This ABI 51 58 relaxation is disabled by default and the application thread needs to
+1 -1
arch/arm64/include/asm/lse.h
··· 6 6 7 7 #ifdef CONFIG_ARM64_LSE_ATOMICS 8 8 9 - #define __LSE_PREAMBLE ".arch armv8-a+lse\n" 9 + #define __LSE_PREAMBLE ".arch_extension lse\n" 10 10 11 11 #include <linux/compiler_types.h> 12 12 #include <linux/export.h>
+1 -1
arch/arm64/include/asm/memory.h
··· 213 213 ((__force __typeof__(addr))sign_extend64((__force u64)(addr), 55)) 214 214 215 215 #define untagged_addr(addr) ({ \ 216 - u64 __addr = (__force u64)addr; \ 216 + u64 __addr = (__force u64)(addr); \ 217 217 __addr &= __untagged_addr(__addr); \ 218 218 (__force __typeof__(addr))__addr; \ 219 219 })
-4
mm/mmap.c
··· 195 195 bool downgraded = false; 196 196 LIST_HEAD(uf); 197 197 198 - brk = untagged_addr(brk); 199 - 200 198 if (down_write_killable(&mm->mmap_sem)) 201 199 return -EINTR; 202 200 ··· 1554 1556 { 1555 1557 struct file *file = NULL; 1556 1558 unsigned long retval; 1557 - 1558 - addr = untagged_addr(addr); 1559 1559 1560 1560 if (!(flags & MAP_ANONYMOUS)) { 1561 1561 audit_mmap_fd(fd, flags);
-1
mm/mremap.c
··· 607 607 LIST_HEAD(uf_unmap); 608 608 609 609 addr = untagged_addr(addr); 610 - new_addr = untagged_addr(new_addr); 611 610 612 611 if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE)) 613 612 return ret;