powerpc: initial pkey plumbing
authorRam Pai <linuxram@us.ibm.com>
Fri, 19 Jan 2018 01:50:24 +0000 (17:50 -0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Sat, 20 Jan 2018 10:45:03 +0000 (21:45 +1100)
Basic  plumbing  to   initialize  the   pkey  system.
Nothing is enabled yet. A later patch will enable it
once all the infrastructure is in place.

Signed-off-by: Ram Pai <linuxram@us.ibm.com>
[mpe: Rework copyrights to use SPDX tags]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/Kconfig
arch/powerpc/include/asm/mmu_context.h
arch/powerpc/include/asm/pkeys.h [new file with mode: 0644]
arch/powerpc/mm/Makefile
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/pkeys.c [new file with mode: 0644]

index c51e6ce42e7a258d20b76f8331c6a8156ffda4b6..c9660a18c093fd9ab88fc5a0b69af786eba00df7 100644 (file)
@@ -867,6 +867,21 @@ config SECCOMP
 
          If unsure, say Y. Only embedded should say N here.
 
+config PPC_MEM_KEYS
+       prompt "PowerPC Memory Protection Keys"
+       def_bool y
+       depends on PPC_BOOK3S_64
+       select ARCH_USES_HIGH_VMA_FLAGS
+       select ARCH_HAS_PKEYS
+       help
+         Memory Protection Keys provides a mechanism for enforcing
+         page-based protections, but without requiring modification of the
+         page tables when an application changes protection domains.
+
+         For details, see Documentation/vm/protection-keys.txt
+
+         If unsure, say y.
+
 endmenu
 
 config ISA_DMA_API
index 6177d43f0ce8afa9c1f6a1101e92ba161e47d97a..fb5e6a3ce12709a1a8ce1c90111e5b4d7999b752 100644 (file)
@@ -192,5 +192,6 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
        /* by default, allow everything */
        return true;
 }
+
 #endif /* __KERNEL__ */
 #endif /* __ASM_POWERPC_MMU_CONTEXT_H */
diff --git a/arch/powerpc/include/asm/pkeys.h b/arch/powerpc/include/asm/pkeys.h
new file mode 100644 (file)
index 0000000..dadea7d
--- /dev/null
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * PowerPC Memory Protection Keys management
+ *
+ * Copyright 2017, Ram Pai, IBM Corporation.
+ */
+
+#ifndef _ASM_POWERPC_KEYS_H
+#define _ASM_POWERPC_KEYS_H
+
+#include <linux/jump_label.h>
+
+DECLARE_STATIC_KEY_TRUE(pkey_disabled);
+#define ARCH_VM_PKEY_FLAGS 0
+
+static inline bool mm_pkey_is_allocated(struct mm_struct *mm, int pkey)
+{
+       return false;
+}
+
+static inline int mm_pkey_alloc(struct mm_struct *mm)
+{
+       return -1;
+}
+
+static inline int mm_pkey_free(struct mm_struct *mm, int pkey)
+{
+       return -EINVAL;
+}
+
+/*
+ * Try to dedicate one of the protection keys to be used as an
+ * execute-only protection key.
+ */
+static inline int execute_only_pkey(struct mm_struct *mm)
+{
+       return 0;
+}
+
+static inline int arch_override_mprotect_pkey(struct vm_area_struct *vma,
+                                             int prot, int pkey)
+{
+       return 0;
+}
+
+static inline int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
+                                           unsigned long init_val)
+{
+       return 0;
+}
+#endif /*_ASM_POWERPC_KEYS_H */
index 8d271bfe2d94815be7f8792133f24711cf1d63f2..f06f3577d8d1e83fe23e34e8771a8041a7f76b86 100644 (file)
@@ -44,3 +44,4 @@ obj-$(CONFIG_PPC_COPRO_BASE)  += copro_fault.o
 obj-$(CONFIG_SPAPR_TCE_IOMMU)  += mmu_context_iommu.o
 obj-$(CONFIG_PPC_PTDUMP)       += dump_linuxpagetables.o
 obj-$(CONFIG_PPC_HTDUMP)       += dump_hashpagetable.o
+obj-$(CONFIG_PPC_MEM_KEYS)     += pkeys.o
index 64e704eefad1e36a654a89095cba93e61a889d3c..8cd31ea9b2438cc6c103a85b25870d85cd2199b3 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/memblock.h>
 #include <linux/context_tracking.h>
 #include <linux/libfdt.h>
+#include <linux/pkeys.h>
 
 #include <asm/debugfs.h>
 #include <asm/processor.h>
diff --git a/arch/powerpc/mm/pkeys.c b/arch/powerpc/mm/pkeys.c
new file mode 100644 (file)
index 0000000..a11afba
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * PowerPC Memory Protection Keys management
+ *
+ * Copyright 2017, Ram Pai, IBM Corporation.
+ */
+
+#include <linux/pkeys.h>
+
+DEFINE_STATIC_KEY_TRUE(pkey_disabled);
+bool pkey_execute_disable_supported;
+
+int pkey_initialize(void)
+{
+       /*
+        * Disable the pkey system till everything is in place. A subsequent
+        * patch will enable it.
+        */
+       static_branch_enable(&pkey_disabled);
+
+       /*
+        * Disable execute_disable support for now. A subsequent patch will
+        * enable it.
+        */
+       pkey_execute_disable_supported = false;
+       return 0;
+}
+
+arch_initcall(pkey_initialize);