|
|
@@ -178,6 +178,10 @@ static inline void switch_ldt(struct mm_struct *prev, struct mm_struct *next)
|
|
|
|
|
|
void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk);
|
|
|
|
|
|
+/*
|
|
|
+ * Init a new mm. Used on mm copies, like at fork()
|
|
|
+ * and on mm's that are brand-new, like at execve().
|
|
|
+ */
|
|
|
static inline int init_new_context(struct task_struct *tsk,
|
|
|
struct mm_struct *mm)
|
|
|
{
|
|
|
@@ -228,8 +232,22 @@ do { \
|
|
|
} while (0)
|
|
|
#endif
|
|
|
|
|
|
+static inline void arch_dup_pkeys(struct mm_struct *oldmm,
|
|
|
+ struct mm_struct *mm)
|
|
|
+{
|
|
|
+#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
|
|
|
+ if (!cpu_feature_enabled(X86_FEATURE_OSPKE))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* Duplicate the oldmm pkey state in mm: */
|
|
|
+ mm->context.pkey_allocation_map = oldmm->context.pkey_allocation_map;
|
|
|
+ mm->context.execute_only_pkey = oldmm->context.execute_only_pkey;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static inline int arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
|
|
|
{
|
|
|
+ arch_dup_pkeys(oldmm, mm);
|
|
|
paravirt_arch_dup_mmap(oldmm, mm);
|
|
|
return ldt_dup_context(oldmm, mm);
|
|
|
}
|