/* * pmap_copy_page copies the specified (machine independent) pages. */ void pmap_copy_part_page( ppnum_t psrc, vm_offset_t src_offset, ppnum_t pdst, vm_offset_t dst_offset, vm_size_t len) { pmap_paddr_t src, dst; assert(psrc != vm_page_fictitious_addr); assert(pdst != vm_page_fictitious_addr); assert(psrc != vm_page_guard_addr); assert(pdst != vm_page_guard_addr); src = i386_ptob(psrc); dst = i386_ptob(pdst); assert((((uintptr_t)dst & PAGE_MASK) + dst_offset + len) <= PAGE_SIZE); assert((((uintptr_t)src & PAGE_MASK) + src_offset + len) <= PAGE_SIZE); bcopy_phys((addr64_t)src + (src_offset & INTEL_OFFMASK), (addr64_t)dst + (dst_offset & INTEL_OFFMASK), len); }
/* * pmap_zero_page zeros the specified (machine independent) page. */ void pmap_zero_page( ppnum_t pn) { assert(pn != vm_page_fictitious_addr); assert(pn != vm_page_guard_addr); bzero_phys((addr64_t)i386_ptob(pn), PAGE_SIZE); }
/* * pmap_zero_part_page * zeros the specified (machine independent) part of a page. */ void pmap_zero_part_page( ppnum_t pn, vm_offset_t offset, vm_size_t len) { assert(pn != vm_page_fictitious_addr); assert(pn != vm_page_guard_addr); assert(offset + len <= PAGE_SIZE); bzero_phys((addr64_t)(i386_ptob(pn) + offset), (uint32_t)len); }
void fillPage(ppnum_t pa, unsigned int fill) { mapwindow_t *map; pmap_paddr_t src; int i; int cnt = PAGE_SIZE/sizeof(unsigned int); unsigned int *addr; mp_disable_preemption(); src = i386_ptob(pa); map = pmap_get_mapwindow((pt_entry_t)(INTEL_PTE_VALID | INTEL_PTE_RW | (src & PG_FRAME) | INTEL_PTE_REF | INTEL_PTE_MOD)); for (i = 0, addr = (unsigned int *)map->prv_CADDR; i < cnt ; i++ ) *addr++ = fill; pmap_put_mapwindow(map); mp_enable_preemption(); }