| 670 | } |
| 671 | |
| 672 | int rt_aspace_map(rt_aspace_t aspace, void **addr, rt_size_t length, |
| 673 | rt_size_t attr, mm_flag_t flags, rt_mem_obj_t mem_obj, |
| 674 | rt_size_t offset) |
| 675 | { |
| 676 | int err; |
| 677 | rt_varea_t varea = RT_NULL; |
| 678 | |
| 679 | RT_DEBUG_SCHEDULER_AVAILABLE(1); |
| 680 | |
| 681 | if (!aspace || !addr || !mem_obj || length == 0) |
| 682 | { |
| 683 | err = -RT_EINVAL; |
| 684 | LOG_I("%s(%p, %p, %lx, %lx, %lx, %p, %lx): Invalid input", |
| 685 | __func__, aspace, addr, length, attr, flags, mem_obj, offset); |
| 686 | } |
| 687 | else if (_not_in_range(flags, *addr, length, aspace->start, aspace->size)) |
| 688 | { |
| 689 | err = -RT_EINVAL; |
| 690 | LOG_I("%s(addr:%p, len:%lx): out of range", __func__, *addr, length); |
| 691 | } |
| 692 | else if (_not_support(flags)) |
| 693 | { |
| 694 | LOG_I("%s: no support flags 0x%lx", __func__, flags); |
| 695 | err = -RT_ENOSYS; |
| 696 | } |
| 697 | else |
| 698 | { |
| 699 | RT_ASSERT((length & ARCH_PAGE_MASK) == 0); |
| 700 | RT_ASSERT(((long)*addr & ARCH_PAGE_MASK) == 0); |
| 701 | err = _mm_aspace_map(aspace, &varea, addr, length, attr, flags, mem_obj, offset); |
| 702 | } |
| 703 | |
| 704 | if (err != RT_EOK) |
| 705 | { |
| 706 | *addr = NULL; |
| 707 | } |
| 708 | |
| 709 | return err; |
| 710 | } |
| 711 | |
| 712 | int rt_aspace_map_static(rt_aspace_t aspace, rt_varea_t varea, void **addr, |
| 713 | rt_size_t length, rt_size_t attr, mm_flag_t flags, |