powerpc: Add framework for Kernel Userspace Protection
authorChristophe Leroy <christophe.leroy@c-s.fr>
Thu, 18 Apr 2019 06:51:18 +0000 (16:51 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 21 Apr 2019 13:05:54 +0000 (23:05 +1000)
This patch adds a skeleton for Kernel Userspace Protection
functionnalities like Kernel Userspace Access Protection and Kernel
Userspace Execution Prevention

The subsequent implementation of KUAP for radix makes use of a MMU
feature in order to patch out assembly when KUAP is disabled or
unsupported. This won't work unless there's an entry point for KUP
support before the feature magic happens, so for PPC64 setup_kup() is
called early in setup.

On PPC32, feature_fixup() is done too early to allow the same.

Suggested-by: Russell Currey <ruscur@russell.cc>
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/kup.h [new file with mode: 0644]
arch/powerpc/kernel/setup_64.c
arch/powerpc/mm/init-common.c
arch/powerpc/mm/init_32.c

diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h
new file mode 100644 (file)
index 0000000..7a88b8b
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_POWERPC_KUP_H_
+#define _ASM_POWERPC_KUP_H_
+
+#ifndef __ASSEMBLY__
+
+void setup_kup(void);
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* _ASM_POWERPC_KUP_H_ */
index ba404dd9ce1d88809e0a6e70f0decc286caf576a..6179c42003399e47023a5c001c25c5e66db0282d 100644 (file)
@@ -68,6 +68,7 @@
 #include <asm/cputhreads.h>
 #include <asm/hw_irq.h>
 #include <asm/feature-fixups.h>
+#include <asm/kup.h>
 
 #include "setup.h"
 
@@ -331,6 +332,12 @@ void __init early_setup(unsigned long dt_ptr)
         */
        configure_exceptions();
 
+       /*
+        * Configure Kernel Userspace Protection. This needs to happen before
+        * feature fixups for platforms that implement this using features.
+        */
+       setup_kup();
+
        /* Apply all the dynamic patching */
        apply_feature_fixups();
        setup_feature_keys();
index 1e6910eb70ed1ab56cb5ea1ad41b7cef93fd7e73..36d28e87228985982577c71dff2f14626a9f6688 100644 (file)
 #include <linux/string.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
+#include <asm/kup.h>
+
+void __init setup_kup(void)
+{
+}
 
 #define CTOR(shift) static void ctor_##shift(void *addr) \
 {                                                      \
index 41a3513cadc907a48cb27e4d1e97638421510377..80cc97cd88782ef376e8e9d8a47017c4b7ff610c 100644 (file)
@@ -45,6 +45,7 @@
 #include <asm/tlb.h>
 #include <asm/sections.h>
 #include <asm/hugetlb.h>
+#include <asm/kup.h>
 
 #include "mmu_decl.h"
 
@@ -178,6 +179,8 @@ void __init MMU_init(void)
        btext_unmap();
 #endif
 
+       setup_kup();
+
        /* Shortly after that, the entire linear mapping will be available */
        memblock_set_current_limit(lowmem_end_addr);
 }