MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_copy_pages

Function pmap_copy_pages

freebsd/mips/mips/pmap.c:2680–2723  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2678int unmapped_buf_allowed;
2679
2680void
2681pmap_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
2725vm_offset_t
2726pmap_quick_enter_page(vm_page_t m)

Callers 1

vn_io_fault_pgmoveFunction · 0.50

Calls 4

minFunction · 0.85
pmap_flush_pvcacheFunction · 0.85
pmap_lmem_map2Function · 0.85
pmap_lmem_unmapFunction · 0.85

Tested by

no test coverage detected