| 275 | } |
| 276 | |
| 277 | void *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 | } |
nothing calls this directly
no test coverage detected