@@ -134,24 +134,16 @@ static int _do_named_map(rt_aspace_t aspace, void *vaddr, rt_size_t length,
134
134
int err = RT_EOK ;
135
135
136
136
/* it's ensured by caller that (void*)end will not overflow */
137
- void * end = vaddr + length ;
138
137
void * phyaddr = (void * )(offset << MM_PAGE_SHIFT );
139
- while (vaddr != end )
138
+
139
+ void * ret = rt_hw_mmu_map (aspace , vaddr , phyaddr , length , attr );
140
+ if (ret == RT_NULL )
140
141
{
141
- /* TODO try to map with huge TLB, when flag & HUGEPAGE */
142
- rt_size_t pgsz = ARCH_PAGE_SIZE ;
143
- void * ret = rt_hw_mmu_map (aspace , vaddr , phyaddr , pgsz , attr );
144
- if (ret == RT_NULL )
145
- {
146
- err = - RT_ERROR ;
147
- break ;
148
- }
149
- vaddr += pgsz ;
150
- phyaddr += pgsz ;
142
+ err = - RT_ERROR ;
151
143
}
152
144
153
145
if (err == RT_EOK )
154
- rt_hw_tlb_invalidate_range (aspace , end - length , length , ARCH_PAGE_SIZE );
146
+ rt_hw_tlb_invalidate_range (aspace , vaddr , length , ARCH_PAGE_SIZE );
155
147
156
148
return err ;
157
149
}
@@ -164,7 +156,7 @@ rt_inline void _do_page_fault(struct rt_aspace_fault_msg *msg, rt_size_t off,
164
156
msg -> fault_vaddr = vaddr ;
165
157
msg -> fault_op = MM_FAULT_OP_READ ;
166
158
msg -> fault_type = MM_FAULT_TYPE_PAGE_FAULT ;
167
- msg -> response .status = -1 ;
159
+ msg -> response .status = MM_FAULT_STATUS_UNRECOVERABLE ;
168
160
msg -> response .vaddr = 0 ;
169
161
msg -> response .size = 0 ;
170
162
@@ -180,9 +172,9 @@ int _varea_map_with_msg(rt_varea_t varea, struct rt_aspace_fault_msg *msg)
180
172
* the page returned by handler is not checked
181
173
* cause no much assumption can make on it
182
174
*/
183
- void * store = msg -> response .vaddr ;
175
+ char * store = msg -> response .vaddr ;
184
176
rt_size_t store_sz = msg -> response .size ;
185
- if (msg -> fault_vaddr + store_sz > varea -> start + varea -> size )
177
+ if (( char * ) msg -> fault_vaddr + store_sz > ( char * ) varea -> start + varea -> size )
186
178
{
187
179
LOG_W ("%s: too much (0x%lx) of buffer on vaddr %p is provided" ,
188
180
__func__ , store_sz , msg -> fault_vaddr );
@@ -232,9 +224,9 @@ static int _do_prefetch(rt_aspace_t aspace, rt_varea_t varea, void *start,
232
224
int err = RT_EOK ;
233
225
234
226
/* it's ensured by caller that start & size ara page-aligned */
235
- void * end = start + size ;
236
- void * vaddr = start ;
237
- rt_size_t off = varea -> offset + ((start - varea -> start ) >> ARCH_PAGE_SHIFT );
227
+ char * end = ( char * ) start + size ;
228
+ char * vaddr = start ;
229
+ rt_size_t off = varea -> offset + ((vaddr - ( char * ) varea -> start ) >> ARCH_PAGE_SHIFT );
238
230
239
231
while (vaddr != end )
240
232
{
@@ -243,8 +235,10 @@ static int _do_prefetch(rt_aspace_t aspace, rt_varea_t varea, void *start,
243
235
_do_page_fault (& msg , off , vaddr , varea -> mem_obj , varea );
244
236
245
237
if (_varea_map_with_msg (varea , & msg ))
238
+ {
239
+ err = - RT_ENOMEM ;
246
240
break ;
247
-
241
+ }
248
242
/**
249
243
* It's hard to identify the mapping pattern on a customized handler
250
244
* So we terminate the prefetch process on that case
@@ -386,7 +380,7 @@ rt_varea_t _varea_create(void *start, rt_size_t size)
386
380
}
387
381
388
382
#define _IS_OVERFLOW (start , length ) ((length) > (0ul - (uintptr_t)(start)))
389
- #define _IS_OVERSIZE (start , length , limit_s , limit_sz ) (((length) + (rt_size_t)((start) - (limit_start))) > (limit_size))
383
+ #define _IS_OVERSIZE (start , length , limit_s , limit_sz ) (((length) + (rt_size_t)((char *)( start) - (char *) (limit_start))) > (limit_size))
390
384
391
385
static inline int _not_in_range (void * start , rt_size_t length ,
392
386
void * limit_start , rt_size_t limit_size )
@@ -642,7 +636,7 @@ int rt_aspace_unmap(rt_aspace_t aspace, void *addr)
642
636
if (_not_in_range (addr , 1 , aspace -> start , aspace -> size ))
643
637
{
644
638
LOG_I ("%s: %lx not in range of aspace[%lx:%lx]" , __func__ , addr ,
645
- aspace -> start , aspace -> start + aspace -> size );
639
+ aspace -> start , ( char * ) aspace -> start + aspace -> size );
646
640
return - RT_EINVAL ;
647
641
}
648
642
@@ -658,7 +652,7 @@ static inline void *_lower(void *a, void *b)
658
652
659
653
static inline void * _align (void * va , rt_ubase_t align_mask )
660
654
{
661
- return (void * )((rt_ubase_t )(va + ~align_mask ) & align_mask );
655
+ return (void * )((rt_ubase_t )(( char * ) va + ~align_mask ) & align_mask );
662
656
}
663
657
664
658
static void * _ascending_search (rt_varea_t varea , rt_size_t req_size ,
@@ -667,17 +661,17 @@ static void *_ascending_search(rt_varea_t varea, rt_size_t req_size,
667
661
void * ret = RT_NULL ;
668
662
while (varea && varea -> start < limit .end )
669
663
{
670
- void * candidate = varea -> start + varea -> size ;
664
+ char * candidate = ( char * ) varea -> start + varea -> size ;
671
665
candidate = _align (candidate , align_mask );
672
666
673
- if (candidate > limit .end || limit .end - candidate + 1 < req_size )
667
+ if (candidate > ( char * ) limit .end || ( char * ) limit .end - candidate + 1 < req_size )
674
668
break ;
675
669
676
670
rt_varea_t nx_va = ASPACE_VAREA_NEXT (varea );
677
671
if (nx_va )
678
672
{
679
673
rt_size_t gap_size =
680
- _lower (limit .end , nx_va -> start - 1 ) - candidate + 1 ;
674
+ ( char * ) _lower (limit .end , ( char * ) nx_va -> start - 1 ) - candidate + 1 ;
681
675
if (gap_size >= req_size )
682
676
{
683
677
ret = candidate ;
@@ -703,15 +697,15 @@ static void *_find_head_and_asc_search(rt_aspace_t aspace, rt_size_t req_size,
703
697
rt_varea_t varea = _aspace_bst_search_exceed (aspace , limit .start );
704
698
if (varea )
705
699
{
706
- void * candidate = _align (limit .start , align_mask );
707
- rt_size_t gap_size = varea -> start - candidate ;
700
+ char * candidate = _align (limit .start , align_mask );
701
+ rt_size_t gap_size = ( char * ) varea -> start - candidate ;
708
702
if (gap_size >= req_size )
709
703
{
710
704
rt_varea_t former = _aspace_bst_search (aspace , limit .start );
711
705
if (former )
712
706
{
713
- candidate = _align (former -> start + former -> size , align_mask );
714
- gap_size = varea -> start - candidate ;
707
+ candidate = _align (( char * ) former -> start + former -> size , align_mask );
708
+ gap_size = ( char * ) varea -> start - candidate ;
715
709
716
710
if (gap_size >= req_size )
717
711
va = candidate ;
@@ -730,12 +724,12 @@ static void *_find_head_and_asc_search(rt_aspace_t aspace, rt_size_t req_size,
730
724
}
731
725
else
732
726
{
733
- void * candidate ;
727
+ char * candidate ;
734
728
rt_size_t gap_size ;
735
729
736
730
candidate = limit .start ;
737
731
candidate = _align (candidate , align_mask );
738
- gap_size = limit .end - candidate + 1 ;
732
+ gap_size = ( char * ) limit .end - candidate + 1 ;
739
733
740
734
if (gap_size >= req_size )
741
735
va = candidate ;
@@ -750,7 +744,7 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
750
744
{
751
745
rt_varea_t varea = NULL ;
752
746
void * va = RT_NULL ;
753
- struct _mm_range limit = {limit_start , limit_start + limit_size - 1 };
747
+ struct _mm_range limit = {limit_start , ( char * ) limit_start + limit_size - 1 };
754
748
755
749
rt_ubase_t align_mask = ~0ul ;
756
750
if (flags & MMF_REQUEST_ALIGN )
@@ -762,7 +756,7 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
762
756
{
763
757
/* if prefer and free, just return the prefer region */
764
758
prefer = _align (prefer , align_mask );
765
- struct _mm_range range = {prefer , prefer + req_size - 1 };
759
+ struct _mm_range range = {prefer , ( char * ) prefer + req_size - 1 };
766
760
varea = _aspace_bst_search_overlap (aspace , range );
767
761
768
762
if (!varea )
@@ -780,7 +774,7 @@ static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
780
774
if (va == RT_NULL )
781
775
{
782
776
/* rewind to first range */
783
- limit .end = varea -> start - 1 ;
777
+ limit .end = ( char * ) varea -> start - 1 ;
784
778
va = _find_head_and_asc_search (aspace , req_size , align_mask ,
785
779
limit );
786
780
}
@@ -798,7 +792,7 @@ int rt_aspace_load_page(rt_aspace_t aspace, void *addr, rt_size_t npage)
798
792
{
799
793
int err = RT_EOK ;
800
794
rt_varea_t varea ;
801
- void * end = addr + (npage << ARCH_PAGE_SHIFT );
795
+ char * end = ( char * ) addr + (npage << ARCH_PAGE_SHIFT );
802
796
803
797
WR_LOCK (aspace );
804
798
varea = _aspace_bst_search (aspace , addr );
@@ -809,7 +803,7 @@ int rt_aspace_load_page(rt_aspace_t aspace, void *addr, rt_size_t npage)
809
803
LOG_W ("%s: varea not exist" , __func__ );
810
804
err = - RT_ENOENT ;
811
805
}
812
- else if (addr >= end || (rt_size_t )addr & ARCH_PAGE_MASK ||
806
+ else if (( char * ) addr >= end || (rt_size_t )addr & ARCH_PAGE_MASK ||
813
807
_not_in_range (addr , npage << ARCH_PAGE_SHIFT , varea -> start ,
814
808
varea -> size ))
815
809
{
@@ -938,12 +932,12 @@ static int _dump(rt_varea_t varea, void *arg)
938
932
{
939
933
if (varea -> mem_obj && varea -> mem_obj -> get_name )
940
934
{
941
- rt_kprintf ("[%p - %p] %s\n" , varea -> start , varea -> start + varea -> size ,
935
+ rt_kprintf ("[%p - %p] %s\n" , varea -> start , ( char * ) varea -> start + varea -> size ,
942
936
varea -> mem_obj -> get_name (varea ));
943
937
}
944
938
else
945
939
{
946
- rt_kprintf ("[%p - %p] phy-map\n" , varea -> start , varea -> start + varea -> size );
940
+ rt_kprintf ("[%p - %p] phy-map\n" , varea -> start , ( char * ) varea -> start + varea -> size );
947
941
rt_kprintf ("\t\\_ paddr = %p\n" , varea -> offset << MM_PAGE_SHIFT );
948
942
}
949
943
return 0 ;
0 commit comments