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