allocate memory page for mapping range */
| 243 | |
| 244 | /* allocate memory page for mapping range */ |
| 245 | static 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 | |
| 280 | static rt_err_t _expand_varea(rt_varea_t varea, void *new_va, rt_size_t size) |
| 281 | { |
no test coverage detected