From patchwork Fri Nov 24 16:34:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joey Gouly X-Patchwork-Id: 13467915 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44886C61D97 for ; Fri, 24 Nov 2023 16:35:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BDD0C6B027B; Fri, 24 Nov 2023 11:35:26 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id B8C966B0284; Fri, 24 Nov 2023 11:35:26 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A54DD6B0285; Fri, 24 Nov 2023 11:35:26 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 8E7776B027B for ; Fri, 24 Nov 2023 11:35:26 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 56A45C0CA2 for ; Fri, 24 Nov 2023 16:35:26 +0000 (UTC) X-FDA: 81493398252.14.577A6AC Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf14.hostedemail.com (Postfix) with ESMTP id BA934100025 for ; Fri, 24 Nov 2023 16:35:23 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf14.hostedemail.com: domain of joey.gouly@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=joey.gouly@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700843724; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references; bh=sl6pkx9PibsPp1BH7Xmbw1Mx6OQjiszIe8DV7+Rw4MA=; b=QrMJF7zyU1Am30n06frYDWHws5HwmhRYHLswvEQwfOZbYRN+ySjQgeTrDwxqUigpffVALA HVesVj+PSBPa/O42Nu/lpRMzCYU0TjL5OEg1VdpzBmvHg7s9BLdAus584o/U3B0zkzbGkx t6ii5YXVZ0Dz6pFYMPgwDGU6SOIsMZM= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf14.hostedemail.com: domain of joey.gouly@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=joey.gouly@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700843724; a=rsa-sha256; cv=none; b=5coS6n1GNf6NLfvJSx7kWCQKkbU38aUv7RqkX32aJya10sD2PuROuIONpwvZBrWBtHHt0p jTMZGExeenp261SI9FF++7N7pdMZLSdA5A4V3NVILDkgtVqlpAw5Re2mm9zQraFZFcuncv UfXwtkk1fQMSy74YjndWEhp3sHnGJr0= 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 37043FEC; Fri, 24 Nov 2023 08:36:09 -0800 (PST) Received: from e124191.cambridge.arm.com (e124191.cambridge.arm.com [10.1.197.45]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 856613F73F; Fri, 24 Nov 2023 08:35:20 -0800 (PST) From: Joey Gouly To: linux-arm-kernel@lists.infradead.org Cc: akpm@linux-foundation.org, aneesh.kumar@linux.ibm.com, broonie@kernel.org, catalin.marinas@arm.com, dave.hansen@linux.intel.com, joey.gouly@arm.com, maz@kernel.org, oliver.upton@linux.dev, shuah@kernel.org, will@kernel.org, kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, James Morse , Suzuki K Poulose , Zenghui Yu Subject: [PATCH v3 00/25] Permission Overlay Extension Date: Fri, 24 Nov 2023 16:34:45 +0000 Message-Id: <20231124163510.1835740-1-joey.gouly@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Rspamd-Queue-Id: BA934100025 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: wdn3ohghpnzc71o7nmph5uijadhoxntw X-HE-Tag: 1700843723-978608 X-HE-Meta: U2FsdGVkX195Rr5dW/6X62X2LQer/9DPjv1GSxZezniZGQL83hibKMEnEBlqYlSUTzZERUhJkFW7k0jSGx9/6EdUHYiYh3HHoAXrw0ahZWVzzLtqiFdttkl6u0TW515pbjwQ63DdKm1O9AbySl7nQ5GsEchWCMec1MomGF7Nst+CSW2mDmqiEw00aaICjJaTH3jyEBWsvCl9fwCa1tLJ1nmfV4p8jrwmBJaeNMmcfaIbVQxPStcOnyro3hSs22qb/VqhXtlNWgkm4sCaUW2a3vigepDnKlOI4eSJd3C1kuLXXnWOVgHfGwVLo3YKIf0uNLXQsSl/NbOpngthvt4XM7ZVMBDv7i1JSeNcG0nenHIRo1g1/p1kqLgnDFZWx6OO+T8XXGCBDv+E8yRP8a3orKTYTxHI/DTIFI9AFCS+b4bMAzhrPfXDzfXWwpfrVPK2coXve9DSTPhXqAC0GjA8qmfq8CiidXHDt7HvynApQhDIOaAX3bH/mVRCj85zEyyK6EeQbtC+ZBHHalXAr8uhejZcQXhVGQ+fsB/F3ZSeMIMGThhOOzxNW2X5UKBkW6QR0ZjelsWcbfTdyhQLlp+9Qj9ntVxy6nLWrHFSCDCiT22OT1p9634wPELQmuKNSbQM7iyfriy0f0BJLa453cIBkDJu9M5nIT03SNM5B6AFKzKw6Xk7uFq0b9s5uYSm+mS3d9ReuEUJiphX98KdU5RjHURQRSj6JE6gdyrzqVhkVHntaBhG9WUgxmECT9OfyDTr4D3CLj1hSrobCZ54wS2ov5K+6v140Vx03NhqTELM+SIYfZ1dWvhBBD+90BtLU4rSXEdwdFdBJ70Oy4yCR029TC2t4etkYiR38tX6bU/U0iBISZlIwB15I9iZFQ+bOoyGKwCauSyq/NOuFf0yNMpnqMv+hKMRINIsBm+R+lgDkfrfZpcoW/jiXDeYv3Kk5IMjND7nHeNc3J6d998swQb AAfwN3nM oBYhUXUS+EE5y/vnTo/L2xNoaLWdzezV5UtCVi6djT6FnPiDuEMy9mDYOZ+KpoSSTdsOQEb7lZIbmMzp5xmxBOc2e53fHlTpUyRAi7eqyJvAVwyoVO/Lp850M1Lr6G47wo+Ng6qG90qz9nhXwRoMr07TaNgSKtWyrVt7E/SCr9l3dm/svGOi3QRb5SzeH55JlFL944h/KlrGk2u+T1oMFz2hL21fYNORTUiWP X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Hello everyone, This series implements the Permission Overlay Extension introduced in 2022 VMSA enhancements [1]. It is based on v6.7-rc2. Changes since v2[2]: # Added ptrace support and selftest # Add missing POR_EL0 initialisation in fork/clone # Rebase onto v6.7-rc2 # Add r-bs The Permission Overlay Extension allows to constrain permissions on memory regions. This can be used from userspace (EL0) without a system call or TLB invalidation. POE is used to implement the Memory Protection Keys [3] Linux syscall. The first few patches add the basic framework, then the PKEYS interface is implemented, and then the selftests are made to work on arm64. There was discussion about what the 'default' protection key value should be, I used disallow-all (apart from pkey 0), which matches what x86 does. I have tested the modified protection_keys test on x86_64, but not PPC. I haven't build tested the x86/ppc arch changes. Thanks, Joey [1] https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/arm-a-profile-architecture-2022 [2] https://lore.kernel.org/linux-arm-kernel/20231027180850.1068089-1-joey.gouly@arm.com/ [3] Documentation/core-api/protection-keys.rst Joey Gouly (25): arm64/sysreg: add system register POR_EL{0,1} arm64/sysreg: update CPACR_EL1 register arm64: cpufeature: add Permission Overlay Extension cpucap arm64: disable trapping of POR_EL0 to EL2 arm64: context switch POR_EL0 register KVM: arm64: Save/restore POE registers arm64: enable the Permission Overlay Extension for EL0 arm64: add POIndex defines arm64: define VM_PKEY_BIT* for arm64 arm64: mask out POIndex when modifying a PTE arm64: enable ARCH_HAS_PKEYS on arm64 arm64: handle PKEY/POE faults arm64: stop using generic mm_hooks.h arm64: implement PKEYS support arm64: add POE signal support arm64: enable PKEY support for CPUs with S1POE arm64: enable POE and PIE to coexist arm64/ptrace: add support for FEAT_POE kselftest/arm64: move get_header() selftests: mm: move fpregs printing selftests: mm: make protection_keys test work on arm64 kselftest/arm64: add HWCAP test for FEAT_S1POE kselftest/arm64: parse POE_MAGIC in a signal frame kselftest/arm64: Add test case for POR_EL0 signal frame records KVM: selftests: get-reg-list: add Permission Overlay registers Documentation/arch/arm64/elf_hwcaps.rst | 3 + arch/arm64/Kconfig | 18 +++ arch/arm64/include/asm/cpufeature.h | 6 + arch/arm64/include/asm/el2_setup.h | 10 +- arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/asm/kvm_arm.h | 4 +- arch/arm64/include/asm/kvm_host.h | 4 + arch/arm64/include/asm/mman.h | 8 +- arch/arm64/include/asm/mmu.h | 2 + arch/arm64/include/asm/mmu_context.h | 51 ++++++- arch/arm64/include/asm/page.h | 10 ++ arch/arm64/include/asm/pgtable-hwdef.h | 10 ++ arch/arm64/include/asm/pgtable-prot.h | 8 +- arch/arm64/include/asm/pgtable.h | 26 +++- arch/arm64/include/asm/pkeys.h | 110 ++++++++++++++ arch/arm64/include/asm/por.h | 33 +++++ arch/arm64/include/asm/processor.h | 1 + arch/arm64/include/asm/sysreg.h | 16 ++ arch/arm64/include/asm/traps.h | 1 + arch/arm64/include/uapi/asm/hwcap.h | 1 + arch/arm64/include/uapi/asm/sigcontext.h | 7 + arch/arm64/kernel/cpufeature.c | 23 +++ arch/arm64/kernel/cpuinfo.c | 1 + arch/arm64/kernel/process.c | 22 +++ arch/arm64/kernel/ptrace.c | 46 ++++++ arch/arm64/kernel/signal.c | 51 +++++++ arch/arm64/kernel/traps.c | 12 +- arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 10 ++ arch/arm64/kvm/sys_regs.c | 2 + arch/arm64/mm/fault.c | 44 +++++- arch/arm64/mm/mmap.c | 9 ++ arch/arm64/mm/mmu.c | 40 +++++ arch/arm64/tools/cpucaps | 1 + arch/arm64/tools/sysreg | 15 +- arch/powerpc/include/asm/page.h | 11 ++ arch/x86/include/asm/page.h | 10 ++ fs/proc/task_mmu.c | 2 + include/linux/mm.h | 13 -- include/uapi/linux/elf.h | 1 + tools/testing/selftests/arm64/abi/hwcap.c | 14 ++ .../testing/selftests/arm64/signal/.gitignore | 1 + .../arm64/signal/testcases/poe_siginfo.c | 86 +++++++++++ .../arm64/signal/testcases/testcases.c | 27 +--- .../arm64/signal/testcases/testcases.h | 28 +++- .../selftests/kvm/aarch64/get-reg-list.c | 14 ++ tools/testing/selftests/mm/Makefile | 2 +- tools/testing/selftests/mm/pkey-arm64.h | 139 ++++++++++++++++++ tools/testing/selftests/mm/pkey-helpers.h | 8 + tools/testing/selftests/mm/pkey-powerpc.h | 3 + tools/testing/selftests/mm/pkey-x86.h | 4 + tools/testing/selftests/mm/protection_keys.c | 109 ++++++++++++-- 51 files changed, 1011 insertions(+), 67 deletions(-) create mode 100644 arch/arm64/include/asm/pkeys.h create mode 100644 arch/arm64/include/asm/por.h create mode 100644 tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c create mode 100644 tools/testing/selftests/mm/pkey-arm64.h