Changeset a7961271 in mainline for kernel/arch/sparc64/src/mm
- Timestamp:
- 2006-08-26T18:42:11Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c8ea4a8b
- Parents:
- f47fd19
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/tlb.c
rf47fd19 ra7961271 51 51 #include <symtab.h> 52 52 53 static void dtlb_pte_copy(pte_t *t); 53 static void dtlb_pte_copy(pte_t *t, bool ro); 54 static void itlb_pte_copy(pte_t *t); 54 55 static void do_fast_data_access_mmu_miss_fault(istate_t *istate, const char *str); 56 static void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, const char *str); 55 57 56 58 char *context_encoding[] = { … … 106 108 } 107 109 108 void dtlb_pte_copy(pte_t *t) 109 { 110 /** Copy PTE to TLB. 111 * 112 * @param t Page Table Entry to be copied. 113 * @param ro If true, the entry will be created read-only, regardless of its w field. 114 */ 115 void dtlb_pte_copy(pte_t *t, bool ro) 116 { 117 tlb_tag_access_reg_t tag; 118 tlb_data_t data; 119 page_address_t pg; 120 frame_address_t fr; 121 122 pg.address = t->page; 123 fr.address = t->frame; 124 125 tag.value = 0; 126 tag.context = t->as->asid; 127 tag.vpn = pg.vpn; 128 129 dtlb_tag_access_write(tag.value); 130 131 data.value = 0; 132 data.v = true; 133 data.size = PAGESIZE_8K; 134 data.pfn = fr.pfn; 135 data.l = false; 136 data.cp = t->c; 137 data.cv = t->c; 138 data.p = t->p; 139 data.w = ro ? false : t->w; 140 data.g = t->g; 141 142 dtlb_data_in_write(data.value); 143 } 144 145 void itlb_pte_copy(pte_t *t) 146 { 147 tlb_tag_access_reg_t tag; 148 tlb_data_t data; 149 page_address_t pg; 150 frame_address_t fr; 151 152 pg.address = t->page; 153 fr.address = t->frame; 154 155 tag.value = 0; 156 tag.context = t->as->asid; 157 tag.vpn = pg.vpn; 158 159 itlb_tag_access_write(tag.value); 160 161 data.value = 0; 162 data.v = true; 163 data.size = PAGESIZE_8K; 164 data.pfn = fr.pfn; 165 data.l = false; 166 data.cp = t->c; 167 data.cv = t->c; 168 data.p = t->p; 169 data.w = false; 170 data.g = t->g; 171 172 itlb_data_in_write(data.value); 110 173 } 111 174 … … 113 176 void fast_instruction_access_mmu_miss(int n, istate_t *istate) 114 177 { 115 panic("%s\n", __FUNCTION__); 178 uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE); 179 pte_t *t; 180 181 page_table_lock(AS, true); 182 t = page_mapping_find(AS, va); 183 if (t && PTE_EXECUTABLE(t)) { 184 /* 185 * The mapping was found in the software page hash table. 186 * Insert it into ITLB. 187 */ 188 t->a = true; 189 itlb_pte_copy(t); 190 page_table_unlock(AS, true); 191 } else { 192 /* 193 * Forward the page fault to the address space page fault handler. 194 */ 195 page_table_unlock(AS, true); 196 if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) { 197 do_fast_instruction_access_mmu_miss_fault(istate, __FUNCTION__); 198 } 199 } 116 200 } 117 201 … … 145 229 * Insert it into DTLB. 146 230 */ 147 dtlb_pte_copy(t); 231 t->a = true; 232 dtlb_pte_copy(t, true); 148 233 page_table_unlock(AS, true); 149 234 } else { … … 191 276 } 192 277 278 void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, const char *str) 279 { 280 char *tpc_str = get_symtab_entry(istate->tpc); 281 282 printf("TPC=%p, (%s)\n", istate->tpc, tpc_str); 283 panic("%s\n", str); 284 } 285 193 286 void do_fast_data_access_mmu_miss_fault(istate_t *istate, const char *str) 194 287 {
Note:
See TracChangeset
for help on using the changeset viewer.