Changes in kernel/arch/sparc64/src/mm/sun4v/tlb.c [9d58539:b2fa1204] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4v/tlb.c
r9d58539 rb2fa1204 46 46 #include <arch.h> 47 47 #include <print.h> 48 #include <log.h> 48 49 #include <typedefs.h> 49 50 #include <config.h> … … 62 63 static void itlb_pte_copy(pte_t *); 63 64 static void dtlb_pte_copy(pte_t *, bool); 64 static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,65 const char *);66 static void do_fast_data_access_mmu_miss_fault(istate_t *, uint64_t,67 const char *);68 static void do_fast_data_access_protection_fault(istate_t *,69 uint64_t, const char *);70 65 71 66 /* … … 235 230 * handler. 236 231 */ 237 if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) { 238 do_fast_instruction_access_mmu_miss_fault(istate, 239 istate->tpc, __func__); 240 } 232 as_page_fault(va, PF_ACCESS_EXEC, istate); 241 233 } 242 234 } … … 260 252 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 261 253 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 254 as_t *as = AS; 262 255 263 256 if (ctx == ASID_KERNEL) { 264 257 if (va == 0) { 265 258 /* NULL access in kernel */ 266 do_fast_data_access_mmu_miss_fault(istate, page_and_ctx, 267 __func__); 259 panic("NULL pointer dereference."); 260 } else if (va >= end_of_identity) { 261 /* Kernel non-identity */ 262 as = AS_KERNEL; 263 } else { 264 panic("Unexpected kernel page fault."); 268 265 } 269 do_fast_data_access_mmu_miss_fault(istate, page_and_ctx, "Unexpected " 270 "kernel page fault."); 271 } 272 273 t = page_mapping_find(AS, va, true); 266 } 267 268 t = page_mapping_find(as, va, true); 274 269 if (t) { 275 270 /* … … 287 282 * handler. 288 283 */ 289 if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { 290 do_fast_data_access_mmu_miss_fault(istate, page_and_ctx, 291 __func__); 292 } 284 as_page_fault(va, PF_ACCESS_READ, istate); 293 285 } 294 286 } … … 309 301 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 310 302 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 311 312 t = page_mapping_find(AS, va, true); 303 as_t *as = AS; 304 305 if (ctx == ASID_KERNEL) 306 as = AS_KERNEL; 307 308 t = page_mapping_find(as, va, true); 313 309 if (t && PTE_WRITABLE(t)) { 314 310 /* … … 329 325 * handler. 330 326 */ 331 if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) { 332 do_fast_data_access_protection_fault(istate, page_and_ctx, 333 __func__); 334 } 327 as_page_fault(va, PF_ACCESS_WRITE, istate); 335 328 } 336 329 } … … 343 336 void tlb_print(void) 344 337 { 345 printf("Operation not possible on Niagara.\n"); 346 } 347 348 void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, uintptr_t va, 349 const char *str) 350 { 351 fault_if_from_uspace(istate, "%s, address=%p.", str, 352 (void *) va); 353 panic_memtrap(istate, PF_ACCESS_EXEC, va, str); 354 } 355 356 void do_fast_data_access_mmu_miss_fault(istate_t *istate, 357 uint64_t page_and_ctx, const char *str) 358 { 359 fault_if_from_uspace(istate, "%s, page=%p (asid=%" PRId64 ").", str, 360 (void *) DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx)); 361 panic_memtrap(istate, PF_ACCESS_UNKNOWN, DMISS_ADDRESS(page_and_ctx), 362 str); 363 } 364 365 void do_fast_data_access_protection_fault(istate_t *istate, 366 uint64_t page_and_ctx, const char *str) 367 { 368 fault_if_from_uspace(istate, "%s, page=%p (asid=%" PRId64 ").", str, 369 (void *) DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx)); 370 panic_memtrap(istate, PF_ACCESS_WRITE, DMISS_ADDRESS(page_and_ctx), 371 str); 338 log(LF_ARCH, LVL_WARN, "Operation not possible on Niagara."); 372 339 } 373 340
Note:
See TracChangeset
for help on using the changeset viewer.