| 257 | } |
| 258 | |
| 259 | static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) |
| 260 | { |
| 261 | size_t l1_off, l2_off; |
| 262 | size_t *mmu_l1, *mmu_l2; |
| 263 | size_t find_off = 0; |
| 264 | size_t find_va = 0; |
| 265 | int n = 0; |
| 266 | |
| 267 | if (!pages) |
| 268 | { |
| 269 | return 0; |
| 270 | } |
| 271 | |
| 272 | if (!mmu_info) |
| 273 | { |
| 274 | return 0; |
| 275 | } |
| 276 | |
| 277 | for (l1_off = mmu_info->vstart; l1_off <= mmu_info->vend; l1_off++) |
| 278 | { |
| 279 | mmu_l1 = (size_t*)mmu_info->vtable + l1_off; |
| 280 | if (*mmu_l1 & ARCH_MMU_USED_MASK) |
| 281 | { |
| 282 | mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off); |
| 283 | for (l2_off = 0; l2_off < (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE); l2_off++) |
| 284 | { |
| 285 | if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK) |
| 286 | { |
| 287 | /* in use */ |
| 288 | n = 0; |
| 289 | } |
| 290 | else |
| 291 | { |
| 292 | if (!n) |
| 293 | { |
| 294 | find_va = l1_off; |
| 295 | find_off = l2_off; |
| 296 | } |
| 297 | n++; |
| 298 | if (n >= pages) |
| 299 | { |
| 300 | return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT); |
| 301 | } |
| 302 | } |
| 303 | } |
| 304 | } |
| 305 | else |
| 306 | { |
| 307 | if (!n) |
| 308 | { |
| 309 | find_va = l1_off; |
| 310 | find_off = 0; |
| 311 | } |
| 312 | n += (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE); |
| 313 | if (n >= pages) |
| 314 | { |
| 315 | return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT); |
| 316 | } |
no outgoing calls
no test coverage detected