Subversion Repositories HelenOS

Rev

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

Rev 3827 Rev 3830
Line 64... Line 64...
64
{
64
{
65
    /*
65
    /*
66
     * Check if the mapping exists in page tables.
66
     * Check if the mapping exists in page tables.
67
     */
67
     */
68
    pte_t *pte = page_mapping_find(as, badvaddr);
68
    pte_t *pte = page_mapping_find(as, badvaddr);
69
    if ((pte) && (pte->p)) {
69
    if ((pte) && (pte->present)) {
70
        /*
70
        /*
71
         * Mapping found in page tables.
71
         * Mapping found in page tables.
72
         * Immediately succeed.
72
         * Immediately succeed.
73
         */
73
         */
74
        return pte;
74
        return pte;
Line 86... Line 86...
86
             * The higher-level page fault handler succeeded,
86
             * The higher-level page fault handler succeeded,
87
             * The mapping ought to be in place.
87
             * The mapping ought to be in place.
88
             */
88
             */
89
            page_table_lock(as, lock);
89
            page_table_lock(as, lock);
90
            pte = page_mapping_find(as, badvaddr);
90
            pte = page_mapping_find(as, badvaddr);
91
            ASSERT((pte) && (pte->p));
91
            ASSERT((pte) && (pte->present));
92
            *pfrc = 0;
92
            *pfrc = 0;
93
            return pte;
93
            return pte;
94
        case AS_PF_DEFER:
94
        case AS_PF_DEFER:
95
            page_table_lock(as, lock);
95
            page_table_lock(as, lock);
96
            *pfrc = rc;
96
            *pfrc = rc;
Line 124... Line 124...
124
    panic("%p: PHT Refill Exception at %p (%s<-%s).", badvaddr,
124
    panic("%p: PHT Refill Exception at %p (%s<-%s).", badvaddr,
125
        istate->pc, symbol, sym2);
125
        istate->pc, symbol, sym2);
126
}
126
}
127
 
127
 
128
 
128
 
129
static void pht_insert(const uintptr_t vaddr, const pfn_t pfn)
129
static void pht_insert(const uintptr_t vaddr, const pte_t *pte)
130
{
130
{
131
    uint32_t page = (vaddr >> 12) & 0xffff;
131
    uint32_t page = (vaddr >> 12) & 0xffff;
132
    uint32_t api = (vaddr >> 22) & 0x3f;
132
    uint32_t api = (vaddr >> 22) & 0x3f;
133
   
133
   
134
    uint32_t vsid;
134
    uint32_t vsid;
Line 187... Line 187...
187
   
187
   
188
    phte[base + i].v = 1;
188
    phte[base + i].v = 1;
189
    phte[base + i].vsid = vsid;
189
    phte[base + i].vsid = vsid;
190
    phte[base + i].h = h;
190
    phte[base + i].h = h;
191
    phte[base + i].api = api;
191
    phte[base + i].api = api;
192
    phte[base + i].rpn = pfn;
192
    phte[base + i].rpn = pte->pfn;
193
    phte[base + i].r = 0;
193
    phte[base + i].r = 0;
194
    phte[base + i].c = 0;
194
    phte[base + i].c = 0;
-
 
195
    phte[base + i].wimg = (pte->page_cache_disable ? WIMG_NO_CACHE : 0);
195
    phte[base + i].pp = 2; // FIXME
196
    phte[base + i].pp = 2; // FIXME
196
}
197
}
197
 
198
 
198
 
199
 
199
static void pht_real_insert(const uintptr_t vaddr, const pfn_t pfn)
200
static void pht_real_insert(const uintptr_t vaddr, const pfn_t pfn)
Line 261... Line 262...
261
    phte_physical[base + i].h = h;
262
    phte_physical[base + i].h = h;
262
    phte_physical[base + i].api = api;
263
    phte_physical[base + i].api = api;
263
    phte_physical[base + i].rpn = pfn;
264
    phte_physical[base + i].rpn = pfn;
264
    phte_physical[base + i].r = 0;
265
    phte_physical[base + i].r = 0;
265
    phte_physical[base + i].c = 0;
266
    phte_physical[base + i].c = 0;
-
 
267
    phte_physical[base + i].wimg = 0;
266
    phte_physical[base + i].pp = 2; // FIXME
268
    phte_physical[base + i].pp = 2; // FIXME
267
}
269
}
268
 
270
 
269
 
271
 
270
/** Process Instruction/Data Storage Interrupt
272
/** Process Instruction/Data Storage Interrupt
Line 316... Line 318...
316
        default:
318
        default:
317
            panic("Unexpected pfrc (%d).", pfrc);
319
            panic("Unexpected pfrc (%d).", pfrc);
318
        }
320
        }
319
    }
321
    }
320
   
322
   
321
    pte->a = 1; /* Record access to PTE */
323
    pte->accessed = 1; /* Record access to PTE */
322
    pht_insert(badvaddr, pte->pfn);
324
    pht_insert(badvaddr, pte);
323
   
325
   
324
    page_table_unlock(as, lock);
326
    page_table_unlock(as, lock);
325
    return;
327
    return;
326
   
328
   
327
fail:
329
fail: