| 321 | |
| 322 | #ifdef RT_USING_SMART |
| 323 | static int check_vaddr(rt_mmu_info *mmu_info, void *va, int pages) |
| 324 | { |
| 325 | size_t loop_va = (size_t)va & ~ARCH_PAGE_MASK; |
| 326 | size_t l1_off, l2_off; |
| 327 | size_t *mmu_l1, *mmu_l2; |
| 328 | |
| 329 | if (!pages) |
| 330 | { |
| 331 | return -1; |
| 332 | } |
| 333 | |
| 334 | if (!mmu_info) |
| 335 | { |
| 336 | return -1; |
| 337 | } |
| 338 | |
| 339 | while (pages--) |
| 340 | { |
| 341 | l1_off = (loop_va >> ARCH_SECTION_SHIFT); |
| 342 | l2_off = ((loop_va & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT); |
| 343 | mmu_l1 = (size_t*)mmu_info->vtable + l1_off; |
| 344 | |
| 345 | if (*mmu_l1 & ARCH_MMU_USED_MASK) |
| 346 | { |
| 347 | mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off); |
| 348 | if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK) |
| 349 | { |
| 350 | return -1; |
| 351 | } |
| 352 | } |
| 353 | loop_va += ARCH_PAGE_SIZE; |
| 354 | } |
| 355 | return 0; |
| 356 | } |
| 357 | #endif |
| 358 | |
| 359 | static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t npages) |
no outgoing calls
no test coverage detected