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

Function rt_hw_mmu_map

libcpu/aarch64/common/mmu.c:277–347  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

275}
276
277void *rt_hw_mmu_map(rt_aspace_t aspace, void *v_addr, void *p_addr, size_t size,
278 size_t attr)
279{
280 int ret = -1;
281
282 void *unmap_va = v_addr;
283 size_t remaining_sz = size;
284 size_t stride;
285 int (*mapper)(unsigned long *lv0_tbl, void *vaddr, void *paddr, unsigned long attr);
286
287 RT_ASSERT(!(size & ARCH_PAGE_MASK));
288
289 while (remaining_sz)
290 {
291 if (((rt_ubase_t)v_addr & ARCH_SECTION_MASK) ||
292 ((rt_ubase_t)p_addr & ARCH_SECTION_MASK) ||
293 (remaining_sz < ARCH_SECTION_SIZE))
294 {
295 /* legacy 4k mapping */
296 stride = ARCH_PAGE_SIZE;
297 mapper = _kernel_map_4K;
298 }
299 else
300 {
301 /* 2m huge page */
302 stride = ARCH_SECTION_SIZE;
303 mapper = _kernel_map_2M;
304 }
305
306 /* check aliasing */
307 #ifdef RT_DEBUGGING_ALIASING
308 #define _ALIAS_OFFSET(addr) ((long)(addr) & (RT_PAGE_AFFINITY_BLOCK_SIZE - 1))
309 if (rt_page_is_member((rt_base_t)p_addr) && _ALIAS_OFFSET(v_addr) != _ALIAS_OFFSET(p_addr))
310 {
311 LOG_W("Possibly aliasing on va(0x%lx) to pa(0x%lx)", v_addr, p_addr);
312 rt_backtrace();
313 RT_ASSERT(0);
314 }
315 #endif /* RT_DEBUGGING_ALIASING */
316
317 MM_PGTBL_LOCK(aspace);
318 ret = mapper(aspace->page_table, v_addr, p_addr, attr);
319 MM_PGTBL_UNLOCK(aspace);
320
321 if (ret != 0)
322 {
323 /* other types of return value are taken as programming error */
324 RT_ASSERT(ret == MMU_MAP_ERROR_NOPAGE);
325 /* error, undo map */
326 while (unmap_va != v_addr)
327 {
328 MM_PGTBL_LOCK(aspace);
329 _kenrel_unmap_4K(aspace->page_table, (void *)unmap_va);
330 MM_PGTBL_UNLOCK(aspace);
331 unmap_va = (char *)unmap_va + stride;
332 }
333 break;
334 }

Callers

nothing calls this directly

Calls 3

rt_page_is_memberFunction · 0.85
_kenrel_unmap_4KFunction · 0.70
rt_backtraceFunction · 0.50

Tested by

no test coverage detected