tlbflush.h
来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 159 行
H
159 行
#ifndef _ALPHA_TLBFLUSH_H#define _ALPHA_TLBFLUSH_H#include <linux/config.h>#include <linux/mm.h>#include <asm/compiler.h>#ifndef __EXTERN_INLINE#define __EXTERN_INLINE extern inline#define __MMU_EXTERN_INLINE#endifextern void __load_new_mm_context(struct mm_struct *);/* Use a few helper functions to hide the ugly broken ASN numbers on early Alphas (ev4 and ev45). */__EXTERN_INLINE voidev4_flush_tlb_current(struct mm_struct *mm){ __load_new_mm_context(mm); tbiap();}__EXTERN_INLINE voidev5_flush_tlb_current(struct mm_struct *mm){ __load_new_mm_context(mm);}/* Flush just one page in the current TLB set. We need to be very careful about the icache here, there is no way to invalidate a specific icache page. */__EXTERN_INLINE voidev4_flush_tlb_current_page(struct mm_struct * mm, struct vm_area_struct *vma, unsigned long addr){ int tbi_flag = 2; if (vma->vm_flags & VM_EXEC) { __load_new_mm_context(mm); tbi_flag = 3; } tbi(tbi_flag, addr);}__EXTERN_INLINE voidev5_flush_tlb_current_page(struct mm_struct * mm, struct vm_area_struct *vma, unsigned long addr){ if (vma->vm_flags & VM_EXEC) __load_new_mm_context(mm); else tbi(2, addr);}#ifdef CONFIG_ALPHA_GENERIC# define flush_tlb_current alpha_mv.mv_flush_tlb_current# define flush_tlb_current_page alpha_mv.mv_flush_tlb_current_page#else# ifdef CONFIG_ALPHA_EV4# define flush_tlb_current ev4_flush_tlb_current# define flush_tlb_current_page ev4_flush_tlb_current_page# else# define flush_tlb_current ev5_flush_tlb_current# define flush_tlb_current_page ev5_flush_tlb_current_page# endif#endif#ifdef __MMU_EXTERN_INLINE#undef __EXTERN_INLINE#undef __MMU_EXTERN_INLINE#endif/* Flush current user mapping. */static inline voidflush_tlb(void){ flush_tlb_current(current->active_mm);}/* Flush someone else's user mapping. */static inline voidflush_tlb_other(struct mm_struct *mm){ unsigned long *mmc = &mm->context[smp_processor_id()]; /* Check it's not zero first to avoid cacheline ping pong when possible. */ if (*mmc) *mmc = 0;}/* Flush a specified range of user mapping page tables from TLB. Although Alpha uses VPTE caches, this can be a nop, as Alpha does not have finegrained tlb flushing, so it will flush VPTE stuff during next flush_tlb_range. */static inline voidflush_tlb_pgtables(struct mm_struct *mm, unsigned long start, unsigned long end){}#ifndef CONFIG_SMP/* Flush everything (kernel mapping may also have changed due to vmalloc/vfree). */static inline void flush_tlb_all(void){ tbia();}/* Flush a specified user mapping. */static inline voidflush_tlb_mm(struct mm_struct *mm){ if (mm == current->active_mm) flush_tlb_current(mm); else flush_tlb_other(mm);}/* Page-granular tlb flush. */static inline voidflush_tlb_page(struct vm_area_struct *vma, unsigned long addr){ struct mm_struct *mm = vma->vm_mm; if (mm == current->active_mm) flush_tlb_current_page(mm, vma, addr); else flush_tlb_other(mm);}/* Flush a specified range of user mapping. On the Alpha we flush the whole user tlb. */static inline voidflush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end){ flush_tlb_mm(vma->vm_mm);}#else /* CONFIG_SMP */extern void flush_tlb_all(void);extern void flush_tlb_mm(struct mm_struct *);extern void flush_tlb_page(struct vm_area_struct *, unsigned long);extern void flush_tlb_range(struct vm_area_struct *, unsigned long, unsigned long);#endif /* CONFIG_SMP */#define flush_tlb_kernel_range(start, end) flush_tlb_all()#endif /* _ALPHA_TLBFLUSH_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?