From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC251C4BA18 for ; Wed, 26 Feb 2020 18:05:43 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 813AE20732 for ; Wed, 26 Feb 2020 18:05:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="OsKxGjJc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 813AE20732 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=4flzX9fF6V+l88sf8OAQGxUajXvvfNa9e0dzEQrZnT8=; b=OsKxGjJcPYEVaP 5pQ1iUFZHzBuWdSu2gxB06XNqyfvIoit+XcSdJCcvuKhQ41Jrp2Q7IcIqXSOKg7s2e+JNvrNrnk46 +yXHOVFxXsBI9KOOs2+Srte5c2EYkGAXdp1TLS8yGOdOeI8sljguR9oOCuMybiN3MFpm5N8ubwusb nS4EYQ1z6qZdxx68im9b1aW2EQ+tDGzs1OdVTvSfsiI4UgBFJMSVb5uURQAAXiPlM700PCrMYDagr Q7Xnpd8AfbXRL8iiXiEJud/vuytL/vNS/4TMPTNXPy+bnFm9GA3JG1QsC1diXcJEwYaAR01fcYHhE Uhw8YML/Vj7A4f/0LUHA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j7142-0007GJ-JN; Wed, 26 Feb 2020 18:05:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j713z-0007En-1D for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2020 18:05:40 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2476130E; Wed, 26 Feb 2020 10:05:36 -0800 (PST) Received: from arrakis.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id AE0433F881; Wed, 26 Feb 2020 10:05:34 -0800 (PST) From: Catalin Marinas To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 00/19] arm64: Memory Tagging Extension user-space support Date: Wed, 26 Feb 2020 18:05:07 +0000 Message-Id: <20200226180526.3272848-1-catalin.marinas@arm.com> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200226_100539_158741_987DFBAA X-CRM114-Status: GOOD ( 17.35 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arch@vger.kernel.org, Richard Earnshaw , Szabolcs Nagy , Andrey Konovalov , Kevin Brodsky , Peter Collingbourne , linux-mm@kvack.org, Vincenzo Frascino , Will Deacon Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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@arm.com/ [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 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel