|
@@ -66,8 +66,8 @@ activate_l1stack(struct mm_struct *mm, unsigned long sp_base)
|
|
|
|
|
|
#define activate_mm(prev, next) switch_mm(prev, next, NULL)
|
|
|
|
|
|
-static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
|
|
|
- struct task_struct *tsk)
|
|
|
+static inline void __switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
|
|
|
+ struct task_struct *tsk)
|
|
|
{
|
|
|
#ifdef CONFIG_MPU
|
|
|
unsigned int cpu = smp_processor_id();
|
|
@@ -95,7 +95,24 @@ static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_m
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_IPIPE
|
|
|
+#define lock_mm_switch(flags) local_irq_save_hw_cond(flags)
|
|
|
+#define unlock_mm_switch(flags) local_irq_restore_hw_cond(flags)
|
|
|
+#else
|
|
|
+#define lock_mm_switch(flags) do { (void)(flags); } while (0)
|
|
|
+#define unlock_mm_switch(flags) do { (void)(flags); } while (0)
|
|
|
+#endif /* CONFIG_IPIPE */
|
|
|
+
|
|
|
#ifdef CONFIG_MPU
|
|
|
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|
|
+ struct task_struct *tsk)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ lock_mm_switch(flags);
|
|
|
+ __switch_mm(prev, next, tsk);
|
|
|
+ unlock_mm_switch(flags);
|
|
|
+}
|
|
|
+
|
|
|
static inline void protect_page(struct mm_struct *mm, unsigned long addr,
|
|
|
unsigned long flags)
|
|
|
{
|
|
@@ -128,6 +145,12 @@ static inline void update_protections(struct mm_struct *mm)
|
|
|
set_mask_dcplbs(mm->context.page_rwx_mask, cpu);
|
|
|
}
|
|
|
}
|
|
|
+#else /* !CONFIG_MPU */
|
|
|
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|
|
+ struct task_struct *tsk)
|
|
|
+{
|
|
|
+ __switch_mm(prev, next, tsk);
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
|
@@ -173,4 +196,10 @@ static inline void destroy_context(struct mm_struct *mm)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+#define ipipe_mm_switch_protect(flags) \
|
|
|
+ local_irq_save_hw_cond(flags)
|
|
|
+
|
|
|
+#define ipipe_mm_switch_unprotect(flags) \
|
|
|
+ local_irq_restore_hw_cond(flags)
|
|
|
+
|
|
|
#endif
|