Rev 1702 | Rev 1745 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1702 | Rev 1708 | ||
|---|---|---|---|
| Line 64... | Line 64... | ||
| 64 | * @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
64 | * @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
| 65 | * @return PTE on success, NULL otherwise. |
65 | * @return PTE on success, NULL otherwise. |
| 66 | * |
66 | * |
| 67 | */ |
67 | */ |
| 68 | static pte_t *find_mapping_and_check(as_t *as, bool lock, __address badvaddr, int access, |
68 | static pte_t *find_mapping_and_check(as_t *as, bool lock, __address badvaddr, int access, |
| 69 | istate_t *istate, int *pfcr) |
69 | istate_t *istate, int *pfrc) |
| 70 | { |
70 | { |
| 71 | /* |
71 | /* |
| 72 | * Check if the mapping exists in page tables. |
72 | * Check if the mapping exists in page tables. |
| 73 | */ |
73 | */ |
| 74 | pte_t *pte = page_mapping_find(as, badvaddr); |
74 | pte_t *pte = page_mapping_find(as, badvaddr); |
| Line 96... | Line 96... | ||
| 96 | pte = page_mapping_find(as, badvaddr); |
96 | pte = page_mapping_find(as, badvaddr); |
| 97 | ASSERT((pte) && (pte->p)); |
97 | ASSERT((pte) && (pte->p)); |
| 98 | return pte; |
98 | return pte; |
| 99 | case AS_PF_DEFER: |
99 | case AS_PF_DEFER: |
| 100 | page_table_lock(as, lock); |
100 | page_table_lock(as, lock); |
| 101 | *pfcr = rc; |
101 | *pfrc = rc; |
| 102 | return NULL; |
102 | return NULL; |
| 103 | case AS_PF_FAULT: |
103 | case AS_PF_FAULT: |
| 104 | page_table_lock(as, lock); |
104 | page_table_lock(as, lock); |
| 105 | printf("Page fault.\n"); |
105 | printf("Page fault.\n"); |
| 106 | *pfcr = rc; |
106 | *pfrc = rc; |
| 107 | return NULL; |
107 | return NULL; |
| 108 | default: |
108 | default: |
| 109 | panic("unexpected rc (%d)\n", rc); |
109 | panic("unexpected rc (%d)\n", rc); |
| 110 | } |
110 | } |
| 111 | } |
111 | } |
| Line 195... | Line 195... | ||
| 195 | */ |
195 | */ |
| 196 | void pht_refill(bool data, istate_t *istate) |
196 | void pht_refill(bool data, istate_t *istate) |
| 197 | { |
197 | { |
| 198 | __address badvaddr; |
198 | __address badvaddr; |
| 199 | pte_t *pte; |
199 | pte_t *pte; |
| 200 | int pfcr; |
200 | int pfrc; |
| 201 | as_t *as; |
201 | as_t *as; |
| 202 | bool lock; |
202 | bool lock; |
| 203 | 203 | ||
| 204 | if (AS == NULL) { |
204 | if (AS == NULL) { |
| 205 | as = AS_KERNEL; |
205 | as = AS_KERNEL; |
| Line 217... | Line 217... | ||
| 217 | } else |
217 | } else |
| 218 | badvaddr = istate->pc; |
218 | badvaddr = istate->pc; |
| 219 | 219 | ||
| 220 | page_table_lock(as, lock); |
220 | page_table_lock(as, lock); |
| 221 | 221 | ||
| 222 | pte = find_mapping_and_check(as, lock, badvaddr, PF_ACCESS_READ /* FIXME */, istate, &pfcr); |
222 | pte = find_mapping_and_check(as, lock, badvaddr, PF_ACCESS_READ /* FIXME */, istate, &pfrc); |
| 223 | if (!pte) { |
223 | if (!pte) { |
| 224 | switch (pfcr) { |
224 | switch (pfrc) { |
| 225 | case AS_PF_FAULT: |
225 | case AS_PF_FAULT: |
| 226 | goto fail; |
226 | goto fail; |
| 227 | break; |
227 | break; |
| 228 | case AS_PF_DEFER: |
228 | case AS_PF_DEFER: |
| 229 | /* |
229 | /* |
| Line 231... | Line 231... | ||
| 231 | * or copy_to_uspace(). |
231 | * or copy_to_uspace(). |
| 232 | */ |
232 | */ |
| 233 | page_table_unlock(as, lock); |
233 | page_table_unlock(as, lock); |
| 234 | return; |
234 | return; |
| 235 | default: |
235 | default: |
| 236 | panic("Unexpected pfrc (%d)\n", pfcr); |
236 | panic("Unexpected pfrc (%d)\n", pfrc); |
| 237 | } |
237 | } |
| 238 | } |
238 | } |
| 239 | 239 | ||
| 240 | pte->a = 1; /* Record access to PTE */ |
240 | pte->a = 1; /* Record access to PTE */ |
| 241 | pht_insert(badvaddr, pte->pfn); |
241 | pht_insert(badvaddr, pte->pfn); |