Subversion Repositories HelenOS-historic

Rev

Rev 818 | Rev 899 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
740 jermar 1
/*
2
 * Copyright (C) 2006 Jakub Jermar
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
/*
30
 * TLB management.
31
 */
32
 
33
#include <mm/tlb.h>
818 vana 34
#include <arch/mm/tlb.h>
819 vana 35
#include <arch/barrier.h>
740 jermar 36
 
818 vana 37
 
756 jermar 38
/** Invalidate all TLB entries. */
740 jermar 39
void tlb_invalidate_all(void)
40
{
41
    /* TODO */
42
}
43
 
44
/** Invalidate entries belonging to an address space.
45
 *
46
 * @param asid Address space identifier.
47
 */
48
void tlb_invalidate_asid(asid_t asid)
49
{
50
    /* TODO */
51
}
818 vana 52
 
53
 
54
 
819 vana 55
void tlb_fill_data(__address va,asid_t asid,tlb_entry_t entry)
818 vana 56
{
57
    region_register rr;
58
 
59
 
60
    if(!(entry.not_present.p)) return;
61
 
62
    rr.word=rr_read(VA_REGION(va));
63
 
64
    if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
65
    {
819 vana 66
        asm volatile
818 vana 67
        (
68
            "srlz.i;;\n"
69
            "srlz.d;;\n"
70
            "mov r8=psr;;\n"
71
            "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
72
            "mov psr.l=r9;;\n"
73
            "srlz.d;;\n"
74
            "srlz.i;;\n"
819 vana 75
            "mov cr.ifa=%1\n"               /*va*/       
76
            "mov cr.itir=%2;;\n"                /*entry.word[1]*/
818 vana 77
            "itc.d %3;;\n"                      /*entry.word[0]*/
78
            "mov psr.l=r8;;\n"
79
            "srlz.d;;\n"
80
            :
81
            :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
82
            :"r8","r9"
83
        );
84
    }
85
    else
86
    {
87
        region_register rr0;
88
        rr0=rr;
89
        rr0.map.rid=ASID2RID(asid,VA_REGION(va));
90
        rr_write(VA_REGION(va),rr0.word);
819 vana 91
        srlz_d();
92
        asm volatile
818 vana 93
        (
94
            "mov r8=psr;;\n"
95
            "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
96
            "mov psr.l=r9;;\n"
97
            "srlz.d;;\n"
819 vana 98
            "mov cr.ifa=%1\n"               /*va*/       
99
            "mov cr.itir=%2;;\n"                /*entry.word[1]*/
818 vana 100
            "itc.d %3;;\n"                      /*entry.word[0]*/
101
            "mov psr.l=r8;;\n"
102
            "srlz.d;;\n"
103
            :
104
            :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
105
            :"r8","r9"
106
        );
107
        rr_write(VA_REGION(va),rr.word);
108
    }
109
 
110
 
111
}
112
 
819 vana 113
void tlb_fill_code(__address va,asid_t asid,tlb_entry_t entry)
818 vana 114
{
115
    region_register rr;
116
 
117
 
118
    if(!(entry.not_present.p)) return;
119
 
120
    rr.word=rr_read(VA_REGION(va));
121
 
122
    if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
123
    {
819 vana 124
        asm volatile
818 vana 125
        (
126
            "srlz.i;;\n"
127
            "srlz.d;;\n"
128
            "mov r8=psr;;\n"
129
            "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
130
            "mov psr.l=r9;;\n"
131
            "srlz.d;;\n"
132
            "srlz.i;;\n"
819 vana 133
            "mov cr.ifa=%1\n"               /*va*/       
134
            "mov cr.itir=%2;;\n"                /*entry.word[1]*/
818 vana 135
            "itc.i %3;;\n"                      /*entry.word[0]*/
136
            "mov psr.l=r8;;\n"
137
            "srlz.d;;\n"
138
            :
139
            :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
140
            :"r8","r9"
141
        );
142
    }
143
    else
144
    {
145
        region_register rr0;
146
        rr0=rr;
147
        rr0.map.rid=ASID2RID(asid,VA_REGION(va));
148
        rr_write(VA_REGION(va),rr0.word);
819 vana 149
        srlz_d();
150
        asm volatile
818 vana 151
        (
152
            "mov r8=psr;;\n"
153
            "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
154
            "mov psr.l=r9;;\n"
155
            "srlz.d;;\n"
819 vana 156
            "mov cr.ifa=%1\n"           /*va*/       
157
            "mov cr.itir=%2;;\n"            /*entry.word[1]*/
818 vana 158
            "itc.i %3;;\n"                      /*entry.word[0]*/
159
            "mov psr.l=r8;;\n"
160
            "srlz.d;;\n"
161
            :
162
            :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
163
            :"r8","r9"
164
        );
165
        rr_write(VA_REGION(va),rr.word);
166
    }
167
 
168
 
169
}
170
 
171
 
819 vana 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