| 252 | } |
| 253 | |
| 254 | static void _next_free_region(struct rt_mmblk_reg **m, struct rt_mmblk_reg **r, mmblk_flag_t flags, |
| 255 | rt_size_t *out_start, rt_size_t *out_end) |
| 256 | { |
| 257 | /* memory related data */ |
| 258 | rt_size_t m_start = 0; |
| 259 | rt_size_t m_end = 0; |
| 260 | |
| 261 | /* reserved related data */ |
| 262 | rt_size_t r_start = 0; |
| 263 | rt_size_t r_end = 0; |
| 264 | struct rt_mmblk_reg *r_sentinel = rt_slist_entry(&(mmblk_reserved.reg_list), struct rt_mmblk_reg, node); |
| 265 | |
| 266 | for (; *m != RT_NULL; *m = _next_region(*m)) |
| 267 | { |
| 268 | if ((*m)->flags != flags) |
| 269 | continue; |
| 270 | |
| 271 | m_start = (*m)->memreg.start; |
| 272 | m_end = (*m)->memreg.end; |
| 273 | |
| 274 | for (; *r != RT_NULL; *r = _next_region(*r)) |
| 275 | { |
| 276 | /* |
| 277 | * r started with _resreg_guard |
| 278 | * Find the complement of reserved memblock. |
| 279 | * For example, if reserved memblock is following: |
| 280 | * |
| 281 | * 0:[8-16), 1:[32-48), 2:[128-130) |
| 282 | * |
| 283 | * The upper 32bit indexes the following regions. |
| 284 | * |
| 285 | * 0:[0-8), 1:[16-32), 2:[48-128), 3:[130-MAX) |
| 286 | * |
| 287 | * So we can find intersecting region other than excluding. |
| 288 | */ |
| 289 | r_start = (*r == r_sentinel) ? 0 : (*r)->memreg.end; |
| 290 | r_end = (_next_region(*r)) ? _next_region(*r)->memreg.start : PHYS_ADDR_MAX; |
| 291 | |
| 292 | /* two reserved region are adjacent */ |
| 293 | if (r_start == r_end) |
| 294 | continue; |
| 295 | |
| 296 | if (r_start >= m_end) |
| 297 | break; |
| 298 | |
| 299 | if (m_start < r_end) |
| 300 | { |
| 301 | *out_start = MAX(m_start, r_start); |
| 302 | *out_end = MIN(m_end, r_end); |
| 303 | |
| 304 | if (m_end <= r_end) |
| 305 | *m = _next_region(*m); |
| 306 | else |
| 307 | *r = _next_region(*r); |
| 308 | return; |
| 309 | } |
| 310 | } |
| 311 | } |
no test coverage detected