| 372 | } |
| 373 | |
| 374 | static void _anon_page_read(struct rt_varea *varea, struct rt_aspace_io_msg *iomsg) |
| 375 | { |
| 376 | rt_aspace_t curr_aspace = varea->aspace; |
| 377 | rt_aspace_t backup = _anon_obj_get_backup(varea->mem_obj); |
| 378 | |
| 379 | if (rt_hw_mmu_v2p(curr_aspace, iomsg->fault_vaddr) == ARCH_MAP_FAILED) |
| 380 | { |
| 381 | struct rt_aspace_fault_msg msg; |
| 382 | msg.fault_op = MM_FAULT_OP_READ; |
| 383 | msg.fault_type = MM_FAULT_TYPE_PAGE_FAULT; |
| 384 | msg.fault_vaddr = iomsg->fault_vaddr; |
| 385 | msg.off = iomsg->off; |
| 386 | rt_mm_fault_res_init(&msg.response); |
| 387 | |
| 388 | _fetch_page_for_varea(varea, &msg, RT_FALSE); |
| 389 | if (msg.response.status != MM_FAULT_STATUS_UNRECOVERABLE) |
| 390 | { |
| 391 | void *saved_fault_va = iomsg->fault_vaddr; |
| 392 | iomsg->fault_vaddr = (void *)(iomsg->off << MM_PAGE_SHIFT); |
| 393 | read_by_mte(backup, iomsg); |
| 394 | iomsg->fault_vaddr = saved_fault_va; |
| 395 | } |
| 396 | } |
| 397 | else |
| 398 | { |
| 399 | read_by_mte(curr_aspace, iomsg); |
| 400 | } |
| 401 | } |
| 402 | |
| 403 | static void write_by_mte(rt_aspace_t aspace, struct rt_aspace_io_msg *iomsg) |
| 404 | { |
nothing calls this directly
no test coverage detected