Changeset e3c762cd in mainline for arch/ppc32/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/ppc32/src/mm/tlb.c
r22cf454d re3c762cd 69 69 * 70 70 * @param badvaddr Faulting virtual address. 71 * @param istate Pointer to interrupted state. 72 * @param pfrc Pointer to variable where as_page_fault() return code will be stored. 71 73 * @return PTE on success, NULL otherwise. 72 74 * 73 75 */ 74 static pte_t *find_mapping_and_check(__address badvaddr )76 static pte_t *find_mapping_and_check(__address badvaddr, istate_t *istate, int *pfcr) 75 77 { 76 78 /* … … 85 87 return pte; 86 88 } else { 89 int rc; 90 87 91 /* 88 92 * Mapping not found in page tables. … … 90 94 */ 91 95 page_table_unlock(AS, true); 92 if (as_page_fault(badvaddr)) { 96 switch (rc = as_page_fault(badvaddr, istate)) { 97 case AS_PF_OK: 93 98 /* 94 99 * The higher-level page fault handler succeeded, … … 99 104 ASSERT((pte) && (pte->p)); 100 105 return pte; 101 } else { 106 break; 107 case AS_PF_DEFER: 108 page_table_lock(AS, true); 109 *pfcr = rc; 110 return NULL; 111 break; 112 case AS_PF_FAULT: 102 113 page_table_lock(AS, true); 103 114 printf("Page fault.\n"); 115 *pfcr = rc; 104 116 return NULL; 105 } 106 117 break; 118 default: 119 panic("unexpected rc (%d)\n", rc); 120 break; 121 } 107 122 } 108 123 } … … 140 155 __u32 hash; 141 156 __u32 i; 157 int pfcr; 142 158 143 159 if (data) { … … 155 171 page_table_lock(AS, true); 156 172 157 pte = find_mapping_and_check(badvaddr); 158 if (!pte) 159 goto fail; 173 pte = find_mapping_and_check(badvaddr, istate, &pfcr); 174 if (!pte) { 175 switch (pfcr) { 176 case AS_PF_FAULT: 177 goto fail; 178 break; 179 case AS_PF_DEFER: 180 /* 181 * The page fault came during copy_from_uspace() 182 * or copy_to_uspace(). 183 */ 184 page_table_unlock(AS, true); 185 return; 186 default: 187 panic("Unexpected pfrc (%d)\n", pfcr); 188 break; 189 } 190 } 160 191 161 192 /* Record access to PTE */
Note:
See TracChangeset
for help on using the changeset viewer.