MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _override_map

Function _override_map

components/mm/mm_anon.c:495–548  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

493}
494
495static 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:

Callers 1

Calls 8

_get_private_objFunction · 0.85
_mm_aspace_mapFunction · 0.85
rt_varea_map_with_msgFunction · 0.85
rt_varea_pgmgr_insertFunction · 0.85
rt_pages_freeFunction · 0.85
rt_freeFunction · 0.85
rt_hw_mmu_attr_add_permFunction · 0.50
rt_hw_mmu_v2pFunction · 0.50

Tested by

no test coverage detected