Subversion Repositories HelenOS

Rev

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

Rev 3833 Rev 3836
Line 149... Line 149...
149
    uint32_t hash = vsid ^ page;
149
    uint32_t hash = vsid ^ page;
150
    uint32_t base = (hash & 0x3ff) << 3;
150
    uint32_t base = (hash & 0x3ff) << 3;
151
    uint32_t i;
151
    uint32_t i;
152
    bool found = false;
152
    bool found = false;
153
   
153
   
154
    /* Find unused or colliding
154
    /* Find unused or colliding PTE in PTEG */
155
       PTE in PTEG */
-
 
156
    for (i = 0; i < 8; i++) {
155
    for (i = 0; i < 8; i++) {
-
 
156
        if ((!phte[base + i].v) ||
157
        if ((!phte[base + i].v) || ((phte[base + i].vsid == vsid) &&
157
            ((phte[base + i].vsid == vsid)
158
            (phte[base + i].api == api))) {
158
            && (phte[base + i].api == api)
-
 
159
            && (phte[base + i].h == 0))) {
159
            found = true;
160
            found = true;
160
            break;
161
            break;
161
        }
162
        }
162
    }
163
    }
163
   
164
   
164
    if (!found) {
165
    if (!found) {
165
        /* Secondary hash (not) */
166
        /* Secondary hash (not) */
166
        uint32_t base2 = (~hash & 0x3ff) << 3;
167
        uint32_t base2 = (~hash & 0x3ff) << 3;
167
       
168
       
168
        /* Find unused or colliding
169
        /* Find unused or colliding PTE in PTEG */
169
           PTE in PTEG */
-
 
170
        for (i = 0; i < 8; i++) {
170
        for (i = 0; i < 8; i++) {
171
            if ((!phte[base2 + i].v) ||
171
            if ((!phte[base2 + i].v) ||
172
                ((phte[base2 + i].vsid == vsid) &&
172
                ((phte[base2 + i].vsid == vsid)
173
                (phte[base2 + i].api == api))) {
173
                && (phte[base2 + i].api == api)
-
 
174
                && (phte[base2 + i].h == 1))) {
174
                found = true;
175
                found = true;
175
                base = base2;
176
                base = base2;
176
                h = 1;
177
                h = 1;
177
                break;
178
                break;
178
            }
179
            }
179
        }
180
        }
180
       
181
       
181
        if (!found) {
182
        if (!found)
182
            // TODO: A/C precedence groups
-
 
183
            i = page % 8;
183
            i = page % 8;
184
        }
-
 
185
    }
184
    }
186
   
185
   
-
 
186
   
-
 
187
   
187
    phte[base + i].v = 1;
188
    phte[base + i].v = 1;
188
    phte[base + i].vsid = vsid;
189
    phte[base + i].vsid = vsid;
189
    phte[base + i].h = h;
190
    phte[base + i].h = h;
190
    phte[base + i].api = api;
191
    phte[base + i].api = api;
191
    phte[base + i].rpn = pte->pfn;
192
    phte[base + i].rpn = pte->pfn;
Line 220... Line 221...
220
    uint32_t hash = vsid ^ page;
221
    uint32_t hash = vsid ^ page;
221
    uint32_t base = (hash & 0x3ff) << 3;
222
    uint32_t base = (hash & 0x3ff) << 3;
222
    uint32_t i;
223
    uint32_t i;
223
    bool found = false;
224
    bool found = false;
224
   
225
   
225
    /* Find unused or colliding
226
    /* Find unused or colliding PTE in PTEG */
226
       PTE in PTEG */
-
 
227
    for (i = 0; i < 8; i++) {
227
    for (i = 0; i < 8; i++) {
228
        if ((!phte_physical[base + i].v) ||
228
        if ((!phte_physical[base + i].v) ||
229
            ((phte_physical[base + i].vsid == vsid) &&
229
            ((phte_physical[base + i].vsid == vsid)
230
            (phte_physical[base + i].api == api))) {
230
            && (phte_physical[base + i].api == api)
-
 
231
            && (phte_physical[base + i].h == 0))) {
231
            found = true;
232
            found = true;
232
            break;
233
            break;
233
        }
234
        }
234
    }
235
    }
235
   
236
   
236
    if (!found) {
237
    if (!found) {
237
        /* Secondary hash (not) */
238
        /* Secondary hash (not) */
238
        uint32_t base2 = (~hash & 0x3ff) << 3;
239
        uint32_t base2 = (~hash & 0x3ff) << 3;
239
       
240
       
240
        /* Find unused or colliding
241
        /* Find unused or colliding PTE in PTEG */
241
           PTE in PTEG */
-
 
242
        for (i = 0; i < 8; i++) {
242
        for (i = 0; i < 8; i++) {
243
            if ((!phte_physical[base2 + i].v) ||
243
            if ((!phte_physical[base2 + i].v) ||
244
                ((phte_physical[base2 + i].vsid == vsid) &&
244
                ((phte_physical[base2 + i].vsid == vsid)
245
                (phte_physical[base2 + i].api == api))) {
245
                && (phte_physical[base2 + i].api == api)
-
 
246
                && (phte_physical[base2 + i].h == 1))) {
246
                found = true;
247
                found = true;
247
                base = base2;
248
                base = base2;
248
                h = 1;
249
                h = 1;
249
                break;
250
                break;
250
            }
251
            }
251
        }
252
        }
252
       
253
       
253
        if (!found) {
254
        if (!found) {
254
            // TODO: A/C precedence groups
-
 
255
            i = page % 8;
255
            i = page % 8;
-
 
256
            base = base2;
-
 
257
            h = 1;
256
        }
258
        }
257
    }
259
    }
258
   
260
   
259
    phte_physical[base + i].v = 1;
261
    phte_physical[base + i].v = 1;
260
    phte_physical[base + i].vsid = vsid;
262
    phte_physical[base + i].vsid = vsid;