diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c index f01a6c1a048e..3da5f99e0efd 100644 --- a/sys/kern/imgact_aout.c +++ b/sys/kern/imgact_aout.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: imgact_aout.c,v 1.50 1999/05/09 16:04:06 peter Exp $ + * $Id: imgact_aout.c,v 1.51 1999/05/14 23:09:00 alc Exp $ */ #include @@ -190,7 +190,7 @@ exec_aout_imgact(imgp) file_offset, virtual_offset, text_end, VM_PROT_READ | VM_PROT_EXECUTE, VM_PROT_ALL, - MAP_COPY_ON_WRITE); + MAP_COPY_ON_WRITE | MAP_PREFAULT); if (error) { vm_map_unlock(map); return (error); @@ -202,17 +202,13 @@ exec_aout_imgact(imgp) file_offset + a_out->a_text, text_end, data_end, VM_PROT_ALL, VM_PROT_ALL, - MAP_COPY_ON_WRITE); + MAP_COPY_ON_WRITE | MAP_PREFAULT); if (error) { vm_map_unlock(map); return (error); } } - pmap_object_init_pt(vm_map_pmap(map), virtual_offset, - object, (vm_pindex_t) OFF_TO_IDX(file_offset), - a_out->a_text + a_out->a_data, 0); - if (bss_size) { error = vm_map_insert(map, NULL, 0, data_end, data_end + bss_size, diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 2934b94834bb..e3cceb35b99b 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -26,7 +26,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: imgact_elf.c,v 1.56 1999/05/09 16:04:08 peter Exp $ + * $Id: imgact_elf.c,v 1.57 1999/05/14 23:09:00 alc Exp $ */ #include "opt_rlimit.h" @@ -220,19 +220,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o map_addr + map_len,/* virtual end */ prot, VM_PROT_ALL, - MAP_COPY_ON_WRITE); + MAP_COPY_ON_WRITE | MAP_PREFAULT); vm_map_unlock(&vmspace->vm_map); if (rv != KERN_SUCCESS) return EINVAL; - /* prefault the page tables */ - pmap_object_init_pt(vmspace_pmap(vmspace), - map_addr, - object, - (vm_pindex_t) OFF_TO_IDX(file_addr), - map_len, - 0); - /* we can stop now if we've covered it all */ if (memsz == filsz) return 0; @@ -270,14 +262,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o TRUE, VM_PROT_READ, VM_PROT_ALL, - MAP_COPY_ON_WRITE); + MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL); if (rv != KERN_SUCCESS) { vm_object_deallocate(object); return EINVAL; } - pmap_object_init_pt(exec_map->pmap, data_buf, object, - (vm_pindex_t) OFF_TO_IDX(trunc_page(offset + filsz)), - PAGE_SIZE, 1); /* send the page fragment to user space */ error = copyout((caddr_t)data_buf, (caddr_t)map_addr, copy_len); diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index d9c3f04ad20d..882a81bcb620 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_map.c,v 1.161 1999/05/14 23:09:32 alc Exp $ + * $Id: vm_map.c,v 1.162 1999/05/16 05:07:31 alc Exp $ */ /* @@ -561,6 +561,11 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset, (prev_entry->end >= new_entry->start)) map->first_free = new_entry; + if (cow & (MAP_PREFAULT|MAP_PREFAULT_PARTIAL)) + pmap_object_init_pt(map->pmap, start, + object, OFF_TO_IDX(offset), end - start, + cow & MAP_PREFAULT_PARTIAL); + return (KERN_SUCCESS); } diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index 2f07515f5ef3..cb9bb12cafd3 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_map.h,v 1.39 1999/05/14 23:09:34 alc Exp $ + * $Id: vm_map.h,v 1.40 1999/05/16 05:07:33 alc Exp $ */ /* @@ -308,6 +308,8 @@ vmspace_resident_count(struct vmspace *vmspace) #define MAP_UNUSED_01 0x1 #define MAP_COPY_ON_WRITE 0x2 #define MAP_NOFAULT 0x4 +#define MAP_PREFAULT 0x8 +#define MAP_PREFAULT_PARTIAL 0x10 /* * vm_fault option flags diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index bab89127c05d..b7631288869d 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -38,7 +38,7 @@ * from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$ * * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 - * $Id: vm_mmap.c,v 1.97 1999/05/14 23:09:34 alc Exp $ + * $Id: vm_mmap.c,v 1.98 1999/05/16 05:07:33 alc Exp $ */ /* @@ -1035,7 +1035,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, docow = 0; if ((flags & (MAP_ANON|MAP_SHARED)) == 0) { - docow = MAP_COPY_ON_WRITE; + docow = MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL; } #if defined(VM_PROT_READ_IS_EXEC) @@ -1067,14 +1067,6 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, goto out; } - /* - * "Pre-fault" resident pages. - */ - if ((map->pmap != NULL) && (object != NULL)) { - pmap_object_init_pt(map->pmap, *addr, - object, (vm_pindex_t) OFF_TO_IDX(foff), size, 1); - } - /* * Shared memory is also shared with children. */