[*start_reg, *end_reg) is the isolated range */
| 177 | |
| 178 | /* [*start_reg, *end_reg) is the isolated range */ |
| 179 | static rt_err_t _memblock_separate_range(struct rt_memblock *memblock, |
| 180 | rt_size_t start, rt_size_t end, |
| 181 | struct rt_mmblk_reg **start_reg, struct rt_mmblk_reg **end_reg) |
| 182 | { |
| 183 | struct rt_mmblk_reg *reg = RT_NULL; |
| 184 | rt_region_t new_region; |
| 185 | rt_err_t err = RT_EOK; |
| 186 | |
| 187 | *start_reg = *end_reg = RT_NULL; |
| 188 | |
| 189 | rt_slist_for_each_entry(reg, &(memblock->reg_list), node) |
| 190 | { |
| 191 | rt_size_t rstart = reg->memreg.start; |
| 192 | rt_size_t rend = reg->memreg.end; |
| 193 | |
| 194 | if (rstart >= end) |
| 195 | break; |
| 196 | if (rend <= start) |
| 197 | continue; |
| 198 | |
| 199 | /* the beginning of the range separates its respective region */ |
| 200 | if (rstart < start) |
| 201 | { |
| 202 | new_region.start = start; |
| 203 | new_region.end = rend; |
| 204 | new_region.name = reg->memreg.name; |
| 205 | err = _reg_insert_after(reg, &new_region, reg->flags); |
| 206 | |
| 207 | if (err != RT_EOK) |
| 208 | return err; |
| 209 | |
| 210 | reg->memreg.end = start; |
| 211 | |
| 212 | *start_reg = _next_region(reg); |
| 213 | *end_reg = _next_region(*start_reg); |
| 214 | } |
| 215 | /* the endpoint of the range separates its respective region */ |
| 216 | else if (rend > end) |
| 217 | { |
| 218 | new_region.start = end; |
| 219 | new_region.end = rend; |
| 220 | new_region.name = reg->memreg.name; |
| 221 | err = _reg_insert_after(reg, &new_region, reg->flags); |
| 222 | |
| 223 | if (err != RT_EOK) |
| 224 | return err; |
| 225 | |
| 226 | reg->memreg.end = end; |
| 227 | |
| 228 | *end_reg = _next_region(reg); |
| 229 | break; |
| 230 | } |
| 231 | /* reg->next is fully contained in range */ |
| 232 | else |
| 233 | { |
| 234 | if (!*end_reg) |
| 235 | *start_reg = reg; |
| 236 | *end_reg = _next_region(reg); |
no test coverage detected