| 5946 | int unmapped_buf_allowed = 1; |
| 5947 | |
| 5948 | void |
| 5949 | pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], |
| 5950 | vm_offset_t b_offset, int xfersize) |
| 5951 | { |
| 5952 | pt2_entry_t *cmap1_pte2p, *cmap2_pte2p; |
| 5953 | vm_page_t a_pg, b_pg; |
| 5954 | char *a_cp, *b_cp; |
| 5955 | vm_offset_t a_pg_offset, b_pg_offset; |
| 5956 | struct pcpu *pc; |
| 5957 | int cnt; |
| 5958 | |
| 5959 | sched_pin(); |
| 5960 | pc = get_pcpu(); |
| 5961 | cmap1_pte2p = pc->pc_cmap1_pte2p; |
| 5962 | cmap2_pte2p = pc->pc_cmap2_pte2p; |
| 5963 | mtx_lock(&pc->pc_cmap_lock); |
| 5964 | if (pte2_load(cmap1_pte2p) != 0) |
| 5965 | panic("pmap_copy_pages: CMAP1 busy"); |
| 5966 | if (pte2_load(cmap2_pte2p) != 0) |
| 5967 | panic("pmap_copy_pages: CMAP2 busy"); |
| 5968 | while (xfersize > 0) { |
| 5969 | a_pg = ma[a_offset >> PAGE_SHIFT]; |
| 5970 | a_pg_offset = a_offset & PAGE_MASK; |
| 5971 | cnt = min(xfersize, PAGE_SIZE - a_pg_offset); |
| 5972 | b_pg = mb[b_offset >> PAGE_SHIFT]; |
| 5973 | b_pg_offset = b_offset & PAGE_MASK; |
| 5974 | cnt = min(cnt, PAGE_SIZE - b_pg_offset); |
| 5975 | pte2_store(cmap1_pte2p, PTE2_KERN_NG(VM_PAGE_TO_PHYS(a_pg), |
| 5976 | PTE2_AP_KR | PTE2_NM, vm_page_pte2_attr(a_pg))); |
| 5977 | tlb_flush_local((vm_offset_t)pc->pc_cmap1_addr); |
| 5978 | pte2_store(cmap2_pte2p, PTE2_KERN_NG(VM_PAGE_TO_PHYS(b_pg), |
| 5979 | PTE2_AP_KRW, vm_page_pte2_attr(b_pg))); |
| 5980 | tlb_flush_local((vm_offset_t)pc->pc_cmap2_addr); |
| 5981 | a_cp = pc->pc_cmap1_addr + a_pg_offset; |
| 5982 | b_cp = pc->pc_cmap2_addr + b_pg_offset; |
| 5983 | bcopy(a_cp, b_cp, cnt); |
| 5984 | a_offset += cnt; |
| 5985 | b_offset += cnt; |
| 5986 | xfersize -= cnt; |
| 5987 | } |
| 5988 | pte2_clear(cmap1_pte2p); |
| 5989 | tlb_flush((vm_offset_t)pc->pc_cmap1_addr); |
| 5990 | pte2_clear(cmap2_pte2p); |
| 5991 | tlb_flush((vm_offset_t)pc->pc_cmap2_addr); |
| 5992 | sched_unpin(); |
| 5993 | mtx_unlock(&pc->pc_cmap_lock); |
| 5994 | } |
| 5995 | |
| 5996 | vm_offset_t |
| 5997 | pmap_quick_enter_page(vm_page_t m) |
nothing calls this directly
no test coverage detected