Hi, This is the second version (first version here [1]) of the series proposing the user-space support for the ARMv8.5 Memory Tagging Extension ([2], [3]). The patches are also available on this branch: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux devel/mte-v2 Changes in this version: - HWCAP2_MTE moved to bit 18. - Changed the polarity of the tag exclusion mask passed to prctl() for setting the GCR_EL1.Excl field. It is now an include mask, defaulting to 0 (no tag generated by IRG by default). - Dropped #ifdef __aarch64__ in the generic siginfo.h, renumbered SEGV_MTE* after the SEGV_ADI* macros. - Following an architecture update/fix, accesses to user memory done by the kernel now use the user-selected tag checking mode (SCTLR_EL1.TCF0). This required clearing the PSTATE.TCO on the kernel exception entry and setting the TIF_MTE_ASYNC_FAULT on context switch if any uaccess routine generated an asynchronous tag check fault. - For asynchronous faults in user space, a SIGSEGV is now delivered before processing the syscall (using -ERESTARTNOINTR). - Moved the MTE-related code from arch/arm64/kernel/process.c to mte.c. - Documentation updated following the above ABI changes. - Some of the preparatory or clean-up patches have been merged (as-instr support in Kconfig files, prot flags 0x10 and 0x20 reserved in the generic file, MAIR_EL1 setting cleanup). - Some small fixes and clean-ups following review. While there are still missing bits, I'm posting a v2 to continue the discussion with the libc folk on the main ABI aspects. Additional features will be posted in due course: - ptrace() support to be able to access the tags in memory of a different process, something like PTRACE_{PEEK,POKE}MTETAGS. Under development. - Swap support, currently under development. - Related to the above is suspend to disk. - DT and ACPI description on whether the SoC support MTE (CPUID checking is insufficient). - coredump (user) currently does not contain the tags. - kselftests, under development. - Clarify whether mmap(tagged_addr, PROT_MTE) pre-tags the memory with the tag given in the tagged_addr hint. Following commit ce18d171cb73 ("mm: untag user pointers in mmap/munmap/mremap/brk"), mmap() no longer accepts tagged hint addresses. This could be relaxed only when PROT_MTE is passed, however a deeper investigation is needed on whether we can still keep the zero page on arm64 for mappings that do not require pre-tagging. [1] https://lore.kernel.org/linux-arm-kernel/20191211184027.20130-1-catalin.marinas@xxxxxxx/ [2] https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/enhancing-memory-safety [3] https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Arm_Memory_Tagging_Extension_Whitepaper.pdf Catalin Marinas (10): arm64: alternative: Allow alternative_insn to always issue the first instruction arm64: mte: Use Normal Tagged attributes for the linear map arm64: mte: Assembler macros and default architecture for .S files arm64: Tags-aware memcmp_pages() implementation arm64: mte: Add PROT_MTE support to mmap() and mprotect() mm: Introduce arch_validate_flags() arm64: mte: Validate the PROT_MTE request via arch_validate_flags() mm: Allow arm64 mmap(PROT_MTE) on RAM-based files arm64: mte: Allow user control of the tag check mode via prctl() arm64: mte: Allow user control of the generated random tags via prctl() Kevin Brodsky (1): mm: Introduce arch_calc_vm_flag_bits() Vincenzo Frascino (8): arm64: mte: system register definitions arm64: mte: CPU feature detection and initial sysreg configuration arm64: mte: Tags-aware clear_page() implementation arm64: mte: Tags-aware copy_page() implementation arm64: mte: Add specific SIGSEGV codes arm64: mte: Handle synchronous and asynchronous tag check faults arm64: mte: Kconfig entry arm64: mte: Add Memory Tagging Extension documentation Documentation/arm64/cpu-feature-registers.rst | 2 + Documentation/arm64/elf_hwcaps.rst | 5 + Documentation/arm64/index.rst | 1 + .../arm64/memory-tagging-extension.rst | 228 ++++++++++++++++++ arch/arm64/Kconfig | 32 +++ arch/arm64/include/asm/alternative.h | 8 +- arch/arm64/include/asm/assembler.h | 17 ++ arch/arm64/include/asm/cpucaps.h | 4 +- arch/arm64/include/asm/cpufeature.h | 6 + arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/asm/kvm_arm.h | 3 +- arch/arm64/include/asm/memory.h | 17 +- arch/arm64/include/asm/mman.h | 78 ++++++ arch/arm64/include/asm/mte.h | 35 +++ arch/arm64/include/asm/page.h | 4 +- arch/arm64/include/asm/pgtable-prot.h | 2 + arch/arm64/include/asm/pgtable.h | 7 +- arch/arm64/include/asm/processor.h | 4 + arch/arm64/include/asm/sysreg.h | 62 +++++ arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/uapi/asm/hwcap.h | 2 + arch/arm64/include/uapi/asm/mman.h | 14 ++ arch/arm64/include/uapi/asm/ptrace.h | 1 + arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/cpufeature.c | 60 +++++ arch/arm64/kernel/cpuinfo.c | 2 + arch/arm64/kernel/entry.S | 27 +++ arch/arm64/kernel/mte.c | 137 +++++++++++ arch/arm64/kernel/process.c | 22 +- arch/arm64/kernel/ptrace.c | 2 +- arch/arm64/kernel/signal.c | 8 + arch/arm64/kernel/syscall.c | 10 + arch/arm64/lib/Makefile | 2 + arch/arm64/lib/clear_page.S | 7 +- arch/arm64/lib/copy_page.S | 23 ++ arch/arm64/lib/mte.S | 46 ++++ arch/arm64/mm/Makefile | 1 + arch/arm64/mm/cmppages.c | 26 ++ arch/arm64/mm/dump.c | 4 + arch/arm64/mm/fault.c | 9 +- arch/arm64/mm/mmu.c | 22 +- arch/arm64/mm/proc.S | 8 +- fs/proc/task_mmu.c | 4 + include/linux/mm.h | 8 + include/linux/mman.h | 22 +- include/uapi/asm-generic/siginfo.h | 4 +- include/uapi/linux/prctl.h | 9 + mm/mmap.c | 9 + mm/mprotect.c | 6 + mm/shmem.c | 3 + mm/util.c | 2 +- 51 files changed, 994 insertions(+), 27 deletions(-) create mode 100644 Documentation/arm64/memory-tagging-extension.rst create mode 100644 arch/arm64/include/asm/mman.h create mode 100644 arch/arm64/include/asm/mte.h create mode 100644 arch/arm64/include/uapi/asm/mman.h create mode 100644 arch/arm64/kernel/mte.c create mode 100644 arch/arm64/lib/mte.S create mode 100644 arch/arm64/mm/cmppages.c