tlbflush.h 3.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
#ifndef _ASM_SCORE_TLBFLUSH_H
#define _ASM_SCORE_TLBFLUSH_H

#include <linux/mm.h>

/*
 * TLB flushing:
 *
 * - flush_tlb_all() flushes all processes TLB entries
 * - flush_tlb_mm(mm) flushes the specified mm context TLB entries
 * - flush_tlb_page(vma, vmaddr) flushes one page
 * - flush_tlb_range(vma, start, end) flushes a range of pages
 * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
 */
extern void local_flush_tlb_all(void);
extern void local_flush_tlb_mm(struct mm_struct *mm);
extern void local_flush_tlb_range(struct vm_area_struct *vma,
	unsigned long start, unsigned long end);
extern void local_flush_tlb_kernel_range(unsigned long start,
	unsigned long end);
extern void local_flush_tlb_page(struct vm_area_struct *vma,
	unsigned long page);
extern void local_flush_tlb_one(unsigned long vaddr);

#define flush_tlb_all()			local_flush_tlb_all()
#define flush_tlb_mm(mm)		local_flush_tlb_mm(mm)
#define flush_tlb_range(vma, vmaddr, end) \
	local_flush_tlb_range(vma, vmaddr, end)
#define flush_tlb_kernel_range(vmaddr, end) \
	local_flush_tlb_kernel_range(vmaddr, end)
#define flush_tlb_page(vma, page)	local_flush_tlb_page(vma, page)
#define flush_tlb_one(vaddr)		local_flush_tlb_one(vaddr)

#ifndef __ASSEMBLY__

static inline unsigned long pevn_get(void)
{
	unsigned long val;

	__asm__ __volatile__(
		"mfcr %0, cr11\n"
		"nop\nnop\n"
		: "=r" (val));

	return val;
}

static inline void pevn_set(unsigned long val)
{
	__asm__ __volatile__(
		"mtcr %0, cr11\n"
		"nop\nnop\nnop\nnop\nnop\n"
	: : "r" (val));
}

static inline void pectx_set(unsigned long val)
{
	__asm__ __volatile__(
		"mtcr %0, cr12\n"
		"nop\nnop\nnop\nnop\nnop\n"
	: : "r" (val));
}

static inline unsigned long pectx_get(void)
{
	unsigned long val;
	__asm__ __volatile__(
		"mfcr %0, cr12\n"
		"nop\nnop\n"
	: "=r" (val));
	return val;
}
static inline unsigned long tlblock_get(void)
{
	unsigned long val;

	__asm__ __volatile__(
		"mfcr %0, cr7\n"
		"nop\nnop\n"
	: "=r" (val));
	return val;
}
static inline void tlblock_set(unsigned long val)
{
	__asm__ __volatile__(
		"mtcr %0, cr7\n"
		"nop\nnop\nnop\nnop\nnop\n"
	: : "r" (val));
}

static inline void tlbpt_set(unsigned long val)
{
	__asm__ __volatile__(
		"mtcr %0, cr8\n"
		"nop\nnop\nnop\nnop\nnop\n"
		: : "r" (val));
}

static inline long tlbpt_get(void)
{
	long val;

	__asm__ __volatile__(
		"mfcr %0, cr8\n"
		"nop\nnop\n"
		: "=r" (val));

	return val;
}

static inline void peaddr_set(unsigned long val)
{
	__asm__ __volatile__(
		"mtcr %0, cr9\n"
		"nop\nnop\nnop\nnop\nnop\n"
		: : "r" (val));
}

/* TLB operations. */
static inline void tlb_probe(void)
{
	__asm__ __volatile__("stlb;nop;nop;nop;nop;nop");
}

static inline void tlb_read(void)
{
	__asm__ __volatile__("mftlb;nop;nop;nop;nop;nop");
}

static inline void tlb_write_indexed(void)
{
	__asm__ __volatile__("mtptlb;nop;nop;nop;nop;nop");
}

static inline void tlb_write_random(void)
{
	__asm__ __volatile__("mtrtlb;nop;nop;nop;nop;nop");
}

#endif /* Not __ASSEMBLY__ */

#endif /* _ASM_SCORE_TLBFLUSH_H */