Changeset e3c762cd in mainline for arch/mips32/src/mm/tlb.c
- Timestamp:
- 2006-05-05T11:59:19Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- de07bcf
- Parents:
- 22cf454d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/mips32/src/mm/tlb.c
r22cf454d re3c762cd 45 45 static void tlb_modified_fail(istate_t *istate); 46 46 47 static pte_t *find_mapping_and_check(__address badvaddr );47 static pte_t *find_mapping_and_check(__address badvaddr, istate_t *istate, int *pfrc); 48 48 49 49 static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn); … … 92 92 __address badvaddr; 93 93 pte_t *pte; 94 int pfrc; 94 95 95 96 badvaddr = cp0_badvaddr_read(); … … 101 102 page_table_lock(AS, true); 102 103 103 pte = find_mapping_and_check(badvaddr); 104 if (!pte) 105 goto fail; 104 pte = find_mapping_and_check(badvaddr, istate, &pfrc); 105 if (!pte) { 106 switch (pfrc) { 107 case AS_PF_FAULT: 108 goto fail; 109 break; 110 case AS_PF_DEFER: 111 /* 112 * The page fault came during copy_from_uspace() 113 * or copy_to_uspace(). 114 */ 115 page_table_unlock(AS, true); 116 return; 117 default: 118 panic("unexpected pfrc (%d)\n", pfrc); 119 } 120 } 106 121 107 122 /* … … 149 164 entry_hi_t hi; 150 165 pte_t *pte; 166 int pfrc; 151 167 152 168 badvaddr = cp0_badvaddr_read(); … … 171 187 } 172 188 173 pte = find_mapping_and_check(badvaddr); 174 if (!pte) 175 goto fail; 189 pte = find_mapping_and_check(badvaddr, istate, &pfrc); 190 if (!pte) { 191 switch (pfrc) { 192 case AS_PF_FAULT: 193 goto fail; 194 break; 195 case AS_PF_DEFER: 196 /* 197 * The page fault came during copy_from_uspace() 198 * or copy_to_uspace(). 199 */ 200 page_table_unlock(AS, true); 201 return; 202 default: 203 panic("unexpected pfrc (%d)\n", pfrc); 204 } 205 } 176 206 177 207 /* … … 218 248 entry_hi_t hi; 219 249 pte_t *pte; 250 int pfrc; 220 251 221 252 badvaddr = cp0_badvaddr_read(); … … 240 271 } 241 272 242 pte = find_mapping_and_check(badvaddr); 243 if (!pte) 244 goto fail; 273 pte = find_mapping_and_check(badvaddr, istate, &pfrc); 274 if (!pte) { 275 switch (pfrc) { 276 case AS_PF_FAULT: 277 goto fail; 278 break; 279 case AS_PF_DEFER: 280 /* 281 * The page fault came during copy_from_uspace() 282 * or copy_to_uspace(). 283 */ 284 page_table_unlock(AS, true); 285 return; 286 default: 287 panic("unexpected pfrc (%d)\n", pfrc); 288 } 289 } 245 290 246 291 /* … … 322 367 * 323 368 * @param badvaddr Faulting virtual address. 369 * @param istate Pointer to interrupted state. 370 * @param pfrc Pointer to variable where as_page_fault() return code will be stored. 324 371 * 325 372 * @return PTE on success, NULL otherwise. 326 373 */ 327 pte_t *find_mapping_and_check(__address badvaddr )374 pte_t *find_mapping_and_check(__address badvaddr, istate_t *istate, int *pfrc) 328 375 { 329 376 entry_hi_t hi; … … 351 398 return pte; 352 399 } else { 400 int rc; 401 353 402 /* 354 403 * Mapping not found in page tables. … … 356 405 */ 357 406 page_table_unlock(AS, true); 358 if (as_page_fault(badvaddr)) { 407 switch (rc = as_page_fault(badvaddr, istate)) { 408 case AS_PF_OK: 359 409 /* 360 410 * The higher-level page fault handler succeeded, … … 365 415 ASSERT(pte && pte->p); 366 416 return pte; 367 } else { 417 break; 418 case AS_PF_DEFER: 419 page_table_lock(AS, true); 420 *pfrc = AS_PF_DEFER; 421 return NULL; 422 break; 423 case AS_PF_FAULT: 368 424 page_table_lock(AS, true); 369 425 printf("Page fault.\n"); 426 *pfrc = AS_PF_FAULT; 370 427 return NULL; 428 break; 429 default: 430 panic("unexpected rc (%d)\n", rc); 371 431 } 372 432
Note:
See TracChangeset
for help on using the changeset viewer.