Rev 818 | Rev 899 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 818 | Rev 819 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | * TLB management. |
30 | * TLB management. |
31 | */ |
31 | */ |
32 | 32 | ||
33 | #include <mm/tlb.h> |
33 | #include <mm/tlb.h> |
34 | #include <arch/mm/tlb.h> |
34 | #include <arch/mm/tlb.h> |
- | 35 | #include <arch/barrier.h> |
|
35 | 36 | ||
36 | 37 | ||
37 | /** Invalidate all TLB entries. */ |
38 | /** Invalidate all TLB entries. */ |
38 | void tlb_invalidate_all(void) |
39 | void tlb_invalidate_all(void) |
39 | { |
40 | { |
Line 49... | Line 50... | ||
49 | /* TODO */ |
50 | /* TODO */ |
50 | } |
51 | } |
51 | 52 | ||
52 | 53 | ||
53 | 54 | ||
54 | void tlb_fill_data(__address va,asid_t asid,vhpt_entry_t entry) |
55 | void tlb_fill_data(__address va,asid_t asid,tlb_entry_t entry) |
55 | { |
56 | { |
56 | region_register rr; |
57 | region_register rr; |
57 | 58 | ||
58 | 59 | ||
59 | if(!(entry.not_present.p)) return; |
60 | if(!(entry.not_present.p)) return; |
60 | 61 | ||
61 | rr.word=rr_read(VA_REGION(va)); |
62 | rr.word=rr_read(VA_REGION(va)); |
62 | 63 | ||
63 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
64 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
64 | { |
65 | { |
65 | asm |
66 | asm volatile |
66 | ( |
67 | ( |
67 | "srlz.i;;\n" |
68 | "srlz.i;;\n" |
68 | "srlz.d;;\n" |
69 | "srlz.d;;\n" |
69 | "mov r8=psr;;\n" |
70 | "mov r8=psr;;\n" |
70 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
71 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
71 | "mov psr.l=r9;;\n" |
72 | "mov psr.l=r9;;\n" |
72 | "srlz.d;;\n" |
73 | "srlz.d;;\n" |
73 | "srlz.i;;\n" |
74 | "srlz.i;;\n" |
74 | "mov cr20=%1\n" /*va*/ /*cr20 == IFA*/ |
75 | "mov cr.ifa=%1\n" /*va*/ |
75 | "mov cr21=%2;;\n" /*entry.word[1]*/ /*cr21=ITIR*/ |
76 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
76 | "itc.d %3;;\n" /*entry.word[0]*/ |
77 | "itc.d %3;;\n" /*entry.word[0]*/ |
77 | "mov psr.l=r8;;\n" |
78 | "mov psr.l=r8;;\n" |
78 | "srlz.d;;\n" |
79 | "srlz.d;;\n" |
79 | : |
80 | : |
80 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
81 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
Line 85... | Line 86... | ||
85 | { |
86 | { |
86 | region_register rr0; |
87 | region_register rr0; |
87 | rr0=rr; |
88 | rr0=rr; |
88 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
89 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
89 | rr_write(VA_REGION(va),rr0.word); |
90 | rr_write(VA_REGION(va),rr0.word); |
- | 91 | srlz_d(); |
|
90 | asm |
92 | asm volatile |
91 | ( |
93 | ( |
92 | "mov r8=psr;;\n" |
94 | "mov r8=psr;;\n" |
93 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
95 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
94 | "mov psr.l=r9;;\n" |
96 | "mov psr.l=r9;;\n" |
95 | "srlz.d;;\n" |
97 | "srlz.d;;\n" |
96 | "mov cr20=%1\n" /*va*/ /*cr20 == IFA*/ |
98 | "mov cr.ifa=%1\n" /*va*/ |
97 | "mov cr21=%2;;\n" /*entry.word[1]*/ /*cr21=ITIR*/ |
99 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
98 | "itc.d %3;;\n" /*entry.word[0]*/ |
100 | "itc.d %3;;\n" /*entry.word[0]*/ |
99 | "mov psr.l=r8;;\n" |
101 | "mov psr.l=r8;;\n" |
100 | "srlz.d;;\n" |
102 | "srlz.d;;\n" |
101 | : |
103 | : |
102 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
104 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
Line 106... | Line 108... | ||
106 | } |
108 | } |
107 | 109 | ||
108 | 110 | ||
109 | } |
111 | } |
110 | 112 | ||
111 | void tlb_fill_code(__address va,asid_t asid,vhpt_entry_t entry) |
113 | void tlb_fill_code(__address va,asid_t asid,tlb_entry_t entry) |
112 | { |
114 | { |
113 | region_register rr; |
115 | region_register rr; |
114 | 116 | ||
115 | 117 | ||
116 | if(!(entry.not_present.p)) return; |
118 | if(!(entry.not_present.p)) return; |
117 | 119 | ||
118 | rr.word=rr_read(VA_REGION(va)); |
120 | rr.word=rr_read(VA_REGION(va)); |
119 | 121 | ||
120 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
122 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
121 | { |
123 | { |
122 | asm |
124 | asm volatile |
123 | ( |
125 | ( |
124 | "srlz.i;;\n" |
126 | "srlz.i;;\n" |
125 | "srlz.d;;\n" |
127 | "srlz.d;;\n" |
126 | "mov r8=psr;;\n" |
128 | "mov r8=psr;;\n" |
127 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
129 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
128 | "mov psr.l=r9;;\n" |
130 | "mov psr.l=r9;;\n" |
129 | "srlz.d;;\n" |
131 | "srlz.d;;\n" |
130 | "srlz.i;;\n" |
132 | "srlz.i;;\n" |
131 | "mov cr20=%1\n" /*va*/ /*cr20 == IFA*/ |
133 | "mov cr.ifa=%1\n" /*va*/ |
132 | "mov cr21=%2;;\n" /*entry.word[1]*/ /*cr21=ITIR*/ |
134 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
133 | "itc.i %3;;\n" /*entry.word[0]*/ |
135 | "itc.i %3;;\n" /*entry.word[0]*/ |
134 | "mov psr.l=r8;;\n" |
136 | "mov psr.l=r8;;\n" |
135 | "srlz.d;;\n" |
137 | "srlz.d;;\n" |
136 | : |
138 | : |
137 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
139 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
Line 142... | Line 144... | ||
142 | { |
144 | { |
143 | region_register rr0; |
145 | region_register rr0; |
144 | rr0=rr; |
146 | rr0=rr; |
145 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
147 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
146 | rr_write(VA_REGION(va),rr0.word); |
148 | rr_write(VA_REGION(va),rr0.word); |
- | 149 | srlz_d(); |
|
147 | asm |
150 | asm volatile |
148 | ( |
151 | ( |
149 | "mov r8=psr;;\n" |
152 | "mov r8=psr;;\n" |
150 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
153 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
151 | "mov psr.l=r9;;\n" |
154 | "mov psr.l=r9;;\n" |
152 | "srlz.d;;\n" |
155 | "srlz.d;;\n" |
153 | "mov cr20=%1\n" /*va*/ /*cr20 == IFA*/ |
156 | "mov cr.ifa=%1\n" /*va*/ |
154 | "mov cr21=%2;;\n" /*entry.word[1]*/ /*cr21=ITIR*/ |
157 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
155 | "itc.i %3;;\n" /*entry.word[0]*/ |
158 | "itc.i %3;;\n" /*entry.word[0]*/ |
156 | "mov psr.l=r8;;\n" |
159 | "mov psr.l=r8;;\n" |
157 | "srlz.d;;\n" |
160 | "srlz.d;;\n" |
158 | : |
161 | : |
159 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
162 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]) |
Line 164... | Line 167... | ||
164 | 167 | ||
165 | 168 | ||
166 | } |
169 | } |
167 | 170 | ||
168 | 171 | ||
- | 172 | void tlb_fill_data_tr(__u64 tr,__address va,asid_t asid,tlb_entry_t entry) |
|
- | 173 | { |
|
- | 174 | region_register rr; |
|
- | 175 | ||
- | 176 | ||
- | 177 | if(!(entry.not_present.p)) return; |
|
- | 178 | ||
- | 179 | rr.word=rr_read(VA_REGION(va)); |
|
- | 180 | ||
- | 181 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
|
- | 182 | { |
|
- | 183 | asm volatile |
|
- | 184 | ( |
|
- | 185 | "srlz.i;;\n" |
|
- | 186 | "srlz.d;;\n" |
|
- | 187 | "mov r8=psr;;\n" |
|
- | 188 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
|
- | 189 | "mov psr.l=r9;;\n" |
|
- | 190 | "srlz.d;;\n" |
|
- | 191 | "srlz.i;;\n" |
|
- | 192 | "mov cr.ifa=%1\n" /*va*/ |
|
- | 193 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
|
- | 194 | "itr.d dtr[%4]=%3;;\n" /*entry.word[0]*/ |
|
- | 195 | "mov psr.l=r8;;\n" |
|
- | 196 | "srlz.d;;\n" |
|
- | 197 | : |
|
- | 198 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr) |
|
- | 199 | :"r8","r9" |
|
- | 200 | ); |
|
- | 201 | } |
|
- | 202 | else |
|
- | 203 | { |
|
- | 204 | region_register rr0; |
|
- | 205 | rr0=rr; |
|
- | 206 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
|
- | 207 | rr_write(VA_REGION(va),rr0.word); |
|
- | 208 | srlz_d(); |
|
- | 209 | asm volatile |
|
- | 210 | ( |
|
- | 211 | "mov r8=psr;;\n" |
|
- | 212 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
|
- | 213 | "mov psr.l=r9;;\n" |
|
- | 214 | "srlz.d;;\n" |
|
- | 215 | "mov cr.ifa=%1\n" /*va*/ |
|
- | 216 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
|
- | 217 | "itr.d dtr[%4]=%3;;\n" /*entry.word[0]*/ |
|
- | 218 | "mov psr.l=r8;;\n" |
|
- | 219 | "srlz.d;;\n" |
|
- | 220 | : |
|
- | 221 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr) |
|
- | 222 | :"r8","r9" |
|
- | 223 | ); |
|
- | 224 | rr_write(VA_REGION(va),rr.word); |
|
- | 225 | } |
|
- | 226 | ||
- | 227 | ||
- | 228 | } |
|
- | 229 | ||
- | 230 | void tlb_fill_code_tr(__u64 tr,__address va,asid_t asid,tlb_entry_t entry) |
|
- | 231 | { |
|
- | 232 | region_register rr; |
|
- | 233 | ||
- | 234 | ||
- | 235 | if(!(entry.not_present.p)) return; |
|
- | 236 | ||
- | 237 | rr.word=rr_read(VA_REGION(va)); |
|
- | 238 | ||
- | 239 | if(rr.map.rid==ASID2RID(asid,VA_REGION(va))) |
|
- | 240 | { |
|
- | 241 | asm volatile |
|
- | 242 | ( |
|
- | 243 | "srlz.i;;\n" |
|
- | 244 | "srlz.d;;\n" |
|
- | 245 | "mov r8=psr;;\n" |
|
- | 246 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
|
- | 247 | "mov psr.l=r9;;\n" |
|
- | 248 | "srlz.d;;\n" |
|
- | 249 | "srlz.i;;\n" |
|
- | 250 | "mov cr.ifa=%1\n" /*va*/ |
|
- | 251 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
|
- | 252 | "itr.i itr[%4]=%3;;\n" /*entry.word[0]*/ |
|
- | 253 | "mov psr.l=r8;;\n" |
|
- | 254 | "srlz.d;;\n" |
|
- | 255 | : |
|
- | 256 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr) |
|
- | 257 | :"r8","r9" |
|
- | 258 | ); |
|
- | 259 | } |
|
- | 260 | else |
|
- | 261 | { |
|
- | 262 | region_register rr0; |
|
- | 263 | rr0=rr; |
|
- | 264 | rr0.map.rid=ASID2RID(asid,VA_REGION(va)); |
|
- | 265 | rr_write(VA_REGION(va),rr0.word); |
|
- | 266 | srlz_d(); |
|
- | 267 | asm volatile |
|
- | 268 | ( |
|
- | 269 | "mov r8=psr;;\n" |
|
- | 270 | "and r9=r8,%0;;\n" /*(~PSR_IC_MASK)*/ |
|
- | 271 | "mov psr.l=r9;;\n" |
|
- | 272 | "srlz.d;;\n" |
|
- | 273 | "mov cr.ifa=%1\n" /*va*/ |
|
- | 274 | "mov cr.itir=%2;;\n" /*entry.word[1]*/ |
|
- | 275 | "itr.i itr[%4]=%3;;\n" /*entry.word[0]*/ |
|
- | 276 | "mov psr.l=r8;;\n" |
|
- | 277 | "srlz.d;;\n" |
|
- | 278 | : |
|
- | 279 | :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr) |
|
- | 280 | :"r8","r9" |
|
- | 281 | ); |
|
- | 282 | rr_write(VA_REGION(va),rr.word); |
|
- | 283 | } |
|
- | 284 | ||
- | 285 | ||
- | 286 | } |
|
- | 287 |