16bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#ifndef _ASM_SCORE_TLBFLUSH_H 26bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define _ASM_SCORE_TLBFLUSH_H 36bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 46bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#include <linux/mm.h> 56bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 66bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/* 76bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * TLB flushing: 86bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * 96bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_all() flushes all processes TLB entries 106bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_mm(mm) flushes the specified mm context TLB entries 116bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_page(vma, vmaddr) flushes one page 126bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_range(vma, start, end) flushes a range of pages 136bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages 146bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */ 156bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_all(void); 166bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_mm(struct mm_struct *mm); 176bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_range(struct vm_area_struct *vma, 186bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long start, unsigned long end); 196bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_kernel_range(unsigned long start, 206bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long end); 216bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_page(struct vm_area_struct *vma, 226bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long page); 236bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_one(unsigned long vaddr); 246bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 256bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_all() local_flush_tlb_all() 266bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_mm(mm) local_flush_tlb_mm(mm) 276bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_range(vma, vmaddr, end) \ 286bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin local_flush_tlb_range(vma, vmaddr, end) 296bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_kernel_range(vmaddr, end) \ 306bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin local_flush_tlb_kernel_range(vmaddr, end) 316bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_page(vma, page) local_flush_tlb_page(vma, page) 326bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_one(vaddr) local_flush_tlb_one(vaddr) 336bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 346bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#ifndef __ASSEMBLY__ 356bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 366bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long pevn_get(void) 376bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 386bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long val; 396bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 406bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 416bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mfcr %0, cr11\n" 426bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\n" 436bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : "=r" (val)); 446bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 456bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin return val; 466bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 476bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 486bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void pevn_set(unsigned long val) 496bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 506bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 516bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mtcr %0, cr11\n" 526bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\nnop\nnop\nnop\n" 536bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : : "r" (val)); 546bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 556bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 566bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void pectx_set(unsigned long val) 576bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 586bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 596bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mtcr %0, cr12\n" 606bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\nnop\nnop\nnop\n" 616bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : : "r" (val)); 626bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 636bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 646bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long pectx_get(void) 656bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 666bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long val; 676bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 686bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mfcr %0, cr12\n" 696bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\n" 706bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : "=r" (val)); 716bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin return val; 726bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 736bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long tlblock_get(void) 746bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 756bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin unsigned long val; 766bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 776bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 786bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mfcr %0, cr7\n" 796bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\n" 806bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : "=r" (val)); 816bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin return val; 826bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 836bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlblock_set(unsigned long val) 846bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 856bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 866bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mtcr %0, cr7\n" 876bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\nnop\nnop\nnop\n" 886bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : : "r" (val)); 896bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 906bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 916bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlbpt_set(unsigned long val) 926bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 936bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 946bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mtcr %0, cr8\n" 956bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\nnop\nnop\nnop\n" 966bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : : "r" (val)); 976bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 986bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 996bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline long tlbpt_get(void) 1006bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1016bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin long val; 1026bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1036bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 1046bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mfcr %0, cr8\n" 1056bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\n" 1066bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : "=r" (val)); 1076bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1086bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin return val; 1096bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1106bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1116bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void peaddr_set(unsigned long val) 1126bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1136bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__( 1146bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "mtcr %0, cr9\n" 1156bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin "nop\nnop\nnop\nnop\nnop\n" 1166bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin : : "r" (val)); 1176bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1186bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1196bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/* TLB operations. */ 1206bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_probe(void) 1216bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1226bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__("stlb;nop;nop;nop;nop;nop"); 1236bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1246bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1256bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_read(void) 1266bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1276bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__("mftlb;nop;nop;nop;nop;nop"); 1286bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1296bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1306bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_write_indexed(void) 1316bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1326bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__("mtptlb;nop;nop;nop;nop;nop"); 1336bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1346bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1356bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_write_random(void) 1366bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{ 1376bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin __asm__ __volatile__("mtrtlb;nop;nop;nop;nop;nop"); 1386bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin} 1396bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1406bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#endif /* Not __ASSEMBLY__ */ 1416bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin 1426bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#endif /* _ASM_SCORE_TLBFLUSH_H */ 143