remove overlapped pages from varea */
| 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) |
| 984 | { |
| 985 | int error; |
| 986 | char *ex_start = existed->start; |
| 987 | char *ex_end = ex_start + existed->size; |
| 988 | char *unmap_end = unmap_start + unmap_len; |
| 989 | |
| 990 | if (ex_start < unmap_start) |
| 991 | { |
| 992 | if (ex_end > unmap_end) |
| 993 | error = _split_varea(existed, ex_end, unmap_start, unmap_end, unmap_len); |
| 994 | else |
| 995 | error = _shrink_varea(existed, ex_start, unmap_start - ex_start); |
| 996 | } |
| 997 | else if (ex_end > unmap_end) |
| 998 | error = _shrink_varea(existed, unmap_end, ex_end - unmap_end); |
| 999 | else |
| 1000 | { |
| 1001 | _varea_uninstall_locked(existed); |
| 1002 | if (VAREA_NOT_STATIC(existed)) |
| 1003 | { |
| 1004 | rt_free(existed); |
| 1005 | } |
| 1006 | error = RT_EOK; |
| 1007 | } |
| 1008 | |
| 1009 | return error; |
| 1010 | } |
| 1011 | |
| 1012 | static int _unmap_range_locked(rt_aspace_t aspace, void *addr, size_t length) |
| 1013 | { |
no test coverage detected