11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2ba180fd437156f7fd8cfb2fdd021d949eeef08d6Jeff Dike * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Licensed under the GPL
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __UM_MMU_CONTEXT_H
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __UM_MMU_CONTEXT_H
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
94dc706c2f292b2c28016a27f400af84a62ec4a63Al Viro#include <linux/sched.h>
104dc706c2f292b2c28016a27f400af84a62ec4a63Al Viro#include <asm/mmu.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viroextern void uml_setup_stubs(struct mm_struct *mm);
133963333fe6767f15141ab2dc3b933721c636c212Jeff Dikeextern void arch_exit_mmap(struct mm_struct *mm);
143963333fe6767f15141ab2dc3b933721c636c212Jeff Dike
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define deactivate_mm(tsk,mm)	do { } while (0)
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17c40504e87e28c52258458a53fefcd63f58e11a42Benjamin LaHaiseextern void force_flush_all(void);
18c40504e87e28c52258458a53fefcd63f58e11a42Benjamin LaHaise
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void activate_mm(struct mm_struct *old, struct mm_struct *new)
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
211e40cd383ccc7c9f8b338c56ce28c326e25eb2fePaolo 'Blaisorblade' Giarrusso	/*
22aab2545fdd6641b76af0ae96456c4ca9d1e50dadOleg Nesterov	 * This is called by fs/exec.c and sys_unshare()
23aab2545fdd6641b76af0ae96456c4ca9d1e50dadOleg Nesterov	 * when the new ->mm is used for the first time.
241e40cd383ccc7c9f8b338c56ce28c326e25eb2fePaolo 'Blaisorblade' Giarrusso	 */
25aab2545fdd6641b76af0ae96456c4ca9d1e50dadOleg Nesterov	__switch_mm(&new->context.id);
26ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro	down_write(&new->mmap_sem);
27ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro	uml_setup_stubs(new);
28ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro	up_write(&new->mmap_sem);
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     struct task_struct *tsk)
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned cpu = smp_processor_id();
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(prev != next){
37fa40699b975131028a61aa8e095b0b17f350da40Rusty Russell		cpumask_clear_cpu(cpu, mm_cpumask(prev));
38fa40699b975131028a61aa8e095b0b17f350da40Rusty Russell		cpumask_set_cpu(cpu, mm_cpumask(next));
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(next != &init_mm)
406c738ffa9fea6869f5d51882dfefbba746e432b1Jeff Dike			__switch_mm(&next->context.id);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Virostatic inline void arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
45ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro{
46ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro	uml_setup_stubs(mm);
47ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro}
48ac2aca2817ca10ad30f86d0d3caa41ea8cc4f0f0Al Viro
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void enter_lazy_tlb(struct mm_struct *mm,
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				  struct task_struct *tsk)
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5477bf4400319db9d2a8af6b00c2be6faa0f3d07cbJeff Dikeextern int init_new_context(struct task_struct *task, struct mm_struct *mm);
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5677bf4400319db9d2a8af6b00c2be6faa0f3d07cbJeff Dikeextern void destroy_context(struct mm_struct *mm);
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
59