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

Function _do_prefetch

components/mm/mm_aspace.c:245–278  ·  view source on GitHub ↗

allocate memory page for mapping range */

Source from the content-addressed store, hash-verified

243
244/* allocate memory page for mapping range */
245static int _do_prefetch(rt_aspace_t aspace, rt_varea_t varea, void *start,
246 rt_size_t size)
247{
248 int err = RT_EOK;
249
250 /* it's ensured by caller that start & size ara page-aligned */
251 char *end = (char *)start + size;
252 char *vaddr = start;
253 rt_size_t off = varea->offset + ((vaddr - (char *)varea->start) >> ARCH_PAGE_SHIFT);
254
255 while (vaddr != end)
256 {
257 /* TODO try to map with huge TLB, when flag & HUGEPAGE */
258 struct rt_aspace_fault_msg msg;
259 _do_page_fault(&msg, off, vaddr, varea->mem_obj, varea);
260
261 if (rt_varea_map_with_msg(varea, &msg))
262 {
263 err = -RT_ENOMEM;
264 break;
265 }
266 /**
267 * It's hard to identify the mapping pattern on a customized handler
268 * So we terminate the prefetch process on that case
269 */
270 if (msg.response.status == MM_FAULT_STATUS_OK_MAPPED)
271 break;
272
273 vaddr += msg.response.size;
274 off += msg.response.size >> ARCH_PAGE_SHIFT;
275 }
276
277 return err;
278}
279
280static rt_err_t _expand_varea(rt_varea_t varea, void *new_va, rt_size_t size)
281{

Callers 2

_mm_aspace_mapFunction · 0.85
rt_aspace_load_pageFunction · 0.85

Calls 2

_do_page_faultFunction · 0.85
rt_varea_map_with_msgFunction · 0.85

Tested by

no test coverage detected