| 1437 | } |
| 1438 | |
| 1439 | int rt_aspace_control(rt_aspace_t aspace, void *addr, enum rt_mmu_cntl cmd) |
| 1440 | { |
| 1441 | int err; |
| 1442 | rt_varea_t varea; |
| 1443 | |
| 1444 | WR_LOCK(aspace); |
| 1445 | varea = _aspace_bst_search(aspace, addr); |
| 1446 | WR_UNLOCK(aspace); |
| 1447 | |
| 1448 | if (varea) |
| 1449 | { |
| 1450 | err = rt_hw_mmu_control(aspace, varea->start, varea->size, cmd); |
| 1451 | if (err == RT_EOK) |
| 1452 | { |
| 1453 | rt_hw_tlb_invalidate_range(aspace, varea->start, varea->size, ARCH_PAGE_SIZE); |
| 1454 | } |
| 1455 | } |
| 1456 | else |
| 1457 | { |
| 1458 | err = -RT_ENOENT; |
| 1459 | } |
| 1460 | |
| 1461 | return err; |
| 1462 | } |
| 1463 | |
| 1464 | int rt_aspace_traversal(rt_aspace_t aspace, |
| 1465 | int (*fn)(rt_varea_t varea, void *arg), void *arg) |