Changes in kernel/arch/sparc64/src/mm/sun4v/tlb.c [1dbc43f:560b81c] in mainline
- File:
-
- 1 edited
-
kernel/arch/sparc64/src/mm/sun4v/tlb.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4v/tlb.c
r1dbc43f r560b81c 46 46 #include <arch.h> 47 47 #include <print.h> 48 #include <log.h> 48 49 #include <typedefs.h> 49 50 #include <config.h> … … 207 208 208 209 /** ITLB miss handler. */ 209 void fast_instruction_access_mmu_miss( sysarg_t unused, istate_t *istate)210 void fast_instruction_access_mmu_miss(unsigned int tt, istate_t *istate) 210 211 { 211 212 uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE); 212 pte_t *t; 213 214 t = page_mapping_find(AS, va, true); 215 216 if (t && PTE_EXECUTABLE(t)) { 213 pte_t t; 214 215 bool found = page_mapping_find(AS, va, true, &t); 216 if (found && PTE_EXECUTABLE(&t)) { 217 ASSERT(t.p); 218 217 219 /* 218 220 * The mapping was found in the software page hash table. 219 221 * Insert it into ITLB. 220 222 */ 221 t ->a = true;222 itlb_pte_copy( t);223 t.a = true; 224 itlb_pte_copy(&t); 223 225 #ifdef CONFIG_TSB 224 itsb_pte_copy(t); 225 #endif 226 itsb_pte_copy(&t); 227 #endif 228 page_mapping_update(AS, va, true, &t); 226 229 } else { 227 230 /* … … 238 241 * low-level, assembly language part of the fast_data_access_mmu_miss handler. 239 242 * 240 * @param page_and_ctx A 64-bit value describing the fault. The most 241 * significant 51 bits of the value contain the virtual 242 * address which caused the fault truncated to the page 243 * boundary. The least significant 13 bits of the value 244 * contain the number of the context in which the fault 245 * occurred. 243 * @param tt Trap type. 246 244 * @param istate Interrupted state saved on the stack. 247 245 */ 248 void fast_data_access_mmu_miss(uint64_t page_and_ctx, istate_t *istate) 249 { 250 pte_t *t; 251 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 252 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 246 void fast_data_access_mmu_miss(unsigned int tt, istate_t *istate) 247 { 248 pte_t t; 249 uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access); 250 uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access); 251 as_t *as = AS; 253 252 254 253 if (ctx == ASID_KERNEL) { … … 256 255 /* NULL access in kernel */ 257 256 panic("NULL pointer dereference."); 257 } else if (va >= end_of_identity) { 258 /* Kernel non-identity */ 259 as = AS_KERNEL; 260 } else { 261 panic("Unexpected kernel page fault."); 258 262 } 259 panic("Unexpected kernel page fault."); 260 } 261 262 t = page_mapping_find(AS, va, true); 263 if (t) { 263 } 264 265 bool found = page_mapping_find(as, va, true, &t); 266 if (found) { 267 ASSERT(t.p); 268 264 269 /* 265 270 * The mapping was found in the software page hash table. 266 271 * Insert it into DTLB. 267 272 */ 268 t ->a = true;269 dtlb_pte_copy( t, true);273 t.a = true; 274 dtlb_pte_copy(&t, true); 270 275 #ifdef CONFIG_TSB 271 dtsb_pte_copy(t, true); 272 #endif 276 dtsb_pte_copy(&t, true); 277 #endif 278 page_mapping_update(as, va, true, &t); 273 279 } else { 274 280 /* … … 282 288 /** DTLB protection fault handler. 283 289 * 284 * @param page_and_ctx A 64-bit value describing the fault. The most 285 * significant 51 bits of the value contain the virtual 286 * address which caused the fault truncated to the page 287 * boundary. The least significant 13 bits of the value 288 * contain the number of the context in which the fault 289 * occurred. 290 * @param tt Trap type. 290 291 * @param istate Interrupted state saved on the stack. 291 292 */ 292 void fast_data_access_protection(uint64_t page_and_ctx, istate_t *istate) 293 { 294 pte_t *t; 295 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 296 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 297 298 t = page_mapping_find(AS, va, true); 299 if (t && PTE_WRITABLE(t)) { 293 void fast_data_access_protection(unsigned int tt, istate_t *istate) 294 { 295 pte_t t; 296 uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access); 297 uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access); 298 as_t *as = AS; 299 300 if (ctx == ASID_KERNEL) 301 as = AS_KERNEL; 302 303 bool found = page_mapping_find(as, va, true, &t); 304 if (found && PTE_WRITABLE(&t)) { 305 ASSERT(t.p); 306 300 307 /* 301 308 * The mapping was found in the software page hash table and is … … 303 310 * into DTLB. 304 311 */ 305 t ->a = true;306 t ->d = true;312 t.a = true; 313 t.d = true; 307 314 mmu_demap_page(va, ctx, MMU_FLAG_DTLB); 308 dtlb_pte_copy( t, false);315 dtlb_pte_copy(&t, false); 309 316 #ifdef CONFIG_TSB 310 dtsb_pte_copy(t, false); 311 #endif 317 dtsb_pte_copy(&t, false); 318 #endif 319 page_mapping_update(as, va, true, &t); 312 320 } else { 313 321 /* … … 326 334 void tlb_print(void) 327 335 { 328 printf("Operation not possible on Niagara.\n");336 log(LF_ARCH, LVL_WARN, "Operation not possible on Niagara."); 329 337 } 330 338 … … 383 391 384 392 for (i = 0; i < cnt; i++) { 385 __hypercall_fast5(MMU_DEMAP_PAGE, 0, 0, page , asid,386 MMU_FLAG_DTLB | MMU_FLAG_ITLB);393 __hypercall_fast5(MMU_DEMAP_PAGE, 0, 0, page + i * PAGE_SIZE, 394 asid, MMU_FLAG_DTLB | MMU_FLAG_ITLB); 387 395 } 388 396
Note:
See TracChangeset
for help on using the changeset viewer.
