| 482 | |
| 483 | #ifdef RT_USING_SMART |
| 484 | void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) |
| 485 | { |
| 486 | size_t pa_s, pa_e; |
| 487 | size_t vaddr; |
| 488 | int pages; |
| 489 | int ret; |
| 490 | |
| 491 | if (!size) |
| 492 | { |
| 493 | return 0; |
| 494 | } |
| 495 | pa_s = (size_t)p_addr; |
| 496 | pa_e = (size_t)p_addr + size - 1; |
| 497 | pa_s >>= ARCH_PAGE_SHIFT; |
| 498 | pa_e >>= ARCH_PAGE_SHIFT; |
| 499 | pages = pa_e - pa_s + 1; |
| 500 | if (v_addr) |
| 501 | { |
| 502 | vaddr = (size_t)v_addr; |
| 503 | pa_s = (size_t)p_addr; |
| 504 | if ((vaddr & ARCH_PAGE_MASK) != (pa_s & ARCH_PAGE_MASK)) |
| 505 | { |
| 506 | return 0; |
| 507 | } |
| 508 | vaddr &= ~ARCH_PAGE_MASK; |
| 509 | if (check_vaddr(mmu_info, (void*)vaddr, pages) != 0) |
| 510 | { |
| 511 | return 0; |
| 512 | } |
| 513 | } |
| 514 | else |
| 515 | { |
| 516 | vaddr = find_vaddr(mmu_info, pages); |
| 517 | } |
| 518 | if (vaddr) { |
| 519 | ret = __rt_hw_mmu_map(mmu_info, (void*)vaddr, p_addr, pages, attr); |
| 520 | if (ret == 0) |
| 521 | { |
| 522 | rt_hw_cpu_tlb_invalidate(); |
| 523 | return (void*)(vaddr + ((size_t)p_addr & ARCH_PAGE_MASK)); |
| 524 | } |
| 525 | } |
| 526 | return 0; |
| 527 | } |
| 528 | #else |
| 529 | void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t attr) |
| 530 | { |
no test coverage detected