| 493 | } |
| 494 | |
| 495 | static int _override_map(rt_varea_t varea, rt_aspace_t aspace, void *fault_vaddr, struct rt_aspace_fault_msg *msg, void *page) |
| 496 | { |
| 497 | int rc = MM_FAULT_FIXABLE_FALSE; |
| 498 | rt_mem_obj_t private_object; |
| 499 | rt_varea_t map_varea = RT_NULL; |
| 500 | rt_err_t error; |
| 501 | rt_size_t flags; |
| 502 | rt_size_t attr; |
| 503 | |
| 504 | LOG_D("%s", __func__); |
| 505 | |
| 506 | private_object = _get_private_obj(aspace); |
| 507 | |
| 508 | if (private_object) |
| 509 | { |
| 510 | flags = varea->flag | MMF_MAP_FIXED; |
| 511 | /* don't prefetch and do it latter */ |
| 512 | flags &= ~MMF_PREFETCH; |
| 513 | attr = rt_hw_mmu_attr_add_perm(varea->attr, RT_HW_MMU_PROT_USER | RT_HW_MMU_PROT_WRITE); |
| 514 | |
| 515 | /* override existing mapping at fault_vaddr */ |
| 516 | error = _mm_aspace_map( |
| 517 | aspace, &map_varea, &fault_vaddr, ARCH_PAGE_SIZE, attr, |
| 518 | flags, private_object, MM_PA_TO_OFF(fault_vaddr)); |
| 519 | |
| 520 | if (error == RT_EOK) |
| 521 | { |
| 522 | msg->response.status = MM_FAULT_STATUS_OK; |
| 523 | msg->response.vaddr = page; |
| 524 | msg->response.size = ARCH_PAGE_SIZE; |
| 525 | if (rt_varea_map_with_msg(map_varea, msg) != RT_EOK) |
| 526 | { |
| 527 | LOG_E("%s: fault_va=%p,(priv_va=%p,priv_sz=0x%lx) at %s", __func__, msg->fault_vaddr, map_varea->start, map_varea->size, VAREA_NAME(map_varea)); |
| 528 | RT_ASSERT(0 && "should never failed"); |
| 529 | } |
| 530 | RT_ASSERT(rt_hw_mmu_v2p(aspace, msg->fault_vaddr) == (page + PV_OFFSET)); |
| 531 | rc = MM_FAULT_FIXABLE_TRUE; |
| 532 | rt_varea_pgmgr_insert(map_varea, page); |
| 533 | rt_pages_free(page, 0); |
| 534 | } |
| 535 | else |
| 536 | { |
| 537 | /* private object will be release on destruction of aspace */ |
| 538 | rt_free(map_varea); |
| 539 | } |
| 540 | } |
| 541 | else |
| 542 | { |
| 543 | LOG_I("%s: out of memory", __func__); |
| 544 | rc = MM_FAULT_FIXABLE_FALSE; |
| 545 | } |
| 546 | |
| 547 | return rc; |
| 548 | } |
| 549 | |
| 550 | /** |
| 551 | * replace an existing mapping to a private one, this is identical to: |
no test coverage detected