/* * Move pages from one kernel virtual address to another. * Both addresses are assumed to reside in the Sysmap. */ void pagemove(caddr_t from, caddr_t to, size_t size) { pt_entry_t *fpte, *tpte, *mafpte, *matpte; pt_entry_t ofpte, otpte; #ifdef MULTIPROCESSOR u_int32_t cpumask = 0; #endif #ifdef DIAGNOSTIC if ((size & PAGE_MASK) != 0) panic("pagemove"); #endif fpte = kvtopte((vaddr_t)from); tpte = kvtopte((vaddr_t)to); while (size > 0) { mafpte = (pt_entry_t *)vtomach((vaddr_t)fpte); matpte = (pt_entry_t *)vtomach((vaddr_t)tpte); otpte = pte_atomic_update(tpte, matpte, *fpte); ofpte = pte_atomic_update(fpte, mafpte, 0); tpte++; fpte++; #if defined(I386_CPU) && !defined(MULTIPROCESSOR) if (cpu_class != CPUCLASS_386) #endif { if (otpte & PG_V) #ifdef MULTIPROCESSOR pmap_tlb_shootdown(pmap_kernel(), (vaddr_t)to, otpte, &cpumask); #else pmap_update_pg((vaddr_t)to); #endif if (ofpte & PG_V) #ifdef MULTIPROCESSOR pmap_tlb_shootdown(pmap_kernel(), (vaddr_t)from, ofpte, &cpumask); #else pmap_update_pg((vaddr_t)from); #endif } from += PAGE_SIZE; to += PAGE_SIZE; size -= PAGE_SIZE; } #ifdef MULTIPROCESSOR pmap_tlb_shootnow(cpumask); #else #if defined(I386_CPU) if (cpu_class == CPUCLASS_386) tlbflush(); #endif #endif }
/* * Move pages from one kernel virtual address to another. * Both addresses are assumed to reside in the Sysmap. */ void pagemove(caddr_t from, caddr_t to, size_t size) { pt_entry_t *fpte, *tpte, ofpte, otpte; int32_t cpumask = 0; #ifdef DIAGNOSTIC if ((size & PAGE_MASK) != 0) panic("pagemove"); #endif fpte = kvtopte((vaddr_t)from); tpte = kvtopte((vaddr_t)to); #ifdef LARGEPAGES /* XXX For now... */ if (*fpte & PG_PS) panic("pagemove: fpte PG_PS"); if (*tpte & PG_PS) panic("pagemove: tpte PG_PS"); #endif while (size > 0) { otpte = *tpte; ofpte = *fpte; *tpte++ = *fpte; *fpte++ = 0; if (otpte & PG_V) pmap_tlb_shootdown(pmap_kernel(), (vaddr_t)to, otpte, &cpumask); if (ofpte & PG_V) pmap_tlb_shootdown(pmap_kernel(), (vaddr_t)from, ofpte, &cpumask); from += PAGE_SIZE; to += PAGE_SIZE; size -= PAGE_SIZE; } pmap_tlb_shootnow(cpumask); }