| 1297 | } |
| 1298 | |
| 1299 | int rt_aspace_load_page(rt_aspace_t aspace, void *addr, rt_size_t npage) |
| 1300 | { |
| 1301 | int err = RT_EOK; |
| 1302 | rt_varea_t varea; |
| 1303 | char *end = (char *)addr + (npage << ARCH_PAGE_SHIFT); |
| 1304 | |
| 1305 | WR_LOCK(aspace); |
| 1306 | varea = _aspace_bst_search(aspace, addr); |
| 1307 | WR_UNLOCK(aspace); |
| 1308 | |
| 1309 | if (!varea) |
| 1310 | { |
| 1311 | LOG_W("%s: varea not exist(addr=%p)", __func__, addr); |
| 1312 | err = -RT_ENOENT; |
| 1313 | } |
| 1314 | else if ((char *)addr >= end || (rt_size_t)addr & ARCH_PAGE_MASK || |
| 1315 | _not_in_range(MMF_MAP_FIXED, addr, npage << ARCH_PAGE_SHIFT, |
| 1316 | varea->start, varea->size)) |
| 1317 | { |
| 1318 | LOG_W("%s: Unaligned parameter or out of range", __func__); |
| 1319 | err = -RT_EINVAL; |
| 1320 | } |
| 1321 | else |
| 1322 | { |
| 1323 | err = _do_prefetch(aspace, varea, addr, npage << ARCH_PAGE_SHIFT); |
| 1324 | } |
| 1325 | return err; |
| 1326 | } |
| 1327 | |
| 1328 | int rt_varea_map_page(rt_varea_t varea, void *vaddr, void *page) |
| 1329 | { |
no test coverage detected