| 939 | } |
| 940 | |
| 941 | static rt_err_t _split_varea(rt_varea_t existed, char *ex_end, char *unmap_start, char *unmap_end, rt_size_t unmap_len) |
| 942 | { |
| 943 | int error; |
| 944 | size_t rela_offset; |
| 945 | rt_varea_t subset; |
| 946 | char *subset_start; |
| 947 | size_t subset_size; |
| 948 | |
| 949 | if (existed->mem_obj && existed->mem_obj->on_varea_split) |
| 950 | { |
| 951 | subset_start = unmap_end; |
| 952 | subset_size = ex_end - subset_start; |
| 953 | subset = _varea_create(subset_start, subset_size); |
| 954 | if (subset) |
| 955 | { |
| 956 | rela_offset = MM_PA_TO_OFF(subset_start - (char *)existed->start); |
| 957 | subset->aspace = existed->aspace; |
| 958 | subset->attr = existed->attr; |
| 959 | subset->mem_obj = existed->mem_obj; |
| 960 | subset->flag = existed->flag & ~MMF_STATIC_ALLOC; |
| 961 | subset->offset = existed->offset + rela_offset; |
| 962 | |
| 963 | error = existed->mem_obj->on_varea_split(existed, unmap_start, unmap_len, subset); |
| 964 | if (error == RT_EOK) |
| 965 | { |
| 966 | existed->size = unmap_start - (char *)existed->start; |
| 967 | _aspace_bst_insert(existed->aspace, subset); |
| 968 | } |
| 969 | |
| 970 | if (error != RT_EOK) |
| 971 | rt_free(subset); |
| 972 | } |
| 973 | else |
| 974 | error = -RT_ENOMEM; |
| 975 | } |
| 976 | else |
| 977 | error = -RT_EPERM; |
| 978 | |
| 979 | return error; |
| 980 | } |
| 981 | |
| 982 | /* remove overlapped pages from varea */ |
| 983 | static int _remove_overlapped_varea(rt_varea_t existed, char *unmap_start, rt_size_t unmap_len) |
no test coverage detected