18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef __UM_MMU_CONTEXT_H 78c2ecf20Sopenharmony_ci#define __UM_MMU_CONTEXT_H 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/sched.h> 108c2ecf20Sopenharmony_ci#include <linux/mm_types.h> 118c2ecf20Sopenharmony_ci#include <linux/mmap_lock.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <asm/mmu.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciextern void uml_setup_stubs(struct mm_struct *mm); 168c2ecf20Sopenharmony_ci/* 178c2ecf20Sopenharmony_ci * Needed since we do not use the asm-generic/mm_hooks.h: 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_cistatic inline int arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci uml_setup_stubs(mm); 228c2ecf20Sopenharmony_ci return 0; 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ciextern void arch_exit_mmap(struct mm_struct *mm); 258c2ecf20Sopenharmony_cistatic inline void arch_unmap(struct mm_struct *mm, 268c2ecf20Sopenharmony_ci unsigned long start, unsigned long end) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_cistatic inline bool arch_vma_access_permitted(struct vm_area_struct *vma, 308c2ecf20Sopenharmony_ci bool write, bool execute, bool foreign) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci /* by default, allow everything */ 338c2ecf20Sopenharmony_ci return true; 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/* 378c2ecf20Sopenharmony_ci * end asm-generic/mm_hooks.h functions 388c2ecf20Sopenharmony_ci */ 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define deactivate_mm(tsk,mm) do { } while (0) 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciextern void force_flush_all(void); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic inline void activate_mm(struct mm_struct *old, struct mm_struct *new) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci /* 478c2ecf20Sopenharmony_ci * This is called by fs/exec.c and sys_unshare() 488c2ecf20Sopenharmony_ci * when the new ->mm is used for the first time. 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_ci __switch_mm(&new->context.id); 518c2ecf20Sopenharmony_ci mmap_write_lock_nested(new, SINGLE_DEPTH_NESTING); 528c2ecf20Sopenharmony_ci uml_setup_stubs(new); 538c2ecf20Sopenharmony_ci mmap_write_unlock(new); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistatic inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, 578c2ecf20Sopenharmony_ci struct task_struct *tsk) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci unsigned cpu = smp_processor_id(); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if(prev != next){ 628c2ecf20Sopenharmony_ci cpumask_clear_cpu(cpu, mm_cpumask(prev)); 638c2ecf20Sopenharmony_ci cpumask_set_cpu(cpu, mm_cpumask(next)); 648c2ecf20Sopenharmony_ci if(next != &init_mm) 658c2ecf20Sopenharmony_ci __switch_mm(&next->context.id); 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci} 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistatic inline void enter_lazy_tlb(struct mm_struct *mm, 708c2ecf20Sopenharmony_ci struct task_struct *tsk) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci} 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ciextern int init_new_context(struct task_struct *task, struct mm_struct *mm); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciextern void destroy_context(struct mm_struct *mm); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#endif 79