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

Function _write_fault

components/mm/mm_fault.c:55–93  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

53}
54
55static int _write_fault(rt_varea_t varea, void *pa, struct rt_aspace_fault_msg *msg)
56{
57 rt_aspace_t aspace = varea->aspace;
58 int err = MM_FAULT_FIXABLE_FALSE;
59
60 if (rt_varea_is_private_locked(varea))
61 {
62 if (VAREA_IS_WRITABLE(varea) && (
63 msg->fault_type == MM_FAULT_TYPE_RWX_PERM ||
64 msg->fault_type == MM_FAULT_TYPE_PAGE_FAULT))
65 {
66 RDWR_LOCK(aspace);
67 err = rt_varea_fix_private_locked(varea, pa, msg, RT_FALSE);
68 RDWR_UNLOCK(aspace);
69 if (err == MM_FAULT_FIXABLE_FALSE)
70 LOG_I("%s: fix private failure", __func__);
71 }
72 else
73 {
74 LOG_I("%s: No permission on %s(attr=0x%lx,writable=%s,fault_type=%d)",
75 __func__, VAREA_NAME(varea), varea->attr,
76 VAREA_IS_WRITABLE(varea) ? "True" : "False", msg->fault_type);
77 }
78 }
79 else if (msg->fault_type == MM_FAULT_TYPE_PAGE_FAULT)
80 {
81 RT_ASSERT(pa == ARCH_MAP_FAILED);
82 RT_ASSERT(!(varea->flag & MMF_PREFETCH));
83 err = _fetch_page(varea, msg);
84 if (err == MM_FAULT_FIXABLE_FALSE)
85 LOG_I("%s: page fault failure", __func__);
86 }
87 else
88 {
89 LOG_D("%s: can not fix", __func__);
90 /* signal a fault to user? */
91 }
92 return err;
93}
94
95static int _exec_fault(rt_varea_t varea, void *pa, struct rt_aspace_fault_msg *msg)
96{

Callers 1

rt_aspace_fault_try_fixFunction · 0.85

Calls 3

_fetch_pageFunction · 0.85

Tested by

no test coverage detected