Subversion Repositories HelenOS-historic

Rev

Rev 945 | Rev 958 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 945 Rev 947
Line 92... Line 92...
92
    /* TODO */
92
    /* TODO */
93
    tlb_invalidate_all();
93
    tlb_invalidate_all();
94
}
94
}
95
 
95
 
96
 
96
 
97
void tlb_invalidate_pages(asid_t asid, __address va, count_t cnt)
97
void tlb_invalidate_pages(asid_t asid, __address page, count_t cnt)
98
{
98
{
99
 
99
 
100
 
100
 
101
    region_register rr;
101
    region_register rr;
102
    bool restore_rr = false;
102
    bool restore_rr = false;
103
    int b=0;
103
    int b=0;
104
    int c=cnt;
104
    int c=cnt;
-
 
105
 
-
 
106
    __address va;
105
    int i;
107
    va=page;
106
 
108
 
107
    rr.word = rr_read(VA2VRN(va));
109
    rr.word = rr_read(VA2VRN(va));
108
    if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
110
    if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
109
        /*
111
        /*
110
         * The selected region register does not contain required RID.
112
         * The selected region register does not contain required RID.
Line 130... Line 132...
130
            ps=PAGE_WIDTH;
132
            ps=PAGE_WIDTH;
131
            break;
133
            break;
132
        }
134
        }
133
        case 1: /*cnt 4-15*/
135
        case 1: /*cnt 4-15*/
134
        {
136
        {
135
            cnt=(cnt/4)+1;
137
            /*cnt=((cnt-1)/4)+1;*/
136
            ps=PAGE_WIDTH+2;
138
            ps=PAGE_WIDTH+2;
137
            va&=~((1<<ps)-1);
139
            va&=~((1<<ps)-1);
138
            break;
140
            break;
139
        }
141
        }
140
        case 2: /*cnt 16-63*/
142
        case 2: /*cnt 16-63*/
141
        {
143
        {
142
            cnt=(cnt/16)+1;
144
            /*cnt=((cnt-1)/16)+1;*/
143
            ps=PAGE_WIDTH+4;
145
            ps=PAGE_WIDTH+4;
144
            va&=~((1<<ps)-1);
146
            va&=~((1<<ps)-1);
145
            break;
147
            break;
146
        }
148
        }
147
        case 3: /*cnt 64-255*/
149
        case 3: /*cnt 64-255*/
148
        {
150
        {
149
            cnt=(cnt/64)+1;
151
            /*cnt=((cnt-1)/64)+1;*/
150
            ps=PAGE_WIDTH+6;
152
            ps=PAGE_WIDTH+6;
151
            va&=~((1<<ps)-1);
153
            va&=~((1<<ps)-1);
152
            break;
154
            break;
153
        }
155
        }
154
        case 4: /*cnt 256-1023*/
156
        case 4: /*cnt 256-1023*/
155
        {
157
        {
156
            cnt=(cnt/256)+1;
158
            /*cnt=((cnt-1)/256)+1;*/
157
            ps=PAGE_WIDTH+8;
159
            ps=PAGE_WIDTH+8;
158
            va&=~((1<<ps)-1);
160
            va&=~((1<<ps)-1);
159
            break;
161
            break;
160
        }
162
        }
161
        case 5: /*cnt 1024-4095*/
163
        case 5: /*cnt 1024-4095*/
162
        {
164
        {
163
            cnt=(cnt/1024)+1;
165
            /*cnt=((cnt-1)/1024)+1;*/
164
            ps=PAGE_WIDTH+10;
166
            ps=PAGE_WIDTH+10;
165
            va&=~((1<<ps)-1);
167
            va&=~((1<<ps)-1);
166
            break;
168
            break;
167
        }
169
        }
168
        case 6: /*cnt 4096-16383*/
170
        case 6: /*cnt 4096-16383*/
169
        {
171
        {
170
            cnt=(cnt/4096)+1;
172
            /*cnt=((cnt-1)/4096)+1;*/
171
            ps=PAGE_WIDTH+12;
173
            ps=PAGE_WIDTH+12;
172
            va&=~((1<<ps)-1);
174
            va&=~((1<<ps)-1);
173
            break;
175
            break;
174
        }
176
        }
175
        case 7: /*cnt 16384-65535*/
177
        case 7: /*cnt 16384-65535*/
176
        case 8: /*cnt 65536-(256K-1)*/
178
        case 8: /*cnt 65536-(256K-1)*/
177
        {
179
        {
178
            cnt=(cnt/16384)+1;
180
            /*cnt=((cnt-1)/16384)+1;*/
179
            ps=PAGE_WIDTH+14;
181
            ps=PAGE_WIDTH+14;
180
            va&=~((1<<ps)-1);
182
            va&=~((1<<ps)-1);
181
            break;
183
            break;
182
        }
184
        }
183
        default:
185
        default:
184
        {
186
        {
185
            cnt=(cnt/(16384*16))+1;
187
            /*cnt=((cnt-1)/(16384*16))+1;*/
186
            ps=PAGE_WIDTH+18;
188
            ps=PAGE_WIDTH+18;
187
            va&=~((1<<ps)-1);
189
            va&=~((1<<ps)-1);
188
            break;
190
            break;
189
        }
191
        }
190
           
-
 
191
    }
192
    }
192
    for(i=0;i<cnt;i++)  {
193
    /*cnt+=(page!=va);*/
-
 
194
    for(;va<(page+cnt*(PAGE_SIZE));va+=(1<<ps)) {
193
    __asm__ volatile
195
        __asm__ volatile
194
    (
196
        (
195
        "ptc.l %0,%1;;"
197
            "ptc.l %0,%1;;"
196
        :
198
            :
197
        : "r"(va), "r"(ps<<2)
199
            : "r"(va), "r"(ps<<2)
198
    );
200
        );
199
    va+=(1<<ps);
-
 
200
    }
201
    }
201
    srlz_d();
202
    srlz_d();
202
    srlz_i();
203
    srlz_i();
203
   
204
   
204
   
205