From: Ram Pai <linuxram@us.ibm.com>
To: mpe@ellerman.id.au, mingo@redhat.com, akpm@linux-foundation.org,
corbet@lwn.net, arnd@arndb.de
Cc: linuxppc-dev@lists.ozlabs.org, linux-mm@kvack.org,
x86@kernel.org, linux-arch@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org, dave.hansen@intel.com,
benh@kernel.crashing.org, paulus@samba.org,
khandual@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com,
bsingharora@gmail.com, hbabu@us.ibm.com, mhocko@kernel.org,
bauerman@linux.vnet.ibm.com, ebiederm@xmission.com,
linuxram@us.ibm.com
Subject: [PATCH v9 23/51] powerpc: Enable pkey subsystem
Date: Mon, 6 Nov 2017 00:57:15 -0800 [thread overview]
Message-ID: <1509958663-18737-24-git-send-email-linuxram@us.ibm.com> (raw)
In-Reply-To: <1509958663-18737-1-git-send-email-linuxram@us.ibm.com>
PAPR defines 'ibm,processor-storage-keys' property. It exports two
values. The first value holds the number of data-access keys and the
second holds the number of instruction-access keys. Due to a bug in
the firmware, instruction-access keys is always reported as zero.
However any key can be configured to disable data-access and/or disable
execution-access. The inavailablity of the second value is not a
big handicap, though it could have been used to determine if the
platform supported disable-execution-access.
Non PAPR platforms do not define this property in the device tree yet.
Here, we hardcode CPUs that support pkey by consulting
PowerISA3.0
This patch calculates the number of keys supported by the platform.
Alsi it determines the platform support for read/write/execution access
support for pkeys.
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
---
arch/powerpc/include/asm/cputable.h | 15 +++++++++----
arch/powerpc/include/asm/mmu_context.h | 1 +
arch/powerpc/include/asm/pkeys.h | 10 +++++++++
arch/powerpc/kernel/prom.c | 18 +++++++++++++++++
arch/powerpc/mm/pkeys.c | 33 +++++++++++++++++++++----------
5 files changed, 61 insertions(+), 16 deletions(-)
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h
index 53b31c2..b288735 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -215,7 +215,9 @@ enum {
#define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000)
#define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000)
#define CPU_FTR_PMAO_BUG LONG_ASM_CONST(0x1000000000000000)
+#define CPU_FTR_PKEY LONG_ASM_CONST(0x2000000000000000)
#define CPU_FTR_POWER9_DD1 LONG_ASM_CONST(0x4000000000000000)
+#define CPU_FTR_PKEY_EXECUTE LONG_ASM_CONST(0x8000000000000000)
#ifndef __ASSEMBLY__
@@ -436,7 +438,8 @@ enum {
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
CPU_FTR_MMCRA | CPU_FTR_SMT | \
CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \
- CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_DABRX)
+ CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_DABRX | \
+ CPU_FTR_PKEY)
#define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
CPU_FTR_MMCRA | CPU_FTR_SMT | \
@@ -444,7 +447,7 @@ enum {
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR | \
- CPU_FTR_DABRX)
+ CPU_FTR_DABRX | CPU_FTR_PKEY)
#define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\
CPU_FTR_MMCRA | CPU_FTR_SMT | \
@@ -453,7 +456,7 @@ enum {
CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \
- CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX)
+ CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX | CPU_FTR_PKEY)
#define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\
CPU_FTR_MMCRA | CPU_FTR_SMT | \
@@ -463,7 +466,8 @@ enum {
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
- CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP)
+ CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_PKEY |\
+ CPU_FTR_PKEY_EXECUTE)
#define CPU_FTRS_POWER8E (CPU_FTRS_POWER8 | CPU_FTR_PMAO_BUG)
#define CPU_FTRS_POWER8_DD1 (CPU_FTRS_POWER8 & ~CPU_FTR_DBELL)
#define CPU_FTRS_POWER9 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
@@ -475,7 +479,8 @@ enum {
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
- CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_ARCH_300)
+ CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_ARCH_300 | \
+ CPU_FTR_PKEY | CPU_FTR_PKEY_EXECUTE)
#define CPU_FTRS_POWER9_DD1 ((CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD1) & \
(~CPU_FTR_SAO))
#define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h
index 95a3288..5a15d37 100644
--- a/arch/powerpc/include/asm/mmu_context.h
+++ b/arch/powerpc/include/asm/mmu_context.h
@@ -152,6 +152,7 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
#define thread_pkey_regs_save(thread)
#define thread_pkey_regs_restore(new_thread, old_thread)
#define thread_pkey_regs_init(thread)
+#define pkey_mmu_values(total_data, total_execute)
static inline int vma_pkey(struct vm_area_struct *vma)
{
diff --git a/arch/powerpc/include/asm/pkeys.h b/arch/powerpc/include/asm/pkeys.h
index 9ee4731..333fb28 100644
--- a/arch/powerpc/include/asm/pkeys.h
+++ b/arch/powerpc/include/asm/pkeys.h
@@ -13,6 +13,7 @@
#define _ASM_POWERPC_KEYS_H
#include <linux/jump_label.h>
+#include <asm/firmware.h>
DECLARE_STATIC_KEY_TRUE(pkey_disabled);
extern int pkeys_total; /* total pkeys as per device tree */
@@ -227,6 +228,15 @@ static inline void pkey_mm_init(struct mm_struct *mm)
mm->context.execute_only_pkey = -1;
}
+static inline void pkey_mmu_values(int total_data, int total_execute)
+{
+ /*
+ * Since any pkey can be used for data or execute, we will just treat
+ * all keys as equal and track them as one entity.
+ */
+ pkeys_total = total_data;
+}
+
extern void thread_pkey_regs_save(struct thread_struct *thread);
extern void thread_pkey_regs_restore(struct thread_struct *new_thread,
struct thread_struct *old_thread);
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index f830562..8b75e9b 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -35,6 +35,7 @@
#include <linux/of_fdt.h>
#include <linux/libfdt.h>
#include <linux/cpu.h>
+#include <linux/pkeys.h>
#include <asm/prom.h>
#include <asm/rtas.h>
@@ -228,6 +229,22 @@ static void __init check_cpu_pa_features(unsigned long node)
ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
}
+static void __init check_cpu_pkey_feature(unsigned long node)
+{
+ const __be32 *ftrs;
+ int len, total_data, total_execute;
+
+ ftrs = of_get_flat_dt_prop(node, "ibm,processor-storage-keys", &len);
+ if (ftrs == NULL)
+ return;
+
+ len /= sizeof(int);
+ total_execute = (len >= 2) ? be32_to_cpu(ftrs[1]) : 0;
+ total_data = (len >= 1) ? be32_to_cpu(ftrs[0]) : 0;
+ pkey_mmu_values(total_data, total_execute);
+}
+
+
#ifdef CONFIG_PPC_STD_MMU_64
static void __init init_mmu_slb_size(unsigned long node)
{
@@ -391,6 +408,7 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
check_cpu_feature_properties(node);
check_cpu_pa_features(node);
+ check_cpu_pkey_feature(node);
}
identical_pvr_fixup(node);
diff --git a/arch/powerpc/mm/pkeys.c b/arch/powerpc/mm/pkeys.c
index 3b221bd..5047371 100644
--- a/arch/powerpc/mm/pkeys.c
+++ b/arch/powerpc/mm/pkeys.c
@@ -26,6 +26,14 @@
#define PKEY_REG_BITS (sizeof(u64)*8)
#define pkeyshift(pkey) (PKEY_REG_BITS - ((pkey+1) * AMR_BITS_PER_PKEY))
+static inline bool pkey_mmu_enabled(void)
+{
+ if (firmware_has_feature(FW_FEATURE_LPAR))
+ return pkeys_total;
+ else
+ return cpu_has_feature(CPU_FTR_PKEY);
+}
+
void __init pkey_initialize(void)
{
int os_reserved, i;
@@ -46,14 +54,9 @@ void __init pkey_initialize(void)
__builtin_popcountl(ARCH_VM_PKEY_FLAGS >> VM_PKEY_SHIFT)
!= (sizeof(u64) * BITS_PER_BYTE));
- /*
- * Disable the pkey system till everything is in place. A subsequent
- * patch will enable it.
- */
- static_branch_enable(&pkey_disabled);
-
- /* Lets assume 32 keys */
- pkeys_total = 32;
+ /* Let's assume 32 keys if we are not told the number of pkeys. */
+ if (!pkeys_total)
+ pkeys_total = 32;
/*
* Adjust the upper limit, based on the number of bits supported by
@@ -62,11 +65,19 @@ void __init pkey_initialize(void)
pkeys_total = min_t(int, pkeys_total,
(ARCH_VM_PKEY_FLAGS >> VM_PKEY_SHIFT));
+ if (!pkey_mmu_enabled() || radix_enabled() || !pkeys_total)
+ static_branch_enable(&pkey_disabled);
+ else
+ static_branch_disable(&pkey_disabled);
+
+ if (static_branch_likely(&pkey_disabled))
+ return;
+
/*
- * Disable execute_disable support for now. A subsequent patch will
- * enable it.
+ * The device tree cannot be relied on for execute_disable support.
+ * Hence we depend on CPU FTR.
*/
- pkey_execute_disable_supported = false;
+ pkey_execute_disable_supported = cpu_has_feature(CPU_FTR_PKEY_EXECUTE);
#ifdef CONFIG_PPC_4K_PAGES
/*
--
1.7.1
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-11-06 8:59 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-06 8:56 [PATCH v9 00/51] powerpc, mm: Memory Protection Keys Ram Pai
2017-11-06 8:56 ` [PATCH v9 01/51] mm, powerpc, x86: define VM_PKEY_BITx bits if CONFIG_ARCH_HAS_PKEYS is enabled Ram Pai
2017-11-06 8:56 ` [PATCH v9 02/51] mm, powerpc, x86: introduce an additional vma bit for powerpc pkey Ram Pai
2017-11-06 8:56 ` [PATCH v9 03/51] powerpc: initial pkey plumbing Ram Pai
2017-11-06 8:56 ` [PATCH v9 04/51] powerpc: track allocation status of all pkeys Ram Pai
2017-11-06 8:56 ` [PATCH v9 05/51] powerpc: helper function to read,write AMR,IAMR,UAMOR registers Ram Pai
2017-11-06 8:56 ` [PATCH v9 06/51] powerpc: helper functions to initialize AMR, IAMR and UAMOR registers Ram Pai
2017-11-06 8:56 ` [PATCH v9 07/51] powerpc: cleanup AMR, IAMR when a key is allocated or freed Ram Pai
2017-11-06 8:57 ` [PATCH v9 08/51] powerpc: implementation for arch_set_user_pkey_access() Ram Pai
2017-11-06 8:57 ` [PATCH v9 09/51] powerpc: ability to create execute-disabled pkeys Ram Pai
2017-11-06 8:57 ` [PATCH v9 10/51] powerpc: store and restore the pkey state across context switches Ram Pai
2017-11-06 8:57 ` [PATCH v9 11/51] powerpc: introduce execute-only pkey Ram Pai
2017-11-06 8:57 ` [PATCH v9 12/51] powerpc: ability to associate pkey to a vma Ram Pai
2017-11-06 8:57 ` [PATCH v9 13/51] powerpc: implementation for arch_override_mprotect_pkey() Ram Pai
2017-11-06 8:57 ` [PATCH v9 14/51] powerpc: map vma key-protection bits to pte key bits Ram Pai
2017-11-06 8:57 ` [PATCH v9 15/51] powerpc: Program HPTE key protection bits Ram Pai
2017-11-06 8:57 ` [PATCH v9 16/51] powerpc: helper to validate key-access permissions of a pte Ram Pai
2017-11-06 8:57 ` [PATCH v9 17/51] powerpc: check key protection for user page access Ram Pai
2017-11-06 8:57 ` [PATCH v9 18/51] powerpc: implementation for arch_vma_access_permitted() Ram Pai
2017-11-06 8:57 ` [PATCH v9 19/51] powerpc: Handle exceptions caused by pkey violation Ram Pai
2017-11-06 8:57 ` [PATCH v9 20/51] powerpc: introduce get_mm_addr_key() helper Ram Pai
2017-11-06 8:57 ` [PATCH v9 21/51] powerpc: Deliver SEGV signal on pkey violation Ram Pai
2017-11-06 8:57 ` [PATCH v9 22/51] powerpc/ptrace: Add memory protection key regset Ram Pai
2017-11-06 8:57 ` Ram Pai [this message]
2017-11-13 0:54 ` [PATCH v9 23/51] powerpc: Enable pkey subsystem Ram Pai
2017-11-06 8:57 ` [PATCH v9 24/51] powerpc: sys_pkey_alloc() and sys_pkey_free() system calls Ram Pai
2017-11-06 8:57 ` [PATCH v9 25/51] powerpc: sys_pkey_mprotect() system call Ram Pai
2017-11-06 8:57 ` [PATCH v9 26/51] powerpc: add sys_pkey_modify() " Ram Pai
2017-11-06 8:57 ` [PATCH v9 27/51] mm, x86 : introduce arch_pkeys_enabled() Ram Pai
2017-11-06 8:57 ` [PATCH v9 28/51] mm: display pkey in smaps if arch_pkeys_enabled() is true Ram Pai
2017-11-06 8:57 ` [PATCH v9 29/51] mm/mprotect, powerpc/mm/pkeys, x86/mm/pkeys: Add sysfs interface Ram Pai
2017-12-18 18:54 ` Dave Hansen
2017-12-18 22:18 ` Ram Pai
2017-12-18 22:28 ` Dave Hansen
2017-12-18 23:15 ` Ram Pai
2017-12-19 8:31 ` Gabriel Paubert
2017-12-19 16:22 ` Ram Pai
2017-12-19 21:34 ` Benjamin Herrenschmidt
2017-12-20 17:50 ` Ram Pai
2017-12-20 22:49 ` Benjamin Herrenschmidt
2017-12-19 10:50 ` Michael Ellerman
2017-12-19 16:32 ` Ram Pai
2017-11-06 8:57 ` [PATCH v9 30/51] Documentation/x86: Move protecton key documentation to arch neutral directory Ram Pai
2017-11-06 8:57 ` [PATCH v9 31/51] Documentation/vm: PowerPC specific updates to memory protection keys Ram Pai
2017-11-06 8:57 ` [PATCH v9 32/51] selftest/x86: Move protecton key selftest to arch neutral directory Ram Pai
2017-11-06 8:57 ` [PATCH v9 33/51] selftest/vm: rename all references to pkru to a generic name Ram Pai
2017-11-06 8:57 ` [PATCH v9 34/51] selftest/vm: move generic definitions to header file Ram Pai
2017-11-06 8:57 ` [PATCH v9 35/51] selftest/vm: typecast the pkey register Ram Pai
2017-11-06 8:57 ` [PATCH v9 36/51] selftest/vm: generic function to handle shadow key register Ram Pai
2017-11-06 8:57 ` [PATCH v9 37/51] selftest/vm: fix the wrong assert in pkey_disable_set() Ram Pai
2017-11-06 8:57 ` [PATCH v9 38/51] selftest/vm: fixed bugs in pkey_disable_clear() Ram Pai
2017-11-06 8:57 ` [PATCH v9 39/51] selftest/vm: clear the bits in shadow reg when a pkey is freed Ram Pai
2017-11-06 8:57 ` [PATCH v9 40/51] selftest/vm: fix alloc_random_pkey() to make it really random Ram Pai
2017-11-06 8:57 ` [PATCH v9 41/51] selftest/vm: introduce two arch independent abstraction Ram Pai
2017-11-06 8:57 ` [PATCH v9 42/51] selftest/vm: pkey register should match shadow pkey Ram Pai
2017-11-06 8:57 ` [PATCH v9 43/51] selftest/vm: generic cleanup Ram Pai
2017-11-06 8:57 ` [PATCH v9 44/51] selftest/vm: powerpc implementation for generic abstraction Ram Pai
2017-11-09 18:47 ` Breno Leitao
2017-11-09 23:37 ` Ram Pai
2017-11-10 11:36 ` Breno Leitao
2017-11-06 8:57 ` [PATCH v9 45/51] selftest/vm: fix an assertion in test_pkey_alloc_exhaust() Ram Pai
2017-11-06 8:57 ` [PATCH v9 46/51] selftest/vm: associate key on a mapped page and detect access violation Ram Pai
2017-11-06 8:57 ` [PATCH v9 47/51] selftest/vm: associate key on a mapped page and detect write violation Ram Pai
2017-11-06 8:57 ` [PATCH v9 48/51] selftest/vm: detect write violation on a mapped access-denied-key page Ram Pai
2017-11-06 8:57 ` [PATCH v9 49/51] selftest/vm: sub-page allocator Ram Pai
2017-11-06 8:57 ` [PATCH v9 50/51] selftests/powerpc: Add ptrace tests for Protection Key register Ram Pai
2017-11-06 8:57 ` [PATCH v9 51/51] selftests/powerpc: Add core file test " Ram Pai
2017-11-06 21:28 ` [PATCH v9 00/51] powerpc, mm: Memory Protection Keys Florian Weimer
2017-11-07 1:22 ` Ram Pai
2017-11-07 7:32 ` Florian Weimer
2017-11-07 22:39 ` Ram Pai
2017-11-07 22:47 ` Dave Hansen
2017-11-07 23:44 ` Ram Pai
2017-11-09 22:23 ` Ram Pai
2017-11-10 18:10 ` Christophe LEROY
2017-11-12 20:45 ` Ram Pai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1509958663-18737-24-git-send-email-linuxram@us.ibm.com \
--to=linuxram@us.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=arnd@arndb.de \
--cc=bauerman@linux.vnet.ibm.com \
--cc=benh@kernel.crashing.org \
--cc=bsingharora@gmail.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=ebiederm@xmission.com \
--cc=hbabu@us.ibm.com \
--cc=khandual@linux.vnet.ibm.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mhocko@kernel.org \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).