1#ifndef _ASM_SCORE_TLBFLUSH_H 2#define _ASM_SCORE_TLBFLUSH_H 3 4#include <linux/mm.h> 5 6/* 7 * TLB flushing: 8 * 9 * - flush_tlb_all() flushes all processes TLB entries 10 * - flush_tlb_mm(mm) flushes the specified mm context TLB entries 11 * - flush_tlb_page(vma, vmaddr) flushes one page 12 * - flush_tlb_range(vma, start, end) flushes a range of pages 13 * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages 14 */ 15extern void local_flush_tlb_all(void); 16extern void local_flush_tlb_mm(struct mm_struct *mm); 17extern void local_flush_tlb_range(struct vm_area_struct *vma, 18 unsigned long start, unsigned long end); 19extern void local_flush_tlb_kernel_range(unsigned long start, 20 unsigned long end); 21extern void local_flush_tlb_page(struct vm_area_struct *vma, 22 unsigned long page); 23extern void local_flush_tlb_one(unsigned long vaddr); 24 25#define flush_tlb_all() local_flush_tlb_all() 26#define flush_tlb_mm(mm) local_flush_tlb_mm(mm) 27#define flush_tlb_range(vma, vmaddr, end) \ 28 local_flush_tlb_range(vma, vmaddr, end) 29#define flush_tlb_kernel_range(vmaddr, end) \ 30 local_flush_tlb_kernel_range(vmaddr, end) 31#define flush_tlb_page(vma, page) local_flush_tlb_page(vma, page) 32#define flush_tlb_one(vaddr) local_flush_tlb_one(vaddr) 33 34#ifndef __ASSEMBLY__ 35 36static inline unsigned long pevn_get(void) 37{ 38 unsigned long val; 39 40 __asm__ __volatile__( 41 "mfcr %0, cr11\n" 42 "nop\nnop\n" 43 : "=r" (val)); 44 45 return val; 46} 47 48static inline void pevn_set(unsigned long val) 49{ 50 __asm__ __volatile__( 51 "mtcr %0, cr11\n" 52 "nop\nnop\nnop\nnop\nnop\n" 53 : : "r" (val)); 54} 55 56static inline void pectx_set(unsigned long val) 57{ 58 __asm__ __volatile__( 59 "mtcr %0, cr12\n" 60 "nop\nnop\nnop\nnop\nnop\n" 61 : : "r" (val)); 62} 63 64static inline unsigned long pectx_get(void) 65{ 66 unsigned long val; 67 __asm__ __volatile__( 68 "mfcr %0, cr12\n" 69 "nop\nnop\n" 70 : "=r" (val)); 71 return val; 72} 73static inline unsigned long tlblock_get(void) 74{ 75 unsigned long val; 76 77 __asm__ __volatile__( 78 "mfcr %0, cr7\n" 79 "nop\nnop\n" 80 : "=r" (val)); 81 return val; 82} 83static inline void tlblock_set(unsigned long val) 84{ 85 __asm__ __volatile__( 86 "mtcr %0, cr7\n" 87 "nop\nnop\nnop\nnop\nnop\n" 88 : : "r" (val)); 89} 90 91static inline void tlbpt_set(unsigned long val) 92{ 93 __asm__ __volatile__( 94 "mtcr %0, cr8\n" 95 "nop\nnop\nnop\nnop\nnop\n" 96 : : "r" (val)); 97} 98 99static inline long tlbpt_get(void) 100{ 101 long val; 102 103 __asm__ __volatile__( 104 "mfcr %0, cr8\n" 105 "nop\nnop\n" 106 : "=r" (val)); 107 108 return val; 109} 110 111static inline void peaddr_set(unsigned long val) 112{ 113 __asm__ __volatile__( 114 "mtcr %0, cr9\n" 115 "nop\nnop\nnop\nnop\nnop\n" 116 : : "r" (val)); 117} 118 119/* TLB operations. */ 120static inline void tlb_probe(void) 121{ 122 __asm__ __volatile__("stlb;nop;nop;nop;nop;nop"); 123} 124 125static inline void tlb_read(void) 126{ 127 __asm__ __volatile__("mftlb;nop;nop;nop;nop;nop"); 128} 129 130static inline void tlb_write_indexed(void) 131{ 132 __asm__ __volatile__("mtptlb;nop;nop;nop;nop;nop"); 133} 134 135static inline void tlb_write_random(void) 136{ 137 __asm__ __volatile__("mtrtlb;nop;nop;nop;nop;nop"); 138} 139 140#endif /* Not __ASSEMBLY__ */ 141 142#endif /* _ASM_SCORE_TLBFLUSH_H */ 143