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