mmu_context.h

来自「linux 内核源代码」· C头文件 代码 · 共 137 行

H
137
字号
/* * include/asm-xtensa/mmu_context.h * * Switch an MMU context. * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2001 - 2005 Tensilica Inc. */#ifndef _XTENSA_MMU_CONTEXT_H#define _XTENSA_MMU_CONTEXT_H#include <linux/stringify.h>#include <linux/sched.h>#include <asm/pgtable.h>#include <asm/cacheflush.h>#include <asm/tlbflush.h>#include <asm-generic/mm_hooks.h>#define XCHAL_MMU_ASID_BITS	8#if (XCHAL_HAVE_TLBS != 1)# error "Linux must have an MMU!"#endifextern unsigned long asid_cache;/* * NO_CONTEXT is the invalid ASID value that we don't ever assign to * any user or kernel context. * * 0 invalid * 1 kernel * 2 reserved * 3 reserved * 4...255 available */#define NO_CONTEXT	0#define ASID_USER_FIRST	4#define ASID_MASK	((1 << XCHAL_MMU_ASID_BITS) - 1)#define ASID_INSERT(x)	(0x03020001 | (((x) & ASID_MASK) << 8))static inline void set_rasid_register (unsigned long val){	__asm__ __volatile__ (" wsr %0, "__stringify(RASID)"\n\t"			      " isync\n" : : "a" (val));}static inline unsigned long get_rasid_register (void){	unsigned long tmp;	__asm__ __volatile__ (" rsr %0,"__stringify(RASID)"\n\t" : "=a" (tmp));	return tmp;}static inline void__get_new_mmu_context(struct mm_struct *mm){	extern void flush_tlb_all(void);	if (! (++asid_cache & ASID_MASK) ) {		flush_tlb_all(); /* start new asid cycle */		asid_cache += ASID_USER_FIRST;	}	mm->context = asid_cache;}static inline void__load_mmu_context(struct mm_struct *mm){	set_rasid_register(ASID_INSERT(mm->context));	invalidate_page_directory();}/* * Initialize the context related info for a new mm_struct * instance. */static inline intinit_new_context(struct task_struct *tsk, struct mm_struct *mm){	mm->context = NO_CONTEXT;	return 0;}/* * After we have set current->mm to a new value, this activates * the context for the new mm so we see the new mappings. */static inline voidactivate_mm(struct mm_struct *prev, struct mm_struct *next){	/* Unconditionally get a new ASID.  */	__get_new_mmu_context(next);	__load_mmu_context(next);}static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,                             struct task_struct *tsk){	unsigned long asid = asid_cache;	/* Check if our ASID is of an older version and thus invalid */	if (next->context == NO_CONTEXT || ((next->context^asid) & ~ASID_MASK))		__get_new_mmu_context(next);	__load_mmu_context(next);}#define deactivate_mm(tsk, mm)	do { } while(0)/* * Destroy context related info for an mm_struct that is about * to be put to rest. */static inline void destroy_context(struct mm_struct *mm){	invalidate_page_directory();}static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk){	/* Nothing to do. */}#endif /* _XTENSA_MMU_CONTEXT_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?