]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/mem_unit.cpp
Some minor fixes.
[l4.git] / kernel / fiasco / src / kern / arm / mem_unit.cpp
1 INTERFACE [arm]:
2
3 #include "mem_layout.h"
4 #include "mmu.h"
5
6 class Mem_unit : public Mmu< Mem_layout::Cache_flush_area >
7 {
8 public:
9   enum : Mword
10   {
11     Asid_kernel  = 0UL,
12     Asid_invalid = ~0UL
13   };
14
15   static void tlb_flush();
16   static void dtlb_flush(void *va);
17   static void tlb_flush(unsigned long asid);
18   static void tlb_flush(void *va, unsigned long asid);
19
20   static void kernel_tlb_flush();
21 };
22
23 //---------------------------------------------------------------------------
24 IMPLEMENTATION [arm]:
25
26 IMPLEMENT inline
27 void Mem_unit::tlb_flush()
28 {
29   asm volatile("mcr p15, 0, %0, c8, c7, 0" // TLBIALL
30                : : "r" (0) : "memory");
31 }
32
33 IMPLEMENT inline
34 void Mem_unit::dtlb_flush(void *va)
35 {
36   asm volatile("mcr p15, 0, %0, c8, c6, 1" // DTLBIMVA
37                : : "r" ((unsigned long)va & 0xfffff000) : "memory");
38 }
39
40 IMPLEMENT_DEFAULT inline NEEDS[Mem_unit::tlb_flush]
41 void Mem_unit::kernel_tlb_flush()
42 { tlb_flush(); }
43
44 PUBLIC static inline ALWAYS_INLINE
45 void
46 Mem_unit::make_coherent_to_pou(void const *v)
47 { clean_dcache(v); }
48
49 //---------------------------------------------------------------------------
50 IMPLEMENTATION [arm && armv5]:
51
52 IMPLEMENT inline
53 void Mem_unit::tlb_flush(void *va, unsigned long)
54 {
55   asm volatile("mcr p15, 0, %0, c8, c7, 1"
56                : : "r" ((unsigned long)va & 0xfffff000) : "memory");
57 }
58
59 IMPLEMENT inline
60 void Mem_unit::tlb_flush(unsigned long)
61 {
62   asm volatile("mcr p15, 0, r0, c8, c7, 0" : : "r" (0) : "memory");
63 }
64
65 //---------------------------------------------------------------------------
66 IMPLEMENTATION [arm && (armv6 || armv7) && !hyp]:
67
68 IMPLEMENT inline
69 void Mem_unit::tlb_flush(void *va, unsigned long asid)
70 {
71   if (asid == Asid_invalid)
72     return;
73   btc_flush();
74   Mem::dsb();
75   asm volatile("mcr p15, 0, %0, c8, c7, 1" // TLBIMVA
76                : : "r" (((unsigned long)va & 0xfffff000) | asid) : "memory");
77 }
78
79 IMPLEMENT inline
80 void Mem_unit::tlb_flush(unsigned long asid)
81 {
82   btc_flush();
83   Mem::dsb();
84   asm volatile("mcr p15, 0, %0, c8, c7, 2" // TLBIASID
85                : : "r" (asid) : "memory");
86 }
87
88 //---------------------------------------------------------------------------
89 IMPLEMENTATION [arm && (armv6 || armv7) && hyp]:
90
91 IMPLEMENT inline
92 void Mem_unit::tlb_flush(void *va, unsigned long asid)
93 {
94   if (asid == Asid_invalid)
95     return;
96   btc_flush();
97   Mem::dsb();
98   Mword t1, t2;
99   if (1) asm volatile(
100       "mrrc p15, 6, %[tmp1], %[tmp2], c2 \n"
101       "mcrr p15, 6, %[tmp1], %[asid], c2 \n"
102       "isb \n"
103       "mcr  p15, 0, %[mva], c8, c7, 3 \n"
104       "mcrr p15, 6, %[tmp1], %[tmp2], c2 \n"
105       : [tmp1] "=&r" (t1), [tmp2] "=&r" (t2)
106       : [mva] "r" (((unsigned long)va & 0xfffff000)), [asid] "r" (asid << 16)
107       : "memory");
108
109   if (0) asm volatile ( "mcr p15, 4, r0, c8, c7, 4" );
110 }
111
112 IMPLEMENT inline
113 void Mem_unit::tlb_flush(unsigned long asid)
114 {
115   btc_flush();
116   Mem::dsb();
117   Mword t1, t2;
118   if (1) asm volatile(
119       "mrrc p15, 6, %[tmp1], %[tmp2], c2 \n"
120       "mcrr p15, 6, %[tmp1], %[asid], c2 \n"
121       "isb \n"
122       "mcr  p15, 0, %[tmp1], c8, c7, 0 \n"
123       "mcrr p15, 6, %[tmp1], %[tmp2], c2 \n"
124       : [tmp1] "=&r" (t1), [tmp2] "=&r" (t2)
125       : [asid] "r" (asid << 16)
126       : "memory");
127
128   if (0) asm volatile ( "mcr p15, 4, r0, c8, c7, 4" );
129 }
130
131 //---------------------------------------------------------------------------
132 IMPLEMENTATION [arm && hyp]:
133
134 IMPLEMENT_OVERRIDE inline
135 void Mem_unit::kernel_tlb_flush()
136 {
137   asm volatile("mcr p15, 4, r0, c8, c7, 0" : : "r" (0) : "memory");
138 }
139