Deleted Added
full compact
26c26
< * $Id: kern_exec.c,v 1.72 1997/12/27 02:56:21 bde Exp $
---
> * $Id: kern_exec.c,v 1.73 1998/01/06 05:15:34 dyson Exp $
56a57
> #include <vm/vm_page.h>
61a63,64
> #include <vm/vm_pager.h>
> #include <vm/vm_pageout.h>
67c70,72
< static int exec_check_permissions(struct image_params *);
---
> static int exec_check_permissions __P((struct image_params *));
> static int exec_map_first_page __P((struct image_params *));
> static void exec_unmap_first_page __P((struct image_params *));
117d121
< imgp->image_header = NULL;
124a129,130
> imgp->vp = NULL;
> imgp->firstpage = NULL;
130c136
< imgp->stringbase = (char *)kmem_alloc_wait(exec_map, ARG_MAX);
---
> imgp->stringbase = (char *)kmem_alloc_wait(exec_map, ARG_MAX + PAGE_SIZE);
136a143
> imgp->image_header = imgp->stringbase + ARG_MAX;
150c157,158
< kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase, ARG_MAX);
---
> kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase,
> ARG_MAX + PAGE_SIZE);
165,196c173
< /*
< * Get the image header, which we define here as meaning the first
< * page of the executable.
< */
< if (imgp->vp->v_object && imgp->vp->v_mount &&
< imgp->vp->v_mount->mnt_stat.f_iosize >= PAGE_SIZE &&
< imgp->vp->v_object->un_pager.vnp.vnp_size >=
< imgp->vp->v_mount->mnt_stat.f_iosize) {
< /*
< * Get a buffer with (at least) the first page.
< */
< error = bread(imgp->vp, 0, imgp->vp->v_mount->mnt_stat.f_iosize,
< p->p_ucred, &bp);
< imgp->image_header = bp->b_data;
< } else {
< int resid;
<
< /*
< * The filesystem block size is too small, so do this the hard
< * way. Malloc some space and read PAGE_SIZE worth of the image
< * header into it.
< */
< imgp->image_header = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
< error = vn_rdwr(UIO_READ, imgp->vp,
< (void *)imgp->image_header, PAGE_SIZE, 0,
< UIO_SYSSPACE, IO_NODELOCKED, p->p_ucred, &resid, p);
< /*
< * Clear out any remaining junk.
< */
< if (!error && resid)
< bzero((char *)imgp->image_header + PAGE_SIZE - resid, resid);
< }
---
> error = exec_map_first_page(imgp);
219,225c196
< /* free old bp/image_header */
< if (bp != NULL) {
< brelse(bp);
< bp = NULL;
< } else
< free((void *)imgp->image_header, M_TEMP);
< imgp->image_header = NULL;
---
> exec_unmap_first_page(imgp);
353a325,326
> exec_fail_dealloc:
>
357,363c330,331
< kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase, ARG_MAX);
< if (bp != NULL)
< brelse(bp);
< else if (imgp->image_header != NULL)
< free((void *)imgp->image_header, M_TEMP);
< vrele(ndp->ni_vp);
< zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
---
> if (imgp->firstpage)
> exec_unmap_first_page(imgp);
365,367d332
< return (0);
<
< exec_fail_dealloc:
369,373c334,336
< kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase, ARG_MAX);
< if (bp != NULL)
< brelse(bp);
< else if (imgp->image_header != NULL)
< free((void *)imgp->image_header, M_TEMP);
---
> kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase,
> ARG_MAX + PAGE_SIZE);
>
378a342,344
> if (error == 0)
> return (0);
>
389a356,420
> int
> exec_map_first_page(imgp)
> struct image_params *imgp;
> {
> int s;
> vm_page_t m;
> vm_object_t object;
>
>
> if (imgp->firstpage) {
> exec_unmap_first_page(imgp);
> }
>
> object = imgp->vp->v_object;
> s = splvm();
>
> retry:
> m = vm_page_lookup(object, 0);
> if (m == NULL) {
> m = vm_page_alloc(object, 0, VM_ALLOC_NORMAL);
> if (m == NULL) {
> VM_WAIT;
> goto retry;
> }
> } else if ((m->flags & PG_BUSY) || m->busy) {
> m->flags |= PG_WANTED;
> tsleep(m, PVM, "execpw", 0);
> goto retry;
> }
>
> m->flags |= PG_BUSY;
>
> if ((m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL) {
> int rv;
> rv = vm_pager_get_pages(object, &m, 1, 0);
> if (rv != VM_PAGER_OK) {
> vm_page_protect(m, VM_PROT_NONE);
> vm_page_deactivate(m);
> PAGE_WAKEUP(m);
> splx(s);
> return EIO;
> }
> }
>
> vm_page_wire(m);
> PAGE_WAKEUP(m);
> splx(s);
>
> pmap_kenter((vm_offset_t) imgp->image_header, VM_PAGE_TO_PHYS(m));
> imgp->firstpage = m;
>
> return 0;
> }
>
> void
> exec_unmap_first_page(imgp)
> struct image_params *imgp;
> {
> if (imgp->firstpage) {
> pmap_kremove((vm_offset_t) imgp->image_header);
> vm_page_unwire(imgp->firstpage);
> imgp->firstpage = NULL;
> }
> }
>
423,424c454,456
< error = vm_map_find(map, NULL, 0, (vm_offset_t *)&stack_addr,
< SGROWSIZ, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0);
---
> error = vm_map_insert(&vmspace->vm_map, NULL, 0,
> (vm_offset_t) stack_addr, (vm_offset_t) USRSTACK,
> VM_PROT_ALL, VM_PROT_ALL, 0);
426c458
< return(error);
---
> return (error);