Subversion Repositories HelenOS

Rev

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

Rev 3392 Rev 3393
Line 285... Line 285...
285
            panic("unexpected pfrc (%d)\n", pfrc);
285
            panic("unexpected pfrc (%d)\n", pfrc);
286
        }
286
        }
287
    }
287
    }
288
 
288
 
289
    /*
289
    /*
290
     * Fail if the page is not writable.
-
 
291
     */
-
 
292
    if (!pte->w)
-
 
293
        goto fail;
-
 
294
 
-
 
295
    /*
-
 
296
     * Read the faulting TLB entry.
290
     * Read the faulting TLB entry.
297
     */
291
     */
298
    tlbr();
292
    tlbr();
299
 
293
 
300
    /*
294
    /*
Line 400... Line 394...
400
 
394
 
401
    /*
395
    /*
402
     * Check if the mapping exists in page tables.
396
     * Check if the mapping exists in page tables.
403
     */
397
     */
404
    pte = page_mapping_find(AS, badvaddr);
398
    pte = page_mapping_find(AS, badvaddr);
405
    if (pte && pte->p) {
399
    if (pte && pte->p && (pte->w || access != PF_ACCESS_WRITE)) {
406
        /*
400
        /*
407
         * Mapping found in page tables.
401
         * Mapping found in page tables.
408
         * Immediately succeed.
402
         * Immediately succeed.
409
         */
403
         */
410
        return pte;
404
        return pte;
Line 423... Line 417...
423
             * The mapping ought to be in place.
417
             * The mapping ought to be in place.
424
             */
418
             */
425
            page_table_lock(AS, true);
419
            page_table_lock(AS, true);
426
            pte = page_mapping_find(AS, badvaddr);
420
            pte = page_mapping_find(AS, badvaddr);
427
            ASSERT(pte && pte->p);
421
            ASSERT(pte && pte->p);
-
 
422
            ASSERT(pte->w || access != PF_ACCESS_WRITE);
428
            return pte;
423
            return pte;
429
            break;
424
            break;
430
        case AS_PF_DEFER:
425
        case AS_PF_DEFER:
431
            page_table_lock(AS, true);
426
            page_table_lock(AS, true);
432
            *pfrc = AS_PF_DEFER;
427
            *pfrc = AS_PF_DEFER;