| 2678 | int unmapped_buf_allowed; |
| 2679 | |
| 2680 | void |
| 2681 | pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], |
| 2682 | vm_offset_t b_offset, int xfersize) |
| 2683 | { |
| 2684 | char *a_cp, *b_cp; |
| 2685 | vm_page_t a_m, b_m; |
| 2686 | vm_offset_t a_pg_offset, b_pg_offset; |
| 2687 | vm_paddr_t a_phys, b_phys; |
| 2688 | int cnt; |
| 2689 | |
| 2690 | while (xfersize > 0) { |
| 2691 | a_pg_offset = a_offset & PAGE_MASK; |
| 2692 | cnt = min(xfersize, PAGE_SIZE - a_pg_offset); |
| 2693 | a_m = ma[a_offset >> PAGE_SHIFT]; |
| 2694 | a_phys = VM_PAGE_TO_PHYS(a_m); |
| 2695 | b_pg_offset = b_offset & PAGE_MASK; |
| 2696 | cnt = min(cnt, PAGE_SIZE - b_pg_offset); |
| 2697 | b_m = mb[b_offset >> PAGE_SHIFT]; |
| 2698 | b_phys = VM_PAGE_TO_PHYS(b_m); |
| 2699 | if (MIPS_DIRECT_MAPPABLE(a_phys) && |
| 2700 | MIPS_DIRECT_MAPPABLE(b_phys)) { |
| 2701 | pmap_flush_pvcache(a_m); |
| 2702 | mips_dcache_wbinv_range_index( |
| 2703 | MIPS_PHYS_TO_DIRECT(b_phys), PAGE_SIZE); |
| 2704 | a_cp = (char *)MIPS_PHYS_TO_DIRECT(a_phys) + |
| 2705 | a_pg_offset; |
| 2706 | b_cp = (char *)MIPS_PHYS_TO_DIRECT(b_phys) + |
| 2707 | b_pg_offset; |
| 2708 | bcopy(a_cp, b_cp, cnt); |
| 2709 | mips_dcache_wbinv_range((vm_offset_t)b_cp, cnt); |
| 2710 | } else { |
| 2711 | a_cp = (char *)pmap_lmem_map2(a_phys, b_phys); |
| 2712 | b_cp = (char *)a_cp + PAGE_SIZE; |
| 2713 | a_cp += a_pg_offset; |
| 2714 | b_cp += b_pg_offset; |
| 2715 | bcopy(a_cp, b_cp, cnt); |
| 2716 | mips_dcache_wbinv_range((vm_offset_t)b_cp, cnt); |
| 2717 | pmap_lmem_unmap(); |
| 2718 | } |
| 2719 | a_offset += cnt; |
| 2720 | b_offset += cnt; |
| 2721 | xfersize -= cnt; |
| 2722 | } |
| 2723 | } |
| 2724 | |
| 2725 | vm_offset_t |
| 2726 | pmap_quick_enter_page(vm_page_t m) |
no test coverage detected