|
@@ -204,10 +204,12 @@ static int _do_prefetch(rt_aspace_t aspace, rt_varea_t varea, void *start,
|
|
|
LOG_W("%s: MMU mapping failed for va %p to %p of %lx", __func__,
|
|
|
vaddr, store + PV_OFFSET, store_sz);
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rt_hw_tlb_invalidate_range(aspace, vaddr, store_sz, ARCH_PAGE_SIZE);
|
|
|
+ }
|
|
|
vaddr += store_sz;
|
|
|
off += store_sz >> ARCH_PAGE_SHIFT;
|
|
|
-
|
|
|
- rt_hw_tlb_invalidate_range(aspace, vaddr, store_sz, ARCH_PAGE_SIZE);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -235,7 +237,7 @@ int _varea_install(rt_aspace_t aspace, rt_varea_t varea, rt_mm_va_hint_t hint)
|
|
|
|
|
|
/* TODO try merge surrounding regions to optimize memory footprint */
|
|
|
|
|
|
- if (alloc_va != ARCH_MAP_FAILED)
|
|
|
+ if (alloc_va != RT_NULL)
|
|
|
{
|
|
|
varea->start = alloc_va;
|
|
|
_aspace_bst_insert(aspace, varea);
|
|
@@ -285,9 +287,10 @@ static int _mm_aspace_map(rt_aspace_t aspace, rt_varea_t varea, rt_size_t attr,
|
|
|
static inline int _not_in_range(void *start, rt_size_t length,
|
|
|
void *limit_start, rt_size_t limit_size)
|
|
|
{
|
|
|
- LOG_D("%s: [%p : %p] [%p : %p]", __func__, start, length, limit_start, limit_size);
|
|
|
+ if (start != RT_NULL)
|
|
|
+ LOG_D("%s: [%p : %p] [%p : %p]", __func__, start, length, limit_start, limit_size);
|
|
|
/* assuming (base + length) will not overflow except (0) */
|
|
|
- return start != ARCH_MAP_FAILED
|
|
|
+ return start != RT_NULL
|
|
|
? ((length > (0ul - (uintptr_t)start)) || start < limit_start ||
|
|
|
(length + (rt_size_t)(start - limit_start)) > limit_size)
|
|
|
: length > limit_size;
|
|
@@ -295,7 +298,7 @@ static inline int _not_in_range(void *start, rt_size_t length,
|
|
|
|
|
|
static inline int _not_align(void *start, rt_size_t length, rt_size_t mask)
|
|
|
{
|
|
|
- return (start != ARCH_MAP_FAILED) &&
|
|
|
+ return (start != RT_NULL) &&
|
|
|
(((uintptr_t)start & mask) || (length & mask));
|
|
|
}
|
|
|
|
|
@@ -438,7 +441,7 @@ int _mm_aspace_map_phy(rt_aspace_t aspace, rt_varea_t varea,
|
|
|
if (err == RT_EOK)
|
|
|
*ret_va = vaddr;
|
|
|
else
|
|
|
- *ret_va = ARCH_MAP_FAILED;
|
|
|
+ *ret_va = RT_NULL;
|
|
|
}
|
|
|
|
|
|
return err;
|
|
@@ -511,8 +514,7 @@ void _aspace_unmap(rt_aspace_t aspace, void *addr, rt_size_t length)
|
|
|
WR_UNLOCK(aspace);
|
|
|
|
|
|
rt_hw_mmu_unmap(aspace, varea->start, varea->size);
|
|
|
- rt_hw_tlb_invalidate_range(aspace, varea->start, varea->size,
|
|
|
- ARCH_PAGE_SIZE);
|
|
|
+ rt_hw_tlb_invalidate_range(aspace, varea->start, varea->size, ARCH_PAGE_SIZE);
|
|
|
|
|
|
rt_free(varea);
|
|
|
varea = _aspace_bst_search_overlap(aspace, range);
|
|
@@ -552,7 +554,7 @@ static inline void *_align(void *va, rt_ubase_t align_mask)
|
|
|
static void *_ascending_search(rt_varea_t varea, rt_size_t req_size,
|
|
|
rt_ubase_t align_mask, struct _mm_range limit)
|
|
|
{
|
|
|
- void *ret = ARCH_MAP_FAILED;
|
|
|
+ void *ret = RT_NULL;
|
|
|
while (varea && varea->start < limit.end)
|
|
|
{
|
|
|
void *candidate = varea->start + varea->size;
|
|
@@ -586,7 +588,7 @@ static void *_find_head_and_asc_search(rt_aspace_t aspace, rt_size_t req_size,
|
|
|
rt_ubase_t align_mask,
|
|
|
struct _mm_range limit)
|
|
|
{
|
|
|
- void *va = ARCH_MAP_FAILED;
|
|
|
+ void *va = RT_NULL;
|
|
|
|
|
|
rt_varea_t varea = _aspace_bst_search_exceed(aspace, limit.start);
|
|
|
if (varea)
|
|
@@ -638,7 +640,7 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
|
|
|
mm_flag_t flags)
|
|
|
{
|
|
|
rt_varea_t varea = NULL;
|
|
|
- void *va = ARCH_MAP_FAILED;
|
|
|
+ void *va = RT_NULL;
|
|
|
struct _mm_range limit = {limit_start, limit_start + limit_size - 1};
|
|
|
|
|
|
rt_ubase_t align_mask = ~0ul;
|
|
@@ -647,7 +649,7 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
|
|
|
align_mask = ~((1 << MMF_GET_ALIGN(flags)) - 1);
|
|
|
}
|
|
|
|
|
|
- if (prefer != ARCH_MAP_FAILED)
|
|
|
+ if (prefer != RT_NULL)
|
|
|
{
|
|
|
prefer = _align(prefer, align_mask);
|
|
|
struct _mm_range range = {prefer, prefer + req_size - 1};
|
|
@@ -659,11 +661,12 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
|
|
|
}
|
|
|
else if (flags & MMF_MAP_FIXED)
|
|
|
{
|
|
|
+ /* OVERLAP */
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
va = _ascending_search(varea, req_size, align_mask, limit);
|
|
|
- if (va == ARCH_MAP_FAILED)
|
|
|
+ if (va == RT_NULL)
|
|
|
{
|
|
|
limit.end = varea->start - 1;
|
|
|
va = _find_head_and_asc_search(aspace, req_size, align_mask,
|